RGB를 그레이 스케일 / 강도로 변환


129

RGB에서 그레이 스케일로 변환 할 때 R, G, B 채널에 대한 특정 가중치를 적용해야한다고합니다. 이러한 가중치는 0.2989, 0.5870, 0.1140입니다.

그 이유는이 세 가지 색에 대한 인간의 지각 / 감성이 다르기 때문이라고합니다. 때때로 이들은 NTSC 신호를 계산하는 데 사용되는 값이라고도합니다.

그러나 웹에서 이에 대한 좋은 참조를 찾지 못했습니다. 이러한 가치의 출처는 무엇입니까?

이전 질문 : 여기여기를 참조 하십시오 .


26
네 그렇습니다. 저는 항상 RGB 값으로 프로그래밍을합니다. 이 계산에 "실제"값을 적용하는 것은 앱의 가치가 있기를 원한다면 매우 중요합니다.
Neil N

1
많은 프로그래머가 "잘못된"그레이 스케일 그림을 신경 쓰지 않고 계산할 수 있지만 저는 그렇게합니다.
ypnos

6
나는 그것이 코딩과 관련이 있다는 데 동의합니다. 그래픽을 코딩하는 경우 도전적으로 흥미롭고 관련성있는 문제입니다. +1 내가 직접 답을 알고
싶기

6
RGB 프로그래밍과 관련이 있습니다. 날짜 문자열 구문 분석과 관련된 프로그래밍과 같습니다. 텍스트 "true"를 부울 값으로 변환합니다.
Neil N

답변:


87

질문의 특정 번호는 CCIR 601에서 가져온 것입니다 (아래 Wikipedia 링크 참조).

RGB-> 그레이 스케일을 약간 다른 숫자 / 다른 방법으로 변환하면 일반적인 조명 조건에서 일반 컴퓨터 화면에서 큰 차이를 볼 수 없습니다. 시도해보십시오.

일반적으로 색상에 대한 추가 링크는 다음과 같습니다.

위키 백과 루마

브루스 린드 블룸 의 뛰어난 웹 사이트

Colin Ware의 책의 색상에 관한 4 장, "정보 시각화", isbn 1-55860-819-2; books.google.com의 Ware에 대한이 긴 링크 는 작동하거나 작동하지 않을 수 있습니다.

캠브리지 : 훌륭하고 잘 작성된 "절차보다 개념을 강조하는 시각적 지향적 접근 방식을 사용하여 디지털 사진을 획득, 해석 및 처리하는 방법에 대한 자습서"

"선형"RGB와 "비선형"RGB를 마주 치게된다면 여기에 대해 나 자신에 대한 오래된 메모의 일부가 있습니다. 반복합니다. 실제로는 큰 차이가 없습니다.


RGB-> ^ 감마-> Y-> L *

색상 과학에서 html rgb (10 %, 20 %, 30 %)에서와 같은 일반적인 RGB 값을 "비선형"또는 감마 보정이라고 합니다. "선형"값은 다음과 같이 정의됩니다.

Rlin = R^gamma,  Glin = G^gamma,  Blin = B^gamma

감마는 많은 PC에서 2.2입니다. 일반적인 RGB는 때때로 R 'G'B '(R'= Rlin ^ (1 / 감마)) (순수한 혀 클릭)로 작성되지만 여기서는 '.

CRT 디스플레이의 밝기는 RGBlin = RGB ^ 감마에 비례하므로 CRT의 50 % 회색은 매우 어둡습니다 : .5 ^ 2.2 = 최대 밝기의 22 %. (LCD 디스플레이는 더 복잡하며 일부 그래픽 카드는 감마를 보정합니다.)

L*RGB에서 호출 되는 밝기 측정 값을 얻으려면 먼저 RGB를 255로 나누고

Y = .2126 * R^gamma + .7152 * G^gamma + .0722 * B^gamma

이것은 Y XYZ 색상 공간에 있습니다. 색상 "휘도"의 척도입니다. (실제 공식은 정확히 x ^ 감마가 아니라 가깝습니다. 첫 번째 패스에서는 x ^ 감마를 사용합니다.)

드디어,

L* = 116 * Y ^ 1/3 - 16

"... 지각 적 균일 성을 열망하고 [그리고] 인간의 가벼움에 대한 인식과 밀접하게 일치합니다." - 위키 백과 실험실 색 공간


8
Y = 0.2126 * R + 0.7152 * G + 0.0722 * B-Wikipedia ( en.wikipedia.org/wiki/Grayscale )
iamantony


9

rgb를 회색조로 변환하는 c의 코드가 있습니다. rgb에서 그레이 스케일로 변환하는 데 사용되는 실제 가중치는 0.3R + 0.6G + 0.11B입니다. 이 가중치는 절대적으로 중요하지 않으므로 가지고 놀 수 있습니다. 0.25R + 0.5G + 0.25B로 만들었습니다. 약간 더 어두운 이미지를 생성합니다.

참고 : 다음 코드는 xRGB 32 비트 픽셀 형식을 가정합니다.

unsigned int *pntrBWImage=(unsigned int*)..data pointer..;  //assumes 4*width*height bytes with 32 bits i.e. 4 bytes per pixel
unsigned int fourBytes;
        unsigned char r,g,b;
        for (int index=0;index<width*height;index++)
        {
            fourBytes=pntrBWImage[index];//caches 4 bytes at a time
            r=(fourBytes>>16);
            g=(fourBytes>>8);
            b=fourBytes;

            I_Out[index] = (r >>2)+ (g>>1) + (b>>2); //This runs in 0.00065s on my pc and produces slightly darker results
            //I_Out[index]=((unsigned int)(r+g+b))/3;     //This runs in 0.0011s on my pc and produces a pure average
        }

2
0.3 0.6 0.11은 1에 더하지 않습니다. Wikipedia는 0.30 0.59 0.11을 제안하는 것 같습니다.
damix911 2013 년

사실이지만 1에 더하지 않은 유일한 결과는 강도가 매우 약간 변경되는 것입니다. 제안 된 0.25,0.5,0.25 방법은 1에 더해 지지만 그렇지 않으면 문제가되지 않습니다. 이는 최적화이므로 약간의 정확도를 포기하는 것이 합당한 절충안입니다.
twerdster

2
@twerdster 두 계수 집합이 모두 올바르지 않습니다. .3, .6, .11은 sRGB / Rec709 (웹과 대부분의 컴퓨터에서 사용하는)가 아닌 이전 NTSC 표준입니다. 그리고 0.25,0.5,0.25는 합리적인 트레이드 오프가 아닙니다. B는 휘도의 7 %에 불과하고 347 %는 틀 렸습니다. sRGB / r709의 계수 (선형화 후) : Rlin * 0.2126 + Glin * 0.7152 + Blin * 0.0722 = Y 이러한 스펙트럼 가중치는 인간의 스펙트럼 인식에서 파생됩니다. 편의를 위해 원하는 숫자를 입력 할 수 없으며 정확하기를 바랍니다. sRGB를 선형화 한 다음 올바른 계수를 적용해야합니다.
Myndex

나누기가 너무 비용이 많이 드는 상황에있는 경우 시프트 및 더하기와 함께 단일 곱하기를 사용하는 근사값은 다음과 같습니다 0.11111111 * ((G + (G<<1) + R) <<1) + B). 이에 해당 (2*R+6*G+B) / 9)하거나 0.222 R + 0.666 G + 0.111 B. 생산에 들어가기 전에 다양한 테스트 사례에 대한 정확한 공식과 비교하십시오.
ToolmakerSteve


6

이에 대한 정보 는 색상 FAQ 를 확인하십시오 . 이러한 값은 디스플레이에서 사용하는 RGB 값의 표준화에서 비롯됩니다. 실제로 Color FAQ에 따르면 사용중인 값은 최신 모니터가 아닌 원래 NTSC 표준에 사용 된 값이므로 구식입니다.


3

이러한 가치의 출처는 무엇입니까?

게시 된 계수의 "소스"는 Rec601TV 특성 에서 볼 수있는 NTSC 사양입니다 .

"궁극적 인 출처"는 인간의 색채 지각에 대한 1931 년경의 CIE 실험입니다. 인간 시각의 스펙트럼 반응은 균일하지 않습니다. 실험은 지각을 기반으로 삼 자극 값의 가중치를 부여했습니다. 우리의 L, M, S 원뿔 1 은 삼 자극 원색이 파생되는 "적색", "녹색"및 "파란색"(각각)으로 식별되는 빛 파장에 민감합니다. 2

sRGB (및 Rec709)에 대한 선형 조명 3 스펙트럼 가중치는 다음과 같습니다.

R lin * 0.2126 + G lin * 0.7152 + B lin * 0.0722 = Y

이러한 컴퓨터 모니터 (의 sRGB) 또는 HDTV 모니터 (REC709)을 나타 내기 위해 의도 된 컬러 공간의 sRGB와 REC709, 특정하고,위한 ITU 문서에 자세히 설명되어 REC709(2천18분의 10)를 BT.2380-2

각주 (1) 콘은 눈의 망막의 색을 감지하는 세포입니다.
(2) 그러나 선택된 삼 자극 파장은 각 원뿔 유형의 "피크"에 있지 않습니다. 대신 삼 자극 값이 선택되어 특정 원뿔 유형에서 다른 것보다 실질적으로 더 많이 자극합니다 (즉, 자극 분리).
(3) 계수를 적용하기 전에 sRGB 값을 선형화해야합니다. 나는 이것을 다른 대답 에서 논의합니다 .


-2

이러한 값은 특히 색맹 인 사람들의 경우 사람마다 다릅니다.


-4

이 모든 것이 정말 필요합니다. 인간의 인식과 CRT 대 LCD는 다를 수 있지만 RGB 강도는 그렇지 않습니다. 왜 L = (R + G + B)/3새로운 RGB를 L, L, L로 설정합니까?


3
세 가지 R, G, B 프라이 머리를 모두 평균화하면 이들을 지각 적으로 동등하게 취급하며, 이는 인간 비전 시스템의 경우가 아닙니다.
Bill Feth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.