아이공의 AI 공부 도전기

YCbCr에 대한 총괄

 

     

 

1. YCbCr의 정의

YUV vs YPbPr vs YCbCr

Color Space 표현 방법(Wiki : 색공간, YCbCr)

색공간(Coclor Space)는 색을 표현하는 공간으로 RGB, CMYK, HSV, CIE, YUV 등의 방법들이 있습니다.  우리는 YUV 그중에서도 YCbCr(줄여서 YCC)에 대해 집중적으로 알아볼 예정입니다.

Wiki : YCbCr 그림

앞에서 언급했듯 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, 709, 2020)

디지털 표준 텔레비전에 사용되는 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을 도입하여 사용했던 것입니다.

 

빛의 3원색 

 

 

 

 

 

 

 

 

왼쪽에 보이시는 그림은 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로 적은 데이터로 많은 색상을 표현하려 했던 것입니다. 해당 방법을 통해 적은 데이터로 비슷한 화질을 나타낼 수 있습니다.

RGB, YCbCr(YUV) 컬러 공간에 대한 설명 : Naver Blog

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

ko.wikipedia.org/wiki/YCbCr

 

YCbCr - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. YCbCr 색공간의 시각화 YCbCr은 영상 시스템에서 사용되는 색공간의 일종이다. Y 는 휘도 성분이며 Cb 와 Cr 은 색차 성분이다. YCbCr 은 가끔 YCC 라고 줄여 부르기도

ko.wikipedia.org

2) 영문판 Wiki : YCbCr

en.wikipedia.org/wiki/YCbCr

 

YCbCr - Wikipedia

"CbCr" redirects here. For other uses, see CBCR. A visualization of YCbCr color space The CbCr plane at constant luma Y′=0.5 A color image and its Y′, CB and CR components. The Y′ image is essentially a greyscale copy of the main image. YCbCr, Y′Cb

en.wikipedia.org

 

2. RGB -> YCbCr 변환, YCbCr -> RGB 변환 (ITU-R BT.601 표준 기준)

 

ITU-R BT.601 (구 CCIR 601) 기준 $K_R=0.299, K_G=0.587, K_B=0.114$ 계수 값이 존재합니다.

 

From Analog $R^\prime G^\prime B^\prime$ to Analog YPbPr or Digital YCbCr

RGB를 통한 YPbPr의 식은 아래와 같습니다.

https://en.wikipedia.org/wiki/YCbCr

이를 matrix로 변환하면 다음과 같을 것이고 이에 대한 역변환 또한 아래 그림을 통해 확인할 수 있습니다.

https://en.wikipedia.org/wiki/YCbCr

$R^\prime G^\prime B^\prime$ 값과 ITU-R BT.601 (구 CCIR 601) 기준 $K_R=0.299, K_G=0.587, K_B=0.114$ 넣은 결과는 아래와 같습니다.

 

https://en.wikipedia.org/wiki/YCbCr

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}

 

From 8bit Digital $R^\prime G^\prime B^\prime$ to Digital YCbCr

 

RGB가 8-bit 0~255 범주일 때 YCbCr로 변환하는 방법

 

0은 검정, 255는 하얀색의 full range 사용 시 

 

https://en.wikipedia.org/wiki/YCbCr

single bitshit에 의해 계산될 때 사용(?) : 주로 사용하게 되는 값

https://en.wikipedia.org/wiki/YCbCr

 

$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

https://en.wikipedia.org/wiki/YCbCr

YCbCr에서 RGB로의 역변환 2

반올림하지 않고 역변환식

 

https://en.wikipedia.org/wiki/YCbCr

 

3. 코드

코드는 cv2, matlab 2가지 방식이 가장 간단하지만 위에서 본 것을 넣어 직접 구현할 수 있습니다. 다만 matlab과 cv의 ycbcr 변환 코드는 차이가 있어 값의 차이가 있습니다.

cv2의 경우 아날로그 공식이 사용되는 반면 matlab은 디지털 공식의 색상을 변환합니다. 

1) cv2의 경우

# 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]

 

 

2) matlab의 경우

 

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] 범위 내에 있습니다.

 

 

 

 

matlab 'baboon.png' 실험

RGB

YCBCR

YCbCr - Y Channel Only

 

 

kr.mathworks.com/help/images/ref/rgb2ycbcr.html

 

RGB 색 값을 YCbCr 컬러스페이스로 변환 - MATLAB rgb2ycbcr - MathWorks 한국

귀하의 시스템에 이 예제의 수정된 버전이 있습니다. 이 버전을 대신 여시겠습니까?

kr.mathworks.com

 

 

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading