#1. [H.264] 동영상 압축의 기본 개념
#2. [H.264] 동영상 압축의 기본 개념 – RGB, YCbCr, 서브샘플링
#3. [H.264] Block-based Motion Estimation(ME)
#4. [H.264] Discrete Cosine Transform(DCT) 이산 코사인 변환
#5. [H.264] Quantization(양자화)과 Zig-zag scanning

안녕하세요? 맨날맑음 입니다.


이전 포스팅에서 동영상을 압축하기 위한 프로세싱 과정중 ME(Motion Estimation)에 관해 알아 보았습니다. 이번에는 DCT(Discrete Cosine Transform)에 관해 알아보도록 하겠습니다.


#1. Discrete Cosine Transform 개요

Discrete Cosine Transform(이하 DCT)는 무엇일까요? 번역해 보자면 이산 코사인 변환이라고 합니다. 이전 시간에 배운 ME는 프레임간 유사성을 이용하여 영상을 압축 할 수 있는 기법이었는데요. DCT는 해당하는 프레임(Picture)만을 이용해서 영상을 압축 할 수 있도록 하는 기법이라 할 수 있습니다. 그렇기 때문에 사진을 압축하는 JPEG에서 쓰이는 방식입니다. 동영상 코덱에서는 H.261, H.263, H.264.. MPEG등 에서 이 방식을 사용하여 영상을 압축하게 됩니다.


대체 DCT란 놈이 어떤 것인지 좀더 자세히 알아보도록 하죠. 혹시 신호처리를 알고 계신 분은 좀더 쉬울 수 있겠습니다. 저는 신호처리를 모르는 관계로 처음 배울 때 잘 이해가 가지 않더군요.



- Fig1. DCT 변환 -


영상을 DCT 변환하면 Fig1에서 처럼 공간 영역(Spatial Domain)에서 주파수 영역(Frequency Domain)으로 변하게 됩니다. 그림을 잘 살펴보면 주파수가 낮은 쪽으로 데이터(신호)가 몰려 있는 것을 볼 수 있습니다. 이와 같이 DCT를 하면 신호성분이 낮은 주파수에 몰리게 되는 ‘에너지 집중 현상’이 나타납니다.

 

 

#2. DCT를 하는 이유


- Fig2. DCT Coefiicients -

 

그럼 코덱은 압축을 위해서 왜 DCT를 수행 하는 것일까요? DCT는 공강영역을 주파수 영역으로 변환한다고 하였습니다. 영상을 관찰하다 보면 인접한 픽셀간에는 비슷한 색상인 경우가 많이 있습니다. 즉 8×8 블럭을 DCT하였을 경우 64개의 픽셀중에 같은 색상이 낮은 주파수(DC)로 몰리게 됩니다. 그리고 색상의 변화가 있는 경우 높은 주파수(AC)으로 위치하게 됩니다.

 

DCT를 수행하게 되면 대부분의 이미지는 Fig1에서 와 같은 결과가 나오게 됩니다. 빨간색으로 우뚝 솟은 부분(DC)이 제일 큰 신호 값이며, 파란색은 울퉁불퉁 하긴 하지만 높은 주파수 영역으로 갈 수록 평평한 것을 볼 수 있습니다. 즉 위에서 설명 했듯이 8×8 블럭의 색상 평균값이 DC성분이 되며, 나머지 평균값과 틀린 부분이 AC 성분이 되는 것입니다. 눈으로 보아도 DC에 값이 많이 몰린 것을 알 수 있죠? 이 의미가 바로 인접한 픽셀간은 거의 비슷한 색상으로 이루어 져 있기 때문에 DC의 값이 크다라고 생각하시면 됩니다.

그런데 사람의 눈 또한 낮은 주파수 성분(DC)에는 민감하게 반응 하지만, 높은 주파수 성분(AC)에는 민감하지 않기 때문에 높은 주파수 영역(그림에서 파란색)을 좀 생략 한다고 해도 화질의 차이를 잘 느끼지 못하게 됩니다. 이것이 압축이 되는 원리 입니다.


그림1 에서 보는 것과 같이 DCT변환 전에는 8×8 블럭 이므로 64개의 데이터가 필요 하지만  DCT를 하여 높은 주파수 성분(AC)을 좀 버려서(화질의 차이는 크지 않으므로)  DC에서 가까운 10개의 데이터만 가지게 된다면, 그만큼 압축이 되는 것 입니다. 사실 DCT는 이렇게 주파수 성분으로 바꾸는 작업만을 이야기 하며 다음시간에 이야기할 Quantization과 Entropy coding과정을 거쳐야 실질적인 압축이 일어납니다.



#3. Discrete Cosine Transform(DCT)

위의 개념이 이해가 가시나요? 어떻게 영상을 주파수 영역으로 변환하는지에 관해 알아 보겠습니다.


DCT도 ME와 마찬가지로 블럭 단위로 수행하게 됩니다. 그 이유는 블럭 사이즈가 커지면 시간이 엄청 걸리기도 하지만, 전체 프레임을 한번에 처리하기 위해서는 어마어마한 메모리도 필요 하게 됩니다. 그래서 일반적으로 JPEG, H.261, H.263, MPEG에서는 8×8 블럭 단위로 DCT를 수행하게 됩니다. (H.264는 기본 4×4에 변형이 가능합니다.)


그럼 어떻게 공간 영역을 주파수 영역으로 바꿀 수 있을까요?

아래는 2D-DCT를 수행하기 위한 수식입니다.


- Fig3. 2D-DCT -

V는 DCT를 수행하여 주파수 도메인으로 바뀐 , C는 DCT수행에 필요한 메트릭스(Fig4 참조), X는 원본 블럭, CT는 C 메트릭스의 가로 세로를 변환한 메트릭스 입니다.

 


- Fig4. N×N Cosine Transfrom Matrix   C={c(k,n))} -

 

Fig4는 DCT 수행에 필요한 Matrix를 어떻게 생성하는지를 나타냅니다. k는 행을 n은 열을 나타내고 N은 Matrix의 크기를 나타냅니다. 우리는 8×8 DCT를 수행할 것이므로 N은 8이 됩니다. 이렇게 생성된 Matrix를 이용하여 V=CXCT 라는 수식으로 DCT가 된 데이터를 가져올 수 있습니다. 아래 Fig5는 DCT후의 데이터 변화를 나타냅니다. 숫자로 확인하여도 DC성분에 값이 집중된 것을 알 수 있습니다.

 


- Fig5. DCT후의 데이터 변화 -

 

아래에 있는 Fig6에서도 마찬가지로 높은 값들은 DC쪽에 집중되어 분포하게 되는 것을 알 수 있습니다.

 
-Fig6. Matlab으로 확인해본 DCT후의 데이터 분포-

 

 

 

#4. Inverse DCT는 어떻게?

DCT를 하여 주파수 도메인으로 변환 할 수 있다는 것을 알았습니다. 그럼 다시 공간 도메인으로 변경 하려면 어떻게 해야 할까요?


- Fig7. 2D-Inverse DCT -

위와 같은 공식으로 원래 블럭을 복원 해 낼 수 있습니다. 물론 복원한 블럭은 오리지날과 100% 동일하게 됩니다.

 

#5. 끝마치며

이번 시간에는 코덱의 인코딩 과정중 하나인 DCT의 개념과 DCT를 왜 해야하는지 알아 보았으며, DCT된 블럭을 원래대로 되돌리는 것 까지 알아 보았습니다. 다음 시간에는 Quantization에 관해 알아보고 전체적인 인코딩 프로세싱도 살짝 짚어 보려구 합니다.

제가 전체 그림을 제시하고 세부 강좌를 만들었어야 하는데, 세부적인 설명부터 하다보니 좀 오해가 생기는 부분이 있는 것 같아서요. 그럼 좋은 주말 저녁 되세요^^

Posted by 맨날맑음
,