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

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

게시 된 계수의 "소스"는 Rec601 및 TV 특성 에서 볼 수있는 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.