카테고리 없음

Image Signal Processing / RGB / YUV / YCbCr

낑낑이 2026. 4. 29. 19:47

RGB

빛의 3원색인 R,G,B를 바탕으로 이미지를 나타낼 수 있습니다

 

RGB는 주로 3개의 채널로 이루어져있는데 3채널은 독립적인 영역이라고 생각하면 됩니다 

이런식으로 각 채널이 이루어져있고, 해당  채널들값의 관계성으로 하나의 픽셀값을 만들어 내게 됩니다

3개의 Channel은 8bit 로 이루어져있어 0-255의 값을 가지며,

R G B가 모두 255인경우에는 흰색이 만들어지고, 0인경우이는 검정색이 만들어지게 됩니다

 

이렇게 되니 3개의 채널 모두 밝기 정보를 보유하고 있게 됩니다. 즉 색의 정보와 밝기를 각채널마다 모두 가지고있는 형태입니다

사람의 눈은 밝기에 민감하고, 색에는 둔감한데 RGB는 이런 부분을 활용하지 못합니다

 

YUV

 

YUV는 Y, U , V로 분할되어 이미지를 표현합니다 

 

이때 Y는 (Luminace) 즉 밝기에 해당하는 값이고 , U는 Blue값에서 Y를 뺀 값, V는 Red에서 Y를 뺀값입니다

G는 왜 없냐고 할수있는데 ,Y, U,V로부터 G를 복원할수 있기 때문입니다

- Y = Luminace (밝기, weighted RGB)

- U = B − Y (Blue 색차)       

- V = R − Y (Red 색차)  

이와같은데 , RGB에서의 변환공식은 이와같습니다 

Y =  0.299·R + 0.587·G + 0.114·B  

U =  0.492·(B − Y) 

V =  0.877·(R − Y)  

G가 가장 높은 가중치를 받는것을 볼 수 있는데, 이는 사람의 눈이 녹색에 가장 민감하기 때문입니다. 

따라서 Bayer Pattern에서도 RGGB등 G비율이 더 높은것을 볼 수 있는데, 이것은 이후에 설명하도록하겠습니다

 

위와같은 공식으로 RGB에서 YUV로 변환할 수 있습니다

YUV는 본래 아날로그 신호의 이름이며 디지털에서는 주로 YCbCr을 사용합니다

YCbCr

 

YUV의 개념과 다른적으로 다른 부분은 크게 없습니다

YUV의 변환공식

Y =  0.299·R + 0.587·G + 0.114·B   

U =  0.492·(B − Y) 

V =  0.877·(R − Y)

 

YCbCr의 변환공식   

ITU-R BT.601 변환 

Y  =  0.299·R + 0.587·G + 0.114·B 

Cb = -0.169·R - 0.331·G + 0.500·B + 128

Cr =  0.500·R - 0.419·G - 0.081·B + 128

 

ITU-R BT.709 (HD)

Y  =  0.2126·R + 0.7152·G + 0.0722·B  

Cb = (B − Y) / 1.8556 + 128

Cr = (R − Y) / 1.5748 + 128 

 

이런식으로 변환식이 있는데 ITU-R은 1982년에 만들어진 SD 디지털 비디오 표준입니다 

아날로그 영상을 어떻게 디지털로 인코딩 할것인가? 를 정한 국제표준입니다 

주로 ITU_R BT.601이 Main으로 설명되어있어 이것을 위주로 설명드리겠습니다 

 

YCbCr에서 가장 중요한것은 Chroma Subsampling입니다

 

살마의 눈에는 두 종류의 시세포가 존재합니다

-간상새포는 약 1.2억개로 밝기에 민갑합니다.

-추상세포는 약 600만개로 색에 민감합니다 

따라서 밝기 해상도와 색 해상도는 20:1 수준의 차이를 보이는것을 알 수 있습니다

해당 비대칭성을 활용해서

Y인 Luminance는 Full 해상도로 보내고 Cb/Cr(색)에 대한 정보는 해상도를 깎아도 무리가 없다는것입니다 

RGB의 경우 3채널 모두 밝기 정보를 포함하고 있으므로 한 채널을 Sub Sampling하면 색이 망가지게 됩니다

이와같은 이유로 YCbCr을 사용하게 됩니다 

 

따라서 이런 Sub Smapling 보면 

4:4:4 Subsampling 4:2:0.. 등 이런 방식들이 많이 존재하는데 

J:A:B 표기법으로 해석하겠습니다 

해당 표준은 4*2 픽셀 영역을 기준으로 표기합니다 

J는 가로 기준 픽셀수, 

A는 윗줄 J 픽셀에서 Chroma 샘플수

B는 아래줄 J 픽셀에서 Chroma 샘플수입니다

YCbCr SubSampling 

4:4:4

4:4:4 YCbCr은 8개의 픽셀에서 8개의 Y값, 8개의 Cb, 8개의 Cr이 나옵니다

즉 RGB와 같은 총 24개의 정보를 갖고있으므로 손실이 없습니다 

4:2:2

4:2:2 YCbCr은 8개의 픽셀에서 8개의 Y값, 4개의 Cb, 4개의 Cr이 나옵니다

4:2:2 이므로 윗줄에서 2개, 아랫줄에서 2개가 Sampling 됩니다 

즉 RGB에 비해 24개의 값에서 16개의 값으로 Down Sampling된것을 볼 수 있습니다  

4:2:0

 

4:2:0 YCbCr은 8개의 픽셀에서 8개의 Y값, 2개의 Cb, 2개의 Cr이 나옵니다

4:2:0이므로 윗줄에서 2개, 아랫줄에서 2개가 Sampling됩니다

즉 RGB에 비해 24개의 값에서 12개의 값으로 Down Sampling된것을 볼 수 있습니다  


  • 4:4:4는 크로마 채널의 다운샘플링이 없음을 의미합니다.
  • 4:2:2는 수직 다운샘플링 없이 2:1 가로 다운샘플링을 의미합니다. 모든 검사 줄에는 2개의 U 또는 V 샘플마다 4개의 Y 샘플이 포함되어 있습니다.
  • 4:2:0은 2:1 수직 다운샘플링을 사용하여 2:1 가로 다운샘플링을 의미합니다.

YCbCr to RGB

이처럼 변환된 YCbCr에서 RGB로 복원할 수 있습니다

원래 기존 RGB에서 YCbCr로 변환하는 공식은 이와같습니다 

Y  =  0.299·R + 0.587·G + 0.114·B 

Cb = -0.169·R - 0.331·G + 0.500·B + 128

Cr =  0.500·R - 0.419·G - 0.081·B + 128

이 행렬식에 대한 계산결과인데요 

해당 계산결과를 거쳐

이와 같은 YCbCr을 얻을 수 있게 됩니다 

하지만 이렇게 비어있는 Cb ,Cr값이 있으면 어떻게 RGB로 바꿀수 있을까요 ?

4:2:2 SubSampling 복원 1

 

이처럼 Sub Sampling 이후에 RGB로 변환하기 위해서는 인접해있는 Chroma Blue, Chroma Red의 색상을 가져오게됩니다 

이처럼 가장 단순하게 Cb, Cr을 바로 옆 픽셀의 Chroma 값을 복사하는것을 Nearest Neighbor이라고합니다 

하지만 이런 방식은 블록 경계에서 색이 갑자기 바뀌기 때문에 시각적 결함이 발생할 수 있습니다

4:2:2 SubSampling 복원 2 -  1D Bilinear Interpolation

위 문제를 해결하기 위해 거리별 가중치를 둬서 계산하거나, 이와같이 옆 픽셀들의 평균으로 보간하는 Bilinear Interpolation(보간)을 사용합니다 

4:2:2 압축에서는 이와같이 간단하게 바로 옆 픽셀의 평균을 낼 수 있지만, 4:2:0 같은 경우 픽셀이 더 부족해지기 때문에 2D Bilinear Interpolation을 사용해주어야 합니다 

4:2:0 SubSampling 복원 3 -  2D Bilinear Interpolation

이렇게 4:2:0 SubSampling을 하게되면 위 사진처럼 변경됩니다, 따라서 짝수 Line의 Chroma들은 보간할 픽셀이 없는데요 ㄷ

이렇게 영역을 늘려서 보면 3*3 영역별로 가중평균을 통해 4픽셀을 이용하여 보간을 할 수 있습니다

각 픽셀별로 예시를 들어보겠습니다 

파란색 픽셀의 경우 좌 우 픽셀로 평균을 내어 1D Bilinear Interpolation

초록색 픽셀의 경우 상 하 픽셀로 평균을 내여 1D Bilinear Interpolation

노란색 픽셀의 경우는 상하 좌우 아무 픽셀도 없는것을 볼 수 있습니다 따라서 가중치를 부여하는 2Dlinear Interpolation이 진행되어야합니다