디지털 영상이든 아날로그 영상이든 색을 표현하는 가장 기본적인 방법은 RGB 색공간을 사용하는 것입니다.

하나의 색(빛)을 R, G, B 세 가지 성분의 합으로 표현하는 것이죠.

하지만 디지털 영상 압축에서는 일반적으로 YUV 색공간을 사용합니다.

(YUV는 정확히 말하면 YCbCr을 말하는데 이 글에서는 편의상 YUV로 표기하겠습니다.)

YUV 색공간은 임의의 색을 하나의 밝기 신호(Y)와 두 개의 색차 신호(U, V)로 표현하는 방식입니다.

디지털 영상 압축에서 YUV를 사용하는 이유는 사람의 눈이 밝기 신호(Y)에 더 민감하기 때문입니다.

비교적 덜 민감하게 반응하는 색차 신호의 정보를 줄임으로써 효율적인 압축이 가능하죠. (크로마 서브 샘플링)

뭐 이유야 어찌됐든 디지털 영상 압축에서는 주로 YUV가 사용되기 때문에 최초의 RGB 신호를

YUV 신호로 바꾸는 과정이 필요합니다. 마찬가지로 YUV 신호를 다시 RGB 신호로 바꾸는 과정도 필요하겠죠.

예를 들어 지상파 HDTV를 시청하는 과정을 간략히 정리해보면,

A. 방송국의 카메라에 들어오는 빛은 센서에 의해서 RGB 신호로 바뀝니다.

B. 이 RGB 신호를 YUV 신호로 바꾸고 MPEG2로 압축(인코딩)해서 송출합니다.

C. 가정(HDTV)에서는 수신된 MPEG2 스트림을 압축 해제(디코딩)해서 YUV 신호를 만들어냅니다.

D. YUV 신호를 다시 RGB 신호로 바꿔서 화면에 표시(디스플레이)합니다.


이처럼 카메라의 센서라든지 디스플레이 장치 등은 항상 RGB 신호를 기반으로 하기 때문에

RGB 신호를 YUV 신호로(B.), 또는 YUV 신호를 다시 RGB 신호로(D.) 바꾸는 과정이 필요한 것이죠.



RGB<->YUV 변환에 사용되는 방법도 여러가지가 있는데 BT.709(Rec. 709)나 BT.601(Rec. 601) 등이 이와 관련된 표준들입니다.

BT.709는 HDTV나 블루레이, BT.601은 SDTV나 DVD 등에서 주로 사용되고있죠. 이 외에도 SMPTE 등 다양한 표준들이 있습니다.

그리고 이런 표준들에 따라서 RGB<->YUV 변환에도 약간씩의 차이가 있습니다.


먼저 레벨과 관련된 내용인데 TV레인지 또는 PC레인지(Full range)라는 말을 들어보셨을 겁니다.

RGB 신호가 YUV 신호로 바뀔 때 바뀐 YUV 신호가 어떤 범위에 놓이는지에 따라서 TV 또는 PC레인지로 나뉩니다.

예를 들면 아래와 같이 밝기 신호인 Y 채널의 신호만 놓고 봤을 때, 원본 RGB 신호의 흰색과 검은색이

변환된 YUV 신호의 0~255에 대응하면 PC레인지 영상(YUV)이라고 합니다.


반면 원본 RGB 신호의 흰색과 검은색이 변환된 YUV 신호의 16~235에 대응하면 TV레인지 영상(YUV)이라고 합니다.


이처럼 RGB->YUV 변환 과정에서 YUV 신호가 어떤 범위에 놓이는지에 따라서 PC레인지와 TV레인지로 구분되는데

한 가지 중요한 점은 둘 다 YUV 값의 범위는 0~255라는 것입니다. 다만 흰색과 검은색의 정의만 다를 뿐이죠.

0~255의 값들 중 흰색을 255, 검은색을 0으로 정하면 PC레인지이고 흰색을 235, 검은색을 16으로 정하면 TV레인지인 것입니다.

따라서 RGB->YUV 변환을 어떻게 했는지에 따라서 그에 맞는 YUV->RGB 변환을 해줘야 위의 그림들처럼 원래의 밝기를 정확히 표시할 수 있습니다.

하지만 다음과 같이 PC레인지의 YUV 영상을 TV레인지로 보고 변환을 한다면 어떻게 될까요?


원래는 Y 값이 16이면 약간 밝은 검은색으로 표시되어야 하지만 이 경우에는 완전히 검은색으로 표시되겠죠.

YUV->RGB TV레인지 변환은 16을 완전히 검은색으로 인식할 테니까요.

반대로 아래와 같이 TV레인지의 YUV 영상을 PC레인지로 보고 변환한다면 검은색으로 표시되어야할 16이 검은색보다 밝게 표시될 겁니다.


YUV->RGB PC레인지 변환은 16을 완전히 검은색이 아니라 약간 밝은 검은색으로 인식하기 때문이죠.


이처럼 재생 과정의 잘못된 YUV->RGB 변환을 바로잡기 위해서 사용되는 필터가 레벨 조정 필터들입니다.

PC레인지의 YUV 영상을 TV레인지로 바꾸거나 TV레인지의 YUV 영상을 PC레인지로 바꿔줌으로써 원래의 밝기대로 표시하게 해주는 것이죠.

예를 들면 TV레인지의 YUV 영상에 아래와 같이 Levels 필터를 적용하면 PC레인지의 YUV 영상으로 바뀌게 됩니다.

MPEG2Source("test.d2v")

Levels(16,1,235,0,255)


만약 현재 사용중인 디스플레이 장치가 TV레인지의 YUV 영상을 PC레인지로 보고 변환을 한다면 이런식으로 스크립트를 작성해서

제대로 된 변환이 이루어지도록 만들어 주는 것입니다. 


다음으로 컬러 매트릭스에 관한 내용인데 지금까지 설명드린 레벨 조정과 기본적인 개념은 비슷합니다.

컬러 매트릭스는 RGB<->YUV 변환에 사용되는 변환식을 말하는데 표준별로 약간씩의 차이가 있습니다.

TV, PC레인지가 YUV의 범위에 관한 문제라면 컬러 매트릭스는 범위와 상관없이 변환식 자체에 관한 문제라고 할 수 있습니다.

즉 레인지가 같은 영상이라도 RGB<->YUV 변환식이 다르면 영상의 색감이 달라지게 되는 것이죠.

따라서 어떤 영상이 BT.709로 변환된 YUV 영상이라면 다시 RGB로 바꿀 때에도 BT.709를 사용해야 제대로 된 색감을 표시할 수 있습니다.

만약 BT.709로 변환된 YUV 영상에 BT.601이 적용되는 상황이라면 이 영상을 BT.601의 YUV 영상으로 바꿔주면 되겠죠.

Avisynth의 Colormatrix 필터 등은 이런식으로 YUV 영상의 데이터를 BT.709 또는 BT.601 등에 맞게 바꿔주는 필터입니다.

레벨 조정 필터들과 마찬가지로 YUV->RGB 변환이 잘못 적용되는 경우 이를 바로잡아주기 위한 용도로 사용됩니다.





'인코딩 일반' 카테고리의 다른 글

DTS-HD Master Audio와 TrueHD  (3) 2013.03.22
x264의 --level 옵션  (17) 2013.02.25
레벨 조정과 컬러 매트릭스  (17) 2013.02.14
H.265 / HEVC 동영상 압축 표준  (15) 2013.01.29
x264의 VBV 옵션  (7) 2013.01.24
프로그레시브로 송출되는 지상파 디지털 방송?  (3) 2013.01.16
Posted by 김코덱

댓글을 달아 주세요

  1. 초보 2013.02.19 12:39  댓글주소  수정/삭제  댓글쓰기

    저는 예전엔 레벨 조정을 했었는데 다수에게 배포를 목적으로 인코딩을 진행했던 터라
    감상을 하는 사람들의 사용하는 디코더 옵션에 붙어있는 레벨 보정 옵션을 전부 헤아릴 수는 없어서 안하게 되었습니다
    이런식으로 하다보니 결국은 어떠한 영상이라도 인코딩 할 떄 리사이즈와 디인터 이외엔 거의 아무것도 사용하지 않고 있는데요

    김코덱님은 TV 영상을 인코딩 하실 떄 레벨 조정을 하시나요? 꼭 레벨이 아니라더라도 색감이나 노이즈 제거, 샤픈 같은 필터를 어떤 기준으로 사용하시는지 궁금합니다

    • 김코덱 2013.02.19 14:16 신고  댓글주소  수정/삭제

      저도 HDTV나 블루레이를 인코딩할 때에는 레벨 조정은 거의 안 하는 편입니다..색감도 그렇고요
      디노이즈나 샤픈은 항상 똑같은 건 아니지만..대체적으로 보면
      예능은 디노이즈만 하거나 디노이즈+샤픈을 하기도 하고요
      드라마는 샤픈만 약하게 해줍니다
      블루레이는 리사이즈만 하거나 샤픈을 약하게 할 때도 있네요
      avs필터를 많이 사용하는 편은 아니라서 대신 x264 옵션을 가능한 한 높게 주는 편입니다

  2. 마음길 2013.06.01 18:34 신고  댓글주소  수정/삭제  댓글쓰기

    예전엔 레벨조정이 당연하다고 생각했는데 요즘 공개릴를 보면 많은분들이 하지않는것 같고
    원본을 자주봐서 눈이 익숙한지 뿌연걸 느끼지 못하겠더라구요.
    근데 막상 가끔 인코딩을 하면 레벨조정해서 영상이 좀 환해져야 더 좋은것 같고 그래서 고민인데요.

    질문을 드리면 피시에 맞게 레벨조정한 인코딩영상을 피시로 보면 문제가 없겠지만 티비로 보면 영상이 좀더 환해질것 같은데 맞나요?
    요즘 티비로 보는분이 많은걸로 알고있는데 영상이 환해지면 레벨조정을 안하는게 낫지 않을까요?

    • 김코덱 2013.06.01 22:26 신고  댓글주소  수정/삭제

      이름을 "TV레인지" 또는 "PC레인지"로 붙여놔서 그렇지..사실 티비로 보는지 피씨로 보는지는 크게 관련이 없거든요
      디코더 설정, 모니터 설정, 티비 설정, 그래픽 카드 설정 등등 레벨과 관련되는 부분들은 여러가지가 있기 때문에 딱 잘라서 말하기는 힘듭니다
      결국 직접 티비나 피씨의 재생 상태를 확인해보고 결정해야겠죠

      그리고 레벨 조절을 안 해도 되는 상황에서도 본인의 취향대로 조절을 하기도 하니까요
      본문은 조금 원론적인? 내용이고...레벨 조절도 샤픈이나 색감 조절 같은 일반적인 필터링과 비슷하게 생각하는 게 편할 것 같습니다

  3. 마음길 2013.06.02 12:39 신고  댓글주소  수정/삭제  댓글쓰기

    정말 간단하게 생각하면 되는거였군요.
    노이즈가 있으면 디노이즈하고 별로없으면 하지않듯이 레벨조정도 명암대비,밝기에따라 사용여부를 판단할뿐이고,
    말씀대로 보는 사람의 취향에 따라 조절하기도 하니 꼭 필터를 써야한다 아니다 할 필요는 없는거네요.

    예전 비드코리아에서 김코덱님의 글을 자주 봤었는데, 이렇게 다시볼수 있게되서 좋네요. 답변 감사합니다.

  4. 미녀의탄생 2015.03.31 16:10  댓글주소  수정/삭제  댓글쓰기

    혹시 "RGB"와 "YUV 4:2:0"의 데이터량이 어느 정도 차이 나시는지 알고 계신가요?

    예전에 어떤 블로그에서 "RGB" 색상을 그대로 송출하기엔 데이터량이 어마어마하게 커서
    "YUV"로 리샘플링 해서 송출하는 거라고 본 적이 있는데요.

    그 블로그가 폐쇄 됐는지 도무지 찾을 수가 없더라구요.

    근데 어떤 분이 그러더군요.
    "RGB"가 "YUV 4:2:0" 보다 고작 두 배 더 크다고...
    고작 두 배 더 큰 정도라면 굳이 "YUV"를 쓰는 이유가 있나 싶어서 질문 드립니다.

    • 김코덱 2015.03.31 21:07 신고  댓글주소  수정/삭제

      RGB의 데이터량이 YUV 4:2:0의 정확히 두 배이긴 하지만 '고작'이 아니라 '무려' 아닌가요? ㅎㅎ;
      화질 손실은 거의 없이 데이터를 반으로 줄일 수 있다면 무조건 쓰는 게 좋다고 생각합니다

      별다른 압축 방법을 사용하는 것도 아니고..단순히 크로마 채널의 픽셀값들을 일부 '버리는 것'만으로
      이정도의 압축?이 가능하다는 걸 생각해보면 YUV 색공간의 크로마 서브샘플링은 아주 획기적인 방법이죠

      그리고 h.264나 h.265 같은 손실 압축의 경우에
      크로마 채널에서는 더 높은 QP값을 사용할 수 있기 때문에
      똑같은 데이터량이라도 RGB 색공간보다 YUV 색공간이 압축에 더 유리한 면도 있습니다

    • 미녀의탄생 2015.04.01 19:55  댓글주소  수정/삭제

      그럼 두 배가 맞긴 맞는데 "고작"이라고 하기엔 큰 편이 맞긴 맞단 말씀이신가요?

      그럼 이게 과연 제가 예전에 다른 블로그에서 봤던 글 처럼
      데이터량이 어마어마하게 커서
      기술적으로 송출하기 무리일 정도로 큰 정도는 아니라는 건가요?

      제 기억으론 "기술적으로 송출이 불가능할 정도로 데이터량이 어마어마하게 크다"
      라는 표현을 썼던 걸로 기억 하거든요.

    • 김코덱 2015.04.01 21:11 신고  댓글주소  수정/삭제

      계산을 해보면 압축되지 않은 1920*1080 30fps RGB 영상은 비트레이트가 약 1500 Mbps이고
      압축되지 않은 1920*1080 30fps YUV 4:2:0 영상은 비트레이트가 약 750 Mbps입니다

      어차피 둘 다 공중파나 케이블 방송용으로 송출하기에는 부적합하니까 압축을 해야겠죠
      송출에 적합한지 여부는 색공간이 아니라 압축을 했는지 안 했는지가 더 중요한 것 같습니다

      그리고 방송국이나 기타 영상 제작 업체들처럼 압축되지 않은 영상을 다루는 곳에서는
      YUV 색공간을 사용하는 게 메모리 사용량이나 전송 대역폭을 줄일 수 있다는 점에서 더 유리하겠네요

    • 미녀의탄생 2015.04.03 10:44  댓글주소  수정/삭제

      그렇군요.
      매번 친절한 답변 정말 감사 드립니다.
      덕분에 또 하나 배웠네요.

      좋은 하루 보내세요. ^^

  5. 지나가다 2015.04.23 05:06  댓글주소  수정/삭제  댓글쓰기

    08~09년도 만해도 재생하는쪽에서 문제때문에
    이글 처럼 인코더가 미리미리 손을 써야했지만
    이제는 재생하는쪽에서 tv레벨을 pc레벨로 확장못하는 일은 없다고 봐도 무방합니다

  6. 2016.04.19 18:50  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • 김코덱 2016.04.19 21:58 신고  댓글주소  수정/삭제

      사실 이런 건 답이 없는 문제죠
      레벨조절을 어떻게 해야한다는 원칙? 같은 건 없으니까요
      그냥 보시기에 좋은 쪽으로 인코딩하시면 될 것 같습니다

    • 김코덱 2016.04.22 23:24 신고  댓글주소  수정/삭제

      글쎄요..똥색 영역을 침범했다고 잘못된 건지는 잘 모르겠습니다
      (우선 히스토그램에서 보이는 화면이 원본 데이터를 말하는 건지 디코딩 후의 데이터를 말하는 건지도 잘 모르겠네요..)
      그리고 영상을 avsp에서 불러오는 것만 해도 중간에 수많은 변수가 있겠죠
      디코더는 뭘 쓰는지, 렌더러는 뭘 쓰는지, 사용된 디코더나 렌더러는 yuv-rgb 변환을 제대로 하는지 등등..
      이러것들을 다 체크하면서 제대로 재생이 되는 건지 확인하는 건 정말 어려운 것 같습니다..그렇게까지 알지도 못하고요
      그래서 결국은 그냥 본인 모니터나 티비 화면에서 보기 좋게 나오면 되는 거라고 나름대로 결론을 내린 거죠 ㅎㅎ;

      색규격과 관련해서는..방송도 그렇고 시청자도 그렇고 HD가 대부분인 현상황에서
      굳이 새로나온 UHD용 규격을 썼을 것 같지는 않네요

    • 2016.05.02 15:50  댓글주소  수정/삭제

      비밀댓글입니다

    • 2016.05.02 15:52  댓글주소  수정/삭제

      비밀댓글입니다

    • 김코덱 2016.05.03 18:50 신고  댓글주소  수정/삭제

      네, *****님도 좋은 하루 보내세요~