?

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

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

원칙적으로는 채널당 bit depth가 8비트로 코딩돼 있는 원본의 정보가 그릇만 10비트로 바뀐다고 해서 달라질 수는 없습니다. 색공간 변환도 없고, tonemapping도 하지 않았는데 말이죠.

 

현재 우리가 갖고 있는 대부분의 모니터는 10비트 지원을 하지 않고 8비트, 심한 경우(TN 패널 같은 일부 패널의 경우) 6비트만을 표현할 수 있습니다. 10비트 영상을 보다 낮은 bit depth의 모니터에 표현하기 위해서는 반드시 dithering을 거칩니다. 이건 낮아지는 표현범위(dynamic range) 때문에 필연적으로 발생할 수밖에 없는 떡짐 현상(color banding, 계조 무너짐, 등고선 현상)을 보정하기 위해 거치는 과정이고, 랜덤한 노이즈를 계조 부분(gradient)에 추가함으로써 엄밀히 말해 '우리 눈을 속이는' 과정입니다.

 

10비트로 인코딩된 영상도 8비트, 6비트 모니터에 표현하기 위해서는 dithering을 한 번 거쳐야 하는데, 8비트 -> 8비트 인코딩된 영상에서는 필요 없는 dithering 과정을 한 번 더 거치게 되니 우리 눈으로서는 뭔가 화질이 개선됐다고 생각하게 되는 것입니다.

 

10비트 인코딩은 그 표현 범위를 충분히 활용했을 때 의미가 있습니다. HDR(high dynamic range) 영상들을 10비트 인코딩을 하는 이유도, 기본적으로 영상의 색 표현 바탕이 되는 색공간이 기존의 SDR 영상들이 쓰는 색공간인 BT.709보다 2배 이상 범위가 큰 BT.2020이기 때문입니다. 그 많은 색 정보들을 담기 위해서는 10비트 이상의 bit depth가 꼭 필요한 것이죠.

 

그렇다면 BT.709는 10비트로 하면 안 되냐 하는 의문이 생길 수 있겠죠. 물론 기술적인 이유도 있겠지만, 8비트나 10비트나 어차피 색공간 자체가 한계가 있는 한 우리 눈으로 구분하기에 별 의미가 없기 때문에 8비트로도 충분한 것입니다.

 

애초에 원본 자체가 BT.709를 10비트로 코딩한 것도 아니고, 원본이 8비트로 돼 있다는 건 이미 색 표현 범위가 BT.709를 벗어나지 않는다는 의미이므로 여기에 추후 10비트를 적용한다고 해도 색 표현력이 달라질 건 하나도 없습니다.

 

HDR 영상들을 8비트 인코딩으로 변환할 때는 tonemapping을 거쳐 필요한 색 정보를 최대한 보존하는 것도 같은 맥락입니다. 그냥 8비트 인코딩을 하면 truncation이 랜덤하게 발생할 수밖에 없습니다. (zscale 필터가 없는 샤나에서 tonemap 필터 사용이 불가능해 아쉬운 대로 기존의 scale 필터로 대신하여 truncation이 발생하는 예는 프리셋 게시판의 이 게시물과 사용 팁 게시판의 이 게시물을 참고하시면 됩니다.)

 

그런 이유로 다음의 질문에도 같은 맥락으로 답할 수 있습니다. 잘못된 10비트 인코딩 영상은 8비트로 재인코딩해도 될까요? 정답은 "글쎄요"입니다. Bit 10개 단위로 구성돼 있는 걸 8개 단위로 자르면 무슨 일이 일어날지는 인코더 소스를 코딩한 사람이 알겠죠. 앞쪽을 자르느냐, 뒤쪽을 자르느냐의 문제가 있고, 자르는 방법(truncation method)에 따라 어떻게 왜곡되느냐가 달라지겠죠. 추측으로는 앞쪽(큰 단위)을 자른다면 무의미한 0들만 없어져서 사소한 결함만 발생할 것 같지만, 그 부분은 직접 해보지 않은 한 모를 거라 생각됩니다.

 

(여담이지만, 큰 단위의 비트 배열 순서에 관한 것은 엔디언과 관련이 있습니다. 이와 관련된 것은 위키피디어 해당 문서를 참고하시길... 우리가 10비트 인코딩을 할 때 픽셀 포맷을 'yuv420p10le' 이런 식으로 표현하는데, 이는 10비트 bit depth의 little endian 방식이라는 의미입니다. 물론 yuv420은 chroma subsampling 방식을, p는 luma와 chroma의 배열 방식이 planar라는 의미입니다.)

 

한 가지 생각나는 방법은, format 필터를 적용해 픽셀 포맷을 10비트에서 8비트로 변경한 후 인코딩하는 것입니다. 그러나 인코더가 작동하기 전에 이 필터를 적용하는 것이 얼마나 의미가 있을지, 즉 이 필터의 알고리듬이 인코더의 10비트 -> 8비트 변환 알고리듬보다 우수한지 어떤지는 실제로 적용해 보아야 알 수 있을 것으로 생각됩니다.

 


 

[업데이트 및 수정]

위 내용을 기술할 때 중요한 부분이 한 가지 누락돼 경우에 따라 잘못된 판단을 내릴 수 있을 것 같아 수정합니다. 고해상도/고압축을 지향하는 현대의 인코더에서는 인코더 내에 in-loop 필터를 적용하는데 대부분 과도한 비트레이트를 억제하기 위한 deblocking과 denoising 효과를 갖게 됩니다. 하지만 이 과정에서 데이터 변이가 일어날 수 있고, 인코더에 따라서는 (특히 높은 샘플 bit depth를 타겟으로 하는 x265, av1 등) 디노이징 처리가 과도해서 어둡고 복잡도가 낮은 영역(flat and dark area)에서 샘플 bit depth가 크지 않은 경우, 즉 8비트의 경우 떡짐(banding) 현상이 두드러지게 나타나는 성향이 있습니다. 그래서 8비트 원본이라 하더라도 이 메커니즘 때문에 10비트로 인코딩할 경우 원본에 따라 화질이 개선될 수 있습니다. 특히 어둡고 복잡도가 낮은 영역이 많은 원본 ― 대표적으로 애니메이션 ― 일 경우 이러한 경향이 두드러진 것으로 보입니다.

 

애초 위 내용은 "데이터 변이가 없다"는 전제로 기술된 것이기 때문에 이 부분을 놓쳤습니다. 오해와 혼란을 드려 죄송합니다. 131.gif

 

아래 링크는 8비트 원본을 대상으로 다양한 인코더로 8비트와 10비트 인코딩한 결과를 VMAF 지수로 측정한 것입니다. 참고하시면 좋을 것 같습니다.

 

https://www.reddit.com/r/AV1/comments/f1h2u1/aom_vs_rav1e_vs_svtav1_vs_x265_vs_vp9_vs_svtvp9/

 

Facebook Twitter Pinterest Kakao
  • ?
    유토짱 2018.09.05 18:50
    원본 이상의 화질을 얻기 위한 투자 시간에 비하면, 화질 향상도가 미미해서 의미가 없다는 뜻인것 같습니다.
  • ?
    JKyle 2018.09.05 18:59
    애초에 '원본 이상의 화질'이란 건 불가능하죠. 단지 우리 눈에 그렇게 느껴 보이게 조작을 할 뿐.
    8비트 원본을 10비트 인코딩하는 건 결코 화질을 향상시키는 방법이 될 수도 없고, 우리 눈에 화질이 향상돼 보이는 효과도 실질적으로 거의 없다는 논지입니다.
  • ?
    비사용중 2018.09.08 21:28
    용량적인 부분이라도 더 줄어드나요? 10비트로 자주 인코딩하는 이유는 용량을 좀 더 줄이고자 함이라서요
  • ?
    JKyle 2018.09.09 00:18
    네. 용량이 좀 줄어드는 경우가 많습니다. 하지만 그건 본문에서도 언급했다시피 화질 열화를 가져오죠. 그리고 재생이 안 되는 기기도 있구요. 용량을 줄이시려면 차라리 설정 잘 해서 8비트로 하시는 게 낫지 않을까 싶습니다. 물론 본인 소장용으로 하실 거면 상관은 없겠죠.
  • ?
    JKyle 2020.10.08 04:25

    ============================

    여기까지의 제 댓글은 무시하시길... 125.gif


List of Articles
번호 제목 글쓴이 날짜 조회 수 추천 수
» 8비트 원본을 10비트로 인코딩하면 8비트로 인코딩할 때보다 화질이 더 낫다? 5 JKyle 2018.09.04 8871 0
Board Pagination Prev 1 Next
/ 1