[HEVC] 비디오 영상 포맷 - (2) 컬러 공간

대표적인 컬러 공간은 다음과 같다:

  • RGB 컬러 공간
  • YCbCr 컬러 공간: HEVC 인코더의 입력과 디코더의 출력으로 이용됨

RGB 컬러 공간

사람의 망막은 다음과 같이 이루어져 있다: 

  • 간상세포(Rod): 약 9천 만 개 이상. 비교적 약한 자극의 어두운 빛에도 반응
  • 원추 세포(Cone): 약 600만 개 이상. 비교적 강한 자극의 밝은 빛에 잘 반응

원추세포와 RGB 컬러 센서에 수용되는 에너지의 파장. 가로축은 입사 광선의 파장을 나타내고, 세로축은 입사 광선 에너지 크기에 대비하여 각 시세포가 흡수하는 정도를 나타낸다.

원추세포의 종류는 크게 세 가지가 있다. 원추 세포의 종류에 따라 각 파장의 에너지에 반응하는 정도가 다르다:

  • L(Long-wavelength; 장파장) 원추세포
    • 노랑~녹색 사이의 빛(약 500~700nm)에 민감
    • 564~580nm 범위 파장을 가장 잘 흡수(가장 민감하게 반응)
  • M(Medium-wavelength; 중파장) 원추세포
    • 청록~파랑 사이의 빛(약 450~630nm)에 민감
    • 534~555nm 범위 파장을 가장 잘 흡수(가장 민감하게 반응)
  • S(Short-wavelength; 단파장) 원추세포
    • 파랑~보라 사이의 빛(약 400~500nm)에 민감
    • 420~440nm 범위 파장을 가장 잘 흡수(가장 민감하게 반응)

 

이러한 원추세포의 파장별 에너지 흡수 특성을 반영하여 고안된 것이 RGB 컬러 공간이다. 즉, 각 원추세포가 가장 잘 흡수하는 파장의 에너지, 즉 64~580 nm(적색), 534~555 nm(녹색), 420~440nm(청색)만으로 컬러 채널을 구성하여 영상을 취득, 저장, 출력한다.

세 개의 채널 정보가 한꺼번에 나타나는 컬러 영상과 각 채널별 영상 각각은 공간적으로 중복되는 정보가 상당히 많이 존재한다.


YCbCr 컬러 공간

YCbCr 컬러 영상은 흑백 송신과 컬러 송신을 동시에 수행하기 위해 만들어 졌으며, 이를 이용하면 RGB 각 성분들 사이에 존재하는 공간적 데이터 중복을 줄여 전송과 저장의 효율성을 높일 수 있다. 따라서 HEVC같은 일반적 표준 비디오 압축 코덱들 대부분은 YCbCr 컬러 영상을 입/출력 포맷으로 사용한다. YCbCr은 각 픽셀마다 휘도성분(Y, Luma sample)색차 성분(Cb와 Cr, Chroma sample)로 구분하여 저장한다.

[💡보충] Y, Cb, Cr
- Y(Luma, 휘도): 오로지 '밝기' 정보만 뽑아낸다. (흑백 TV와 호환됨)
- Cb(Chroma Blue, 색차): 파란색 성분에서 밝기를 뺀 값 (B - Y).
- Cr(Chroma Red, 색차): 빨간색 성분에서 밝기를 뺀 값 (R - Y)

RGB 영상을 YCbCr 영상으로 변환하기 위해서는 아래의 과정을 거친다:

  1. RGB 감마보정
  2. RGB to YCbCr 변환
  3. 정규화 및 양자화

 

영상 취득 과정에서 감마 보정이 이루어졌다고 가정할 때, 감마 보정(프라임(') 기호로 표현. 0~1사이 값을 가짐)된 아날로그 RGB 값을 아날로그 YCbCr 신호 $E_Y(E'_B-E'_Y)(E'_R-E'_Y)$로 변환하기 위한 수식은 아래와 같다:

1. 휘도 성분 도출:

$$E_Y=0.2999E'_R+0.587E'_G+0.114E'_B$$

이 수식의 핵심은 가중치(계수)가 다르다는 점이다.
R(빨강): 약 30% 반영, G(초록): 약 59% 반영, B(파랑): 약 11% 반영

2. Cb(색차 구하기): B 컬러 성분과 휘도 성분의 신호차이 계산:

$$\begin{align}(E'_B-E'_Y) & = E'_B-0.299E'_R-0.587E'_G-0.114E'_B \\& =-0.299E'_R-0.587E'_G+0.886E'_B \end{align}$$

3. Cr(색차 구하기): R 컬러 성분과 휘도 성분의 신호차이 계산:

$$\begin{align}(E'_R-E'_Y) & = E'_R-0.299E'_R-0.587E'_G-0.114E'_B \\& =-0.701E'_R-0.587E'_G-0.114E'_B \end{align}$$

4. $E'_B-E'_Y$ 값과 $E'_R-E'_Y$ 값의 범위를 0.5 ~ -0.5로 재조정하기 위해 각각 $K'_R, K'_B$ 값 곱함:

$$K_R=\frac{0.5}{0.701}=0.713,\quad K_B=\frac{0.5}{0.886}=0.564$$

$$E'_{C_R}=0.713(E'_R-E'_Y)=0.500E'_R-0.419E'_G-0.081E'_B$$

$$E'_{C_B}=0.564(E'_B-E'_Y)=-0.169E'_R-0.331E'_G+0.500E'_B$$

단순히 휘도를 빼기만 하면 값이 너무 커지거나 작아질 수 있어서, 일정한 범위(보통 -0.5 ~ 0.5 또는 정수 범위)에 들어오도록 조정 계수를 곱해준다. 

재조정된 아날로그 YCbCr 값의 $E'_{C_R},\quad E'_{C_B},\quad E'_{Y}$ 값은 균등 양자화된 8bit 이진 인코딩을 통해 0000 0000(0) ~ 1111 1111(255)까지 통 256레벨로 양자화하여 디지털 신호로 바꾼다. 

아날로그 신호를 디지털로 바꿀 때, ITU-R BT.601 표준(TV 방식)을 따른다.

이때, 동기화 데이터(화면이 어디서 시작하고 끝나는지 알려주는 신호)로 0과 255를 사용하고, 비디오 레벨은 나머지 1~254을 사용한다.

그러나 비디오 레벨에서 실제로는 1~254를 다 쓰지는 않고 더 좁은 안전 구역(safe area)를 설정한다. 이를 제한된 범위(Limitted Range)라고 한다:

  • 휘도(Y): 주로 16~235 사이의 값만 사용
    • $16\dots 235 = $총 220단계
    • 검은색을 0이 아닌 16으로, 흰색을 255가 아닌 235로 정한다.
    • 이유: 신호가 전송 중에 조금 흔들리거나 오차가 생겨도(overshoot/undershoot), 0이나 255에 닿아버려 데이터가 깨지는 것을 막기 위한 완충 지대이다. 
  • 색차(Cb, Cr): 주로 16 ~ 240사이의 값만 쓴다.
    • $16\dots 240$: 225단계
    • 색이 없을 때(무채색)는 중간값인 128을 쓴다.

이제 이러한 양자화의 내용을 수식으로 표현해보자. 보통 입력되는 아날로그 신호($E' $)는 다음과 같이 정규화되어 있다고 가정한다.

  • 휘도($E'_Y$): 0 (검정) ~ 1 (흰색)
  • 색차($E'_{C_R}, E'_{C_B}$): -0.5 ~ + 0.5

이를 8비트 정수로 바꾸는 표준 수식(즉, 양자화 수식)은 다음과 같다:

(1) 휘도 신호($Y$)의 양자화 수식

$$\bar{Y} = 219(E'_Y)+16$$

  • $219\times E'_Y$: 0~1 사이의 값을 0~219 크기로 늘린다. (총 220개 레벨 확보)
  • $+16$: 시작점을 0이 아니라 16으로 올린다. (오프셋)
    • $E'_Y = 0$일 때 → $16$ (완전 검정)
    • $E'_Y=1$일 때 → $219 + 16 = 235$ (완전 흰색)
  • 계산 결과와 가장 가까운 정수로 매칭

(2) 색차 신호(Cr, Cb)의 양자화 수식:

$$\bar{C_R}=224[0.713(E'_R-E'_Y)]+128, \quad \bar{C_R} =160(E'_R-E'_Y)+128$$

$$\bar{C_B}=224[0.564(E'_B-E'_Y)]+128, \quad \bar{C_R} =126(E'_B-E'_Y)+128$$

  • $\times 224$: -0.5 ~ 0.5 사이의 값을 -112 ~ + 112 크기로 늘린다. (총 225개 레벨 확보)
  • $128$: 중심을 0이 아니라 128로 이동시킨다. (그러면 최소값: 16, 무채색: 0, 최대값: 240)

지금까지는 감마보정된 아날로그 RGB신호를 디지털 YCbCr로 바꾸는 수식이었다. 만일 감마 보정 및 양자화까지 거친 디지털 RGB신호를 디지털 YCbCr로 변환하기 위해선 아래와 같은 수식을 따른다. 감마 보정과 양자화 과정을 거친 아날로그 RGB 신호 $E'_R, E'_G, E'_B$로부터 $Y, C_B, C_R$ 값을 변환하는 방법은 아래 식과 같다:

$$E'_{R_D}(\text{in digital form}) = \text{int} (219E'_R)+16$$

$$E'_{G_D}(\text{in digital form}) = \text{int} (219E'_G)+16$$

$$E'_{B_D}(\text{in digital form}) = \text{int} (219E'_R)+16$$

$$Y=\frac{77}{256}E'_{R_D}+\frac{150}{256}E'_{G_D}+\frac{29}{256}E'_{B_D}$$

$$C_R=\frac{131}{256}E'_{R_D}-\frac{110}{256}E'_{G_D}-\frac{21}{256}E'_{B_D}+128$$

$$C_B=-\frac{44}{256}E'_{R_D}-\frac{87}{256}E'_{G_D}+\frac{131}{256}E'_{B_D}+128$$

 

이러한 방식으로 RGB 컬러 공간에서 표현되는 컬러 영상의 공간 중복성을 제거하여 YCbCr 컬러 영상으로 변환할 수 있다.


YCbCr 샘플링 포맷

사람은 컬러 영상의 밝기에 비해 색상을 인식하는데에 상대적으로 둔감하다. 따라서 YCbCr은 색깔 정보를 듬성듬성 버리는 샘플링(sampling)을 수행한다. YCbCr 샘플링 포맷(비율)은 4:4:4, 4:2:2, 4:2:0이  있다. 여기서 중요한 건 "가로 4개 픽셀 중에서 색깔 정보를 몇 개나 가져올 것인지"이다:

  1. 4:4:4 (무손실, No Subsampling)
    • 의미: Y 4개마다 색깔(Cb, Cr)도 4개 다 가져온다. 
    • 특징: 하나도 버리지 않는다. 화질은 최고지만 용량이 크다.
    • 용도: 영화 CG 작업, 고급 의료 영상, 전문가용 모니터
  2. 4:2:2 (가로 반토막)
    • 의미: Y는 다 챙기지만, 색깔은 2개만 가져온다. (2칸마다 1번씩 색을 칠함)
    • 원리: 1번, 2번 픽셀이 같은 색을 공유하게 만든다.
    • 용량: 색상 데이터가 절반으로 줄어든다.
    • 용도: 방송국 송출용 영상, 고화질 캠코더
  3. 4:2:0 (가로/세로 반토막, 가장 흔함!)
    • 의미: 색깔을 윗줄에서 2개 챙기고, 아랫줄에서는 아예 안 챙긴다(0).
    • 원리: 가로 2칸, 세로 2칸 (총 4개의 픽셀)이 딱 1개의 색깔 값을 공유해서 쓴다.
    • 용량: 색상 데이터가 1/4로 확 줄어든다.
    • 용도: JPEG 사진, 유튜브, 넷플릭스

따라서, HEVC를 포함한 대부분의 비디오 압축 표준 코덱들은 YCbCr 4:2:0 샘플링 포맷을 영상 입출력 포맷으로 사용한다.