색공간(Coclor Space)는 색을 표현하는 공간으로 RGB, CMYK, HSV, CIE, YUV 등의 방법들이 있습니다. 우리는 YUV 그중에서도 YCbCr(줄여서 YCC)에 대해 집중적으로 알아볼 예정입니다.
앞에서 언급했듯 YUV는 색공간의 한 방법입니다. Y는 Luminance(밝기), U는 Blue color - Y, V는 Red color - Y를 의미하고 아날로그(Analog) 방식일 때는 YPbPr로 표현하고 디지털(Digital) 방식일 때는 YCbCr로 표현합니다. 즉, 요약하면 디지털 형식의 YUV를 YCbCr이라고 합니다. 그러므로 YCbCr의 설명과 YUV의 설명은 유사하다 혹은 같다로고도 표현이 가능한 것입니다. 이제부터는 YUV가 아닌 YCbCr에 대한 용어를 사용하여 설명하겠습니다.
아날로그 : YPbPr
디지털 : YCbCr
YCbCr에 대한 일반적인 설명은 Y는 휘도(밝기) 그리고 나머지 Cb, Cr은 색차 성분을 뜻합니다. 따라서 Y가 크면 밝고, Y가 작으면 어둡습니다. YCbCr은 RGB에 의존한 채 사용하기에 (RGB 인코딩 방식 중 하나) 바로 사용하지 않습니다. RGB는 각 요소들이 8bit씩 균일한 정보를 보유하나 필요로 하는 정보량이 많아 적은 데이터로 많은 색상 표현이 가능한 YCbCr을 요소 검출에 많이 사용합니다. 특히나 비디오에서 많이 사용하는데 별도의 색상 변환 없이 비디오를 압축할 수 있어 사용합니다.
디지털 표준 텔레비전에 사용되는 YCbCr은 ITU-R BT.601 표준 (이전 CCIR 601)에 의해 정의되며 RGB 공간에서 Kr=0.299, Kg = 0.587, Kb=0.114 계수를 변환, 사용합니다. ($K_R + K_G + K_B = 1$)
참고로 ITU-R BT.709 표준 또한 존재하며 Kr=0.2126, Kb=0.0722 계수를 가집니다. 추가 변환 방법 및 내용은 영문 YCbCr Wiki를 참조하시길 바랍니다.
ITU-R BT.2020도 존재합니다. Kr=0.2627, Kb=0.0593 계수를 가지고 gamma correction을 사용합니다.
디지털 표준 텔레비전 시스템에서 YCbCr을 도입한 이유는 2가지로 압축하여 설명이 가능할 것 같습니다.
1. 인간은 색차보다 밝기차에 더 민감합니다.(현재는 색에도 많이 민감하다고 전해짐)
2. 흑백 TV에서 컬러TV로 전환할 때 YCbCr을 이용하면 적은 정보량으로 흑백과 컬러를 동시에 지원 가능합니다.
즉, YCbCr에서 Y만 전송하면 흑백 화면이 되기 때문에 흑백 화면을 지원 가능하고 RGB 중 2가지 색을 알면 나머지를 자동으로 알 수 있기에 데이터 중복을 줄일 수 있습니다. 이 때문에 YCbCr을 도입하여 사용했던 것입니다.
왼쪽에 보이시는 그림은 Wiki에서 가져온 그림으로 4개의 이미지가 존재합니다. 각 이미지들은 Color Image, Y Image, Cb Image, Cr Image 순서로 구성되었습니다. 다른 말로 Color Image, Y Image, U Image, V Image 순서라고도 할 수 있습니다.
Y image의 경우 greyscale 색, Cb의 경우 위 빛의 3 원색에서 파란색을 뺀 계열의 색들, Cr의 경우 또한 빛의 3원색에서 빨간색을 뺀 계열의 색들로 구성되어 있습니다.
일반적으로 현재의 모니터들은 YCbCr 처리를 중간 단계로 사용하는 것보다 RGB로 바로 처리할 수 있는 제품들을 제공합니다. YCbCr은 색이 약간 틀어진다고 하고 정보 손실이 있어 자연스러운 장점보다 지연이라는 단점을 더 크게 얻을 수 있다고 합니다. 모니터를 PC와 연결 시 YCbCr444를 가장 많이 사용합니다.
과거에는 왜 RGB를 바로 쓰지 않았냐는 의문이 드실 수 있는데 과거 RGB로 표현하기에는 필요로 하는 데이터의 양이 많았기 때문입니다. 그렇기에 YCbCr로 적은 데이터로 많은 색상을 표현하려 했던 것입니다. 해당 방법을 통해 적은 데이터로 비슷한 화질을 나타낼 수 있습니다.
2x2 픽셀 기준 Y, Cb, Cr 성분을 1:1:1 비율로 샘플링한 것이 YUV444 포맷
2x2 픽셀 기준 Cb, Cr 성분을 1:2 비율로 샘플링한 것이 YUV422 포맷
2x2 픽셀 기준 Cb, Cr 성분을 1:4 비율로 샘플링한 것이 YUV420 포맷
가장 많이 사용하는 포맷은 YUV420
YUV422, YUV420은 기본적으로 손실을 가정한 방법
YCbCr에 대해서 구체적으로 알고 싶은 분께서는 Wiki에 잘 나와있으니 한글판과 영문판을 살펴보시길 바랍니다.
1) 한글판 Wiki : YCbCr
2) 영문판 Wiki : YCbCr
ITU-R BT.601 (구 CCIR 601) 기준 $K_R=0.299, K_G=0.587, K_B=0.114$ 계수 값이 존재합니다.
RGB를 통한 YPbPr의 식은 아래와 같습니다.
이를 matrix로 변환하면 다음과 같을 것이고 이에 대한 역변환 또한 아래 그림을 통해 확인할 수 있습니다.
$R^\prime G^\prime B^\prime$ 값과 ITU-R BT.601 (구 CCIR 601) 기준 $K_R=0.299, K_G=0.587, K_B=0.114$를 넣은 결과는 아래와 같습니다.
Analog $R^\prime G^\prime B^\prime$ [0, 1] 값일 때
1) YPbPr :
Y in [0, 1],
Pb in [-0.5, 0.5],
Pr in [-0.5, 0.5]
2) YCbCr :
Y in {16, 17, ..., 235},
footroom in {1, 2, ..., 15},
headroom : {236, 237, ..., 254},
sync in {0, 255}, C
Cb, Cr in {16, 17, ..., 240}
RGB가 8-bit 0~255 범주일 때 YCbCr로 변환하는 방법
0은 검정, 255는 하얀색의 full range 사용 시
single bitshit에 의해 계산될 때 사용(?) : 주로 사용하게 되는 값
$R^\prime G^\prime B^\prime$ in {0, 1, 2, ..., 255}
YCbCr
Y' in {16, 17, ..., 235}
with footroom in {1, 2, ..., 15}
headroom in {236, 237, ..., 254}
sync. in {0, 255}
Cb, Cr in {16, 17, ..., 240}
YCbCr에서 RGB로의 역변환 1
YCbCr에서 RGB로의 역변환 2
반올림하지 않고 역변환식
코드는 cv2, matlab 2가지 방식이 가장 간단하지만 위에서 본 것을 넣어 직접 구현할 수 있습니다. 다만 matlab과 cv의 ycbcr 변환 코드는 차이가 있어 값의 차이가 있습니다.
cv2의 경우 아날로그 공식이 사용되는 반면 matlab은 디지털 공식의 색상을 변환합니다.
# if input image is BGR
YCrCb = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB)
# if input image is RGB
YCrCb = cv2.cvtColor(img, cv2.COLOR_RGB2YCrCb)
# RGB to YCbCr
img=cv2.imread('~.png')
YCrCb = cv2.cvtColor(img, cv2.COLOR_RGB2YCrCb)
# YCbCr to RGB
img=cv2.imread('~.png')
h,w,c = img.shape
b = img[..., 0]
g=img[..., 1]
r=img[..., 2]
RGB = imread('~.png');
YCBCR = rgb2ycbcr(RGB);
figure
imshow(RGB);
figure
imshow(YCBCR);
변환된 YCbCr 색 값으로, 입력값과 같은 크기의 숫자형 배열로 반환됩니다.
1) 입력값이 double형이거나 single형이면 Y는 [16/255, 235/255] 범위 내에 있고 Cb와 Cr은 [16/255, 240/255] 범위 내에 있습니다.
2) 입력값이 uint8형이면 Y는 [16, 235] 범위 내에 있고 Cb와 Cr은 [16, 240] 범위 내에 있습니다.
RGB
YCBCR
YCbCr - Y Channel Only
kr.mathworks.com/help/images/ref/rgb2ycbcr.html