[image] RGB 색상의 밝기를 결정하는 공식

RGB 값이 주어진 색상의 밝기를 결정하는 일종의 수식이나 알고리즘을 찾고 있습니다. RGB 값을 합산하고 더 높은 합계를 갖는 것만 큼 간단하지는 않지만 어디서부터 시작 해야할지에 대한 손실이 있습니다.



답변

밝기를 의미합니까? 지각 된 밝기? 휘도?

  • 휘도 (특정 색 공간에 대한 표준) : (0.2126*R + 0.7152*G + 0.0722*B) [1]
  • 휘도 (지각 옵션 1) : (0.299*R + 0.587*G + 0.114*B) [2]
  • 휘도 (옵션 2로 인식, 계산 속도가 느림) : sqrt( 0.241*R^2 + 0.691*G^2 + 0.068*B^2 )sqrt( 0.299*R^2 + 0.587*G^2 + 0.114*B^2 )( @MatthewHerbst 덕분에 ) [3]

답변

나는 당신이 찾고있는 것이 RGB-> Luma 변환 공식 이라고 생각합니다 .

광도 / 디지털 ITU BT.709 :

Y = 0.2126 R + 0.7152 G + 0.0722 B

디지털 ITU BT.601 (R 및 B 구성 요소에 더 많은 무게를 제공) :

Y = 0.299 R + 0.587 G + 0.114 B

성능에 대한 정확성을 기꺼이 교환하려는 경우 다음 두 가지 근사 공식이 있습니다.

Y = 0.33 R + 0.5 G + 0.16 B

Y = 0.375 R + 0.5 G + 0.125 B

이들은 다음과 같이 빠르게 계산할 수 있습니다

Y = (R+R+B+G+G+G)/6

Y = (R+R+R+B+G+G+G+G)>>3


답변

허용 된 답변에서 세 가지 알고리즘을 비교했습니다. 약 400 번째 색상 만 사용하는 주기로 색상을 생성했습니다. 각 색상은 2×2 픽셀로 표시되며 가장 어두운 색상부터 가장 밝은 색상 (왼쪽에서 오른쪽, 위에서 아래로)으로 정렬됩니다.

첫 번째 그림- 휘도 (상대)

0.2126 * R + 0.7152 * G + 0.0722 * B

두 번째 사진-http: //www.w3.org/TR/AERT#color-contrast

0.299 * R + 0.587 * G + 0.114 * B

3 번째 사진 -HSP 컬러 모델

sqrt(0.299 * R^2 + 0.587 * G^2 + 0.114 * B^2)

네 번째 사진 -WCAG 2.0 SC 1.4.3 상대 휘도명암비 공식 ( @Synchro의 답변은 여기 참조 )

한 행의 색상 수에 따라 첫 번째 및 두 번째 사진에서 패턴이 때때로 표시 될 수 있습니다. 3 번째 또는 4 번째 알고리즘에서 어떤 패턴도 발견하지 못했습니다.

내가 선택해야한다면 구현하기가 훨씬 쉽고 알고리즘보다 약 33 % 더 빠르기 때문에 알고리즘 번호 3을 사용합니다.

인식 된 밝기 알고리즘 비교


답변

아래는 브라우저 등에서 사용되는 sRGB 이미지를 그레이 스케일로 변환하는 유일한 CORRECT 알고리즘입니다.

내부 제품을 계산하기 전에 색상 공간에 대해 감마 함수의 역을 적용해야합니다. 그런 다음 감마 기능을 감소 된 값에 적용합니다. 감마 기능을 통합하지 않으면 최대 20 %의 오류가 발생할 수 있습니다.

일반적인 컴퓨터 작업의 경우 색 공간은 sRGB입니다. sRGB의 올바른 숫자는 약입니다. 0.21, 0.72, 0.07. sRGB 용 감마는 지수를 1 / (2.2)로 근사화하는 복합 함수입니다. 다음은 C ++의 모든 것입니다.

// sRGB luminance(Y) values
const double rY = 0.212655;
const double gY = 0.715158;
const double bY = 0.072187;

// Inverse of sRGB "gamma" function. (approx 2.2)
double inv_gam_sRGB(int ic) {
    double c = ic/255.0;
    if ( c <= 0.04045 )
        return c/12.92;
    else
        return pow(((c+0.055)/(1.055)),2.4);
}

// sRGB "gamma" function (approx 2.2)
int gam_sRGB(double v) {
    if(v<=0.0031308)
        v *= 12.92;
    else
        v = 1.055*pow(v,1.0/2.4)-0.055;
    return int(v*255+0.5); // This is correct in C++. Other languages may not
                           // require +0.5
}

// GRAY VALUE ("brightness")
int gray(int r, int g, int b) {
    return gam_sRGB(
            rY*inv_gam_sRGB(r) +
            gY*inv_gam_sRGB(g) +
            bY*inv_gam_sRGB(b)
    );
}


답변

“허용 된”답변이 잘못되었거나 불완전합니다

정확한 답변은 @ jive-dadson@EddingtonsMonkey 답변이며 @ nils-pipenbrinck 지원 합니다. 다른 답변 (허용됨 포함) 은 잘못되었거나 관련이 없거나 쓸모 없거나 고장난 출처를 연결하거나 인용합니다.

간단히:

  • 계수를 적용하기 전에 sRGB를 LINEARIZED 해야합니다 .
  • 휘도 (L 또는 Y)는 빛과 같이 선형입니다.
  • 지각 된 밝기 (L *)는 인간의 지각과 마찬가지로 비선형입니다.
  • HSV와 HSL은 인식 측면에서 원격으로 정확하지도 않습니다.
  • sRGB에 대한 IEC 표준은 0.04045의 임계 값을 지정하며 0.03928이 아닙니다 (이전의 초기 초안에서 나온 것임).
  • 유용성 (즉 , 인식에 대한) , 유클리드 거리는 CIELAB와 같이 지각 적으로 균일 한 데카르트 벡터 공간을 필요로합니다. sRGB는 하나가 아닙니다.

다음은 정확하고 완전한 답변입니다.

이 스레드는 검색 엔진에 많이 나타나기 때문에 주제에 대한 다양한 오해를 명확히하기 위해이 답변을 추가하고 있습니다.

밝기 는 지각적인 속성이며 직접 측정 할 수 없습니다.

인식 된 밝기 는 CIELAB과 같은 일부 비전 모델에 의해 측정되며, 여기서 L * (Lstar)는 지각 밝기 의 측정치이며 인간의 비전 비선형 반응 곡선에 근접하기 위해 비선형입니다.

휘도 는 빛의 선형 측정으로, 보통 시력에 대해서는 스펙트럼 가중치를 적용하지만 밝기에 대한 비선형 인식에는 조정되지 않습니다.

루마 ( Y ‘ 프라임)는 일부 비디오 인코딩에 사용되는 감마 인코딩 된 가중치 신호입니다. 선형 휘도와 혼동되어서는 안됩니다.

감마 또는 전송 곡선 (TRC)은 종종 지각 곡선과 유사한 곡선이며, 일반적으로 저장 또는 방송을위한 이미지 데이터에 적용되어인지 된 잡음을 감소시키고 / 시키거나 데이터 이용률 (및 관련 이유)을 개선합니다.

인식 된 밝기를 결정하려면 먼저 감마 인코딩 된 R´G´B ‘이미지 값을 선형 휘도 ( L또는 Y) 로 변환 한 다음 비선형 감지 밝기 ( L*)로 변환하십시오.


광휘를 찾으려면 :

… 어딘가에서 길을 잃었 기 때문에 …

1 단계 :

모든 sRGB 8 비트 정수 값을 10 진수 0.0-1.0으로 변환

  vR = sR / 255;
  vG = sG / 255;
  vB = sB / 255;

2 단계 :

감마 인코딩 RGB를 선형 값으로 변환합니다. 예를 들어 sRGB (컴퓨터 표준)에는 “정확한”변환이 다음과 같이 약 V ^ 2.2의 전력 곡선이 필요합니다.

sRGB에서 선형으로

여기서 V´는 sRGB의 감마 인코딩 된 R, G 또는 B 채널입니다.
의사 코드 :

function sRGBtoLin(colorChannel) {
        // Send this function a decimal sRGB gamma encoded color value
        // between 0.0 and 1.0, and it returns a linearized value.

    if ( colorChannel <= 0.04045 ) {
            return colorChannel / 12.92;
        } else {
            return pow((( colorChannel + 0.055)/1.055),2.4));
        }
    }

3 단계 :

휘도 (Y)를 찾으려면 sRGB에 대한 표준 계수를 적용하십시오.

계수 적용 Y = R * 0.2126 + G * 0.7152 + B * 0.0722

위 함수를 사용한 의사 코드 :

Y = (0.2126 * sRGBtoLin(vR) + 0.7152 * sRGBtoLin(vG) + 0.0722 * sRGBtoLin(vB))

인식 된 빛을 찾는 방법 :

4 단계 :

위에서 휘도 Y를 가져 와서 L *로 변환

Y 방정식의 L *
의사 코드 :

function YtoLstar(Y) {
        // Send this function a luminance value between 0.0 and 1.0,
        // and it returns L* which is "perceptual lightness"

    if ( Y <= (216/24389) {       // The CIE standard states 0.008856 but 216/24389 is the intent for 0.008856451679036
            return Y * (24389/27);  // The CIE standard states 903.3, but 24389/27 is the intent, making 903.296296296296296
        } else {
            return pow(Y,(1/3)) * 116 - 16;
        }
    }

L *는 0 (검정)에서 100 (흰색)까지의 값입니다. 여기서 50은 지각적인 “중간 회색”입니다. L * = 50은 Y = 18.4, 즉 사진 노출의 중간을 나타내는 18 % 그레이 카드와 같습니다 (Ansel Adams zone V).

참고 문헌 :

IEC 61966-2-1:1999 Standard
Wikipedia sRGB
Wikipedia CIELAB
Wikipedia CIEXYZ
Charles Poynton의 감마 FAQ


답변

색상의 “밝기”를 계산하는 훌륭한 작업을 수행하는 이 코드 (C #으로 작성)를 찾았습니다 . 이 시나리오에서 코드는 흰색 또는 검은 색 텍스트를 색상 위에 넣을지 여부를 결정하려고합니다.


답변

흥미롭게도 RGB => HSV에 대한이 공식 은 v = MAX3 (r, g, b) 만 사용합니다. 즉, 최대 (r, g, b)를 HSV의 V로 사용할 수 있습니다 .

나는 Hearn & Baker의 575 페이지에서 이것이 “가치”를 계산하는 방법입니다.

Hearn & Baker pg 319에서