2020.01.28 17:33

색공간과 Bit Depth

조회 수 7815 추천 수 2 댓글 4
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

동영상 인코딩을 위해서 원본 분석은 필수적입니다. 원본 분석을 위한 첫 단계로 미디어인포나 샤나인코더의 '파일 정보'로 동영상 정보를 파악하다 보면

 

 

비디오 쪽에서 다음과 같은 정보를 많이 접하실 겁니다.

 

 

붉은색으로 표시한 부분은 비디오 스트림의 비압축 데이터(raw data)에 관한 정보입니다. 그런데 여기서 말하는 YUV란 도대체 무엇이고, Chroma Subsampling이란 건 뭘까요? 그리고 '8비트 영상', '10비트 영상'이란 표현을 많이 들어보셨을 텐데 무엇을 근거로 8비트와 10비트를 나누는 것일까요?

 

■ 색모델과 색공간

YUV를 이해하기 위해서는 색모델과 색공간이란 것을 이해하실 필요가 있습니다. 색모델(color model)이란, 우리가 눈으로 보는 색[빛]을 어떤 원색(primary color)들의 조합으로 표현할 것인가 하는 것입니다. 이것을 빨강(red), 초록(green), 파랑(blue) 세 가지 색들의 조합(가산혼합)으로 표현하는 방식을 RGB 모델이라고 하는데, 디자인을 전공하신 분들은 동일한 색을 CMYK 색모델로 구성한 방식, 즉 시안(C), 마젠타(M), 노랑(Y)의 감산혼합에 검정(K)을 더한 방식에 익숙하실 겁니다.

 

색공간(color space)이란 하나의 색모델로 표현할 수 있는 색들의 집합이라고 할 수 있습니다. 동일한 색모델을 채용했다 하더라도 어떤 특정 목적에 맞는 색공간은 다를 수 있습니다.

 

영상과 이미지에 관해 조금 더 지식을 갖고 계시다면 RGB는 모니터의 색 표현 방식, YUV는 일반적인 비압축 데이터(raw data)의 색 표현 방식이라는 것을 알고 계실 것입니다. 그렇다면 YUV는 구체적으로 어떤 것일까요?

 

앞서 언급했듯이 RGB는 빛의 3원색인 빨강(Red)·초록(Green)·파랑(Blue) 삼색의 첫 글자를 딴 것으로, 이미지/영상의 가장 기본적인 단위인 하나의 픽셀(pixel, picture element)을 구성하는 세 요소를 나타낸 것입니다. 각각의 요소를 채널(channel)이라고도 합니다.

 

YUV는 이 픽셀의 세 요소인 채널을 RGB가 아닌 휘도(Y, luminance)색차(UV, chrominance)로 바꾼 것입니다. 그리고 색차는 다시 두 개의 채널인 U(Cb, 푸른 계열 색차)와 V(Cr, 빨간 계열 색차)로 구성됩니다. 수학적으로 이것은 좌표 변환에 해당하며, RGB 각각의 값들은 YUV 각각의 값들과 1 대 1 변환이 가능합니다. Y, U, V는 자체적인 의미가 있는 용어가 아니라 관습적으로 쓰이는 좌표축의 이름입니다. 마치 X축과 Y축처럼요.

 

■ 왜 YUV인가?

그렇다면 영상에서 비압축 데이터에 RGB가 아닌 YUV 모델을 쓰는 이유는 무엇일까요? 그 이유는 크게 두 가지가 있습니다.

 

1) 기술 발전 과정의 반영

브라운관으로 대표되는 CRT 모니터가 흑백 TV에서 표현할 수 있는 범위는 애초에 명암(휘도)밖에 없었습니다. 그러다가 색차를 표현할 수 있는 서브채널들이 도입되어 컬러 TV가 개발되고 보급이 된 것이죠. 이렇게 흑백에서 컬러로 전환되는 과정에서 Y -> YUV로의 채널 확장이라는 기술적인 대응이 있었기 때문에 YUV 컬러 모델이 익숙하게 사용되는 것입니다.

 

2) 명암과 색조 민감도의 차이를 이용한 용량 절약

보다 근본적인 이유는 우리 인간이 갖고 있는 시각의 한계입니다. 인간의 시각은 색의 차이(chrominance)보다 명암의 차이(luminance)에 더 민감합니다. 따라서 덜 중요한 색차 데이터들을 대충 생략함으로써 RGB 모델에서는 불가능했던 '용량 절약'이 YUV 모델에서는 가능해집니다. 물론 색차 데이터를 생략하게 되면 화질 저하가 있겠지만, 심리시각적 이론에 따르면 평균적인 인간이 그 화질 차이를 인지하기란 거의 불가능한 수준입니다. 이렇게 "픽셀 간 색 차이는 대충 건너뛰자" 하는 게 우리가 자주 접하는 chroma subsampling입니다.

 

■ Chroma Subsampling의 방식(scheme)들

Chroma subsampling의 모든 방식은 공통적으로 휘도 요소인 Y는 생략하지 않습니다. 우리 눈이 민감하게 캐치하기 때문입니다. 대신 몇 개의 픽셀을 어떻게 묶어서 공통된 색차 요소 데이터를 할당하느냐, 즉 나머지 픽셀의 색차 데이터를 생략하느냐에 따라 방식(scheme)이 나뉩니다. Chroma subsampling에는 여러 방식들이 있겠지만 우리가 가장 많이 접하는 4:2:2, 4:1:1, 4:2:0 방식을 그림으로 설명하겠습니다. (당연하게도 4:4:4는 아무것도 생략하지 않는 방식입니다.)

 

1) 4:2:2

 

4:2:2 방식은 한 줄 두 개의 픽셀에 공통의 색차 데이터를 배분하는 방식입니다. 즉, 가로 두 개의 픽셀 중 한 픽셀은 색차 데이터를 생략하고 바로 이전 픽셀의 색차 데이터로 대신하는 방식입니다.

 

이렇게 되면 실제 데이터 배열은 Y0-U0-V0-Y1 이 되고 원래 두 픽셀에 6개가 할당되어야 할 샘플(=각 픽셀에 들어가는 채널당 데이터 조각. 그림에서 공 하나) 수가 4개로 줄게 되어 전체적으로 보면 원래보다 4/6 = 2/3의 용량이 됩니다.

 

만약 샘플[공]의 크기(bit depth)(=BPC, bits per component)가 8비트라면 이 영상은 8비트 영상이라고 불리게 되고, 샘플의 크기가 10비트라면 10비트 영상이 됩니다. (BPC가 10비트 이상인 영상은 HBD(high bit-depth) 영상이라고 줄여서 표기하기도 합니다. HBD는 HDR(high dynamic range) 영상의 기반이 됩니다.)

 

따라서 8비트 영상의 경우 원래 픽셀당 3(샘플 수) x 8(bit depth) = 24 비트가 할당되어야 할 것이 24 x 2/3 = 16 비트가 되어 픽셀당 비트수(BPP, bits per pixel) 16비트의 데이터 용량을 가지게 되는 것입니다.

 

이렇게 표현된 비압축 데이터는 실제 모니터에 뿌려질 때 RGB 모델로 복원이 되는데, 그때는 Y0-U0-V0-Y1 이었던 두 픽셀의 데이터 스트림이 Y0-U0-V0-Y1-U0-V0 로 두 번째 픽셀의 색차 부분이 복제되어 변환됩니다.

 

2) 4:1:1

 

4:1:1 방식은 한 줄 네 개의 픽셀에 공통의 색차 데이터를 배분하는 방식입니다. 즉, 가로 네 개의 픽셀 중 세 픽셀은 색차 데이터를 생략하고 첫 픽셀의 색차 데이터로 대신하는 방식입니다.

 

이렇게 되면 실제 데이터 배열은 Y0-U0-V0-Y1-Y2-Y3 가 되고 원래 네 픽셀에 12개가 할당되어야 할 샘플 수가 6개로 줄게 되어 전체적으로 보면 원래보다 6/12 = 1/2의 용량이 됩니다.

 

역시 8비트 영상의 경우 픽셀당 24비트가 할당되어야 할 데이터 용량이 24 x 1/2 = 12 비트가 되어 12 bpp의 데이터 용량을 가집니다.

 

3) 4:2:0

 

이 방식은 4:1:1 방식과 상당히 유사하지만 대상이 되는 픽셀들이 가로 세로 2픽셀씩의 정사각형이라는 것만 다릅니다.

 

그러므로 이 방식의 데이터 배열은 정사각형 기준으로 보면 Y0-U0-V0-Y1-Y4-Y5 가 됩니다. 용량은 4:1:1 방식과 동일하게 원래의 1/2 용량이 됩니다. 따라서 8비트 영상의 경우 bpp 역시 12비트가 됩니다.

 

미디어인포의 "비트/(픽셀*프레임)" 정보는 비압축 데이터에서 12비트였던 픽셀당 비트수가 인코딩(압축)을 통해 어느 정도까지 압축이 되었는지 하는 정보를 보여줍니다. 위의 미디어인포 스크린샷에서 보여주는 "0.092"는 원래는 12비트였던 것이 0.092비트까지 압축되었음을 알려줍니다. (약 130배의 압축률)

 

4:1:1과 유사한 이 방식을 채용하는 이유는, 현재 대부분의 코덱에서 데이터 압축(인코딩)과 압축 해제(디코딩)가 정사각형 모양의 매크로블럭(macroblock) 또는 코딩 유닛(coding unit, cu) 단위로 계산되므로 인코딩/디코딩의 용이함 때문입니다.

 

현재 가장 많이 쓰이는 비압축 데이터 픽셀 형식은 yuv420p인데, 이것은 YUV 색 모델에 4:2:0의 chroma subsampling이 적용됐다는 뜻입니다. 'p'는 'planar'의 약자로, 한 프레임의 Y-U-V 데이터 배열을 각각의 축별로 모아서 배열했다는 뜻입니다. yuv420p는 I420이라고도 표기하며, U 축보다 V 축 정보가 앞에 오면 YV12라고 표기합니다. YV12는 현재 가장 광범위하게 사용되는 픽셀 형식입니다. I420(즉, yuv420p)과 YV12는 실질적으로 같은 형식으로 취급됩니다. (참고 문서)

 

NV12는 I420이나 YV12와는 달리 휘도 데이터들과 색차 데이터들이 따로 분리돼 있긴 하지만 색차 데이터들은 U와 V가 묶여 있는(interleaved) 형태입니다. 이런 형식을 반평면(semi-planar), 또는 이중평면(biplanar) 형식이라고 합니다.

 

픽셀 형식 명칭에서 뒤의 숫자 12는 bpp를 의미합니다. 따라서 해당 형식들은 모두 8비트 영상에 관한 표기임을 알 수 있습니다.

 

□ 다양한 픽셀 형식들

동영상의 다양한 픽셀 형식(픽셀 타입)에 관해 보다 자세히 알고 싶은 분은 AviSynth 위키의 AviSynth+ Color Formats 페이지나 VideoLAN 위키의 YUV 페이지를 참고하시기 바랍니다.

 

□ 덧붙이는 말

한 가지 주의하실 사항이 있는데, 미디어인포가 보여주는 동영상의 정보가 절대적인 것은 아니라는 것입니다. 미디어인포는 단지 동영상의 헤더 부분에 기록된 내용을 보여주기만 할 뿐이기 때문에 만약 실제 데이터 스트림과 다른 내용이 기록된 동영상이라면 - 가장 간단하게는, 먹서를 통해 조작이 가능 - 잘못된 정보를 보여줄 수도 있습니다. 따라서 미디어인포는 1차적인 참고 자료로 사용하고, 보다 자세한 분석이 필요할 경우엔 ffprobe 같은 다른 툴들도 사용해야 함을 유념해 주시기 바랍니다.

 
이 글을 추천한 사람
Rina
Facebook Twitter Pinterest Kakao
  • ?
    훈도 2020.01.31 16:52
    전문적인 자료 감사합니다. 원본으로 구한 영상이 yuv420p라면 인코딩으로 인해서 수치가 411,422로 바뀐다거나, 혹은 아예 RGB로 바뀔수는 없는것인지요?
  • ?
    JKyle 2020.01.31 17:04

    픽셀 포맷을 필터를 통해 일부러 변경하지 않는 한 임의로 바뀌지는 않습니다.

     

    픽셀 포맷 변경 필터로는 대표적으로 format 필터가 있는데, 주로 색공간 처리 관련 필터 작업을 할 때 해당 필터들이 요구하는 특정 픽셀 포맷을 맞추기 위해 픽셀 포맷을 변경시켜주는 필터입니다. 필터에 대해 보다 깊게 공부하시면 등장합니다.

  • ?
    훈도 2020.01.31 19:21

    픽셀 포맷을 변경할 수 있는 필터가 따로 있군요.. 나중에 기회가 된다면 어떻게 달라지는지 하나하나 적용시켜 보고 싶네요

    감사합니다

  • ?
    Prophet 2020.09.16 15:28
    5744kbps (¬‿¬)

List of Articles
번호 제목 글쓴이 날짜 조회 수 추천 수
53 HEVC 코덱 설정->튜닝 옵션별 각 화질 비교 4 file 바봉이 2020.02.05 18483 0
52 H264(AMF), HEVC(AMF) 옵션 도움말 1 JKyle 2020.02.03 9214 0
51 H264(NVENC), HEVC(NVENC) 옵션 도움말 1 JKyle 2020.02.03 11454 0
50 필터 적용 사례: 로고/워터마크 제거 1 JKyle 2020.01.31 8875 2
49 HDR 영상과 10비트 영상 3 JKyle 2020.01.29 14543 3
» 색공간과 Bit Depth 4 JKyle 2020.01.28 7815 2
47 샤나인코더 영상 사이즈 변경 옵션을 통한 FFmpeg 필터의 기초 이해 4 JKyle 2020.01.27 11527 3
46 샤나인코더의 H264 설정과 FFmpeg의 x264 설정 이해 8 JKyle 2020.01.27 27651 2
45 FFmpeg 명령어 구조와 샤나인코더 작동 방식 이해 JKyle 2020.01.26 5464 2
44 [인포그래픽] 인코딩 작업 흐름과 자막 작업 1 JKyle 2020.01.25 3383 0
43 [인포그래픽] 인코딩 작업의 흐름도 1 JKyle 2020.01.25 6343 2
42 [필독] 비디오 코덱과 기본 용어 (H.264, HEVC) 2 JKyle 2020.01.25 28145 7
41 샤나인코더로 움짤 만들기 4 file JKyle 2019.09.08 7532 0
40 기록 보기에서 Consider increasing the value for the 'analyzeduration' and 'probesize' options 내용이 있을 때 해결법 4 Rina 2019.09.04 4188 1
39 SRT SMI 자막 인코딩 이용시 한글 깨짐 자막변환 방법 file 나그네3 2019.03.14 30197 1
38 webm VP9 멀티스레드 활성화하는 방법, 속도 향상시키는 방법 마소리스 2018.09.25 6427 0
37 "비트레이트를 원본보다 높게 주면 원본보다 퀄리티가 나아질 수 있다"는 주장에 대해 6 JKyle 2018.09.19 18880 0
36 SSIM, PSNR로 측정한 NVENC 인코딩 4 file JKyle 2018.09.09 4182 0
35 인코딩된 파일의 PSNR, SSIM 값 계산하기 file JKyle 2018.09.05 3552 1
34 8비트 원본을 10비트로 인코딩하면 8비트로 인코딩할 때보다 화질이 더 낫다? 5 JKyle 2018.09.04 8756 0
Board Pagination Prev 1 2 3 4 Next
/ 4