#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

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

 

지난시간(4번째)에 DCT에 관해 배워 봤습니다. 이번에는 Quantization과 Zig-zag scanning에 관해 알아보려 하는데요. 그 전에 전체 코딩 프로세싱 과정을 조금 살펴 볼까 합니다.

 

전체적인 그림을 보시면 지금 배우는 것이 ‘코딩과정 중 이부분 이구나’ 라는 걸 알 수 있으실 것입니다.

 

#1. H.264 Coding Processing

 

 
- Fig1. Hybrid Coding Algorithm -

 

Fig1은 H.264 코덱의 코딩 과정을 나타냅니다. 왼쪽부터 화살표를 따라가 보면 배운대로 MB(매크로블럭) 단위로 이미지를 처리하는 것을 알 수 있지요?

그리고 Intra Mode와 Inter Mode로 나누어 지는 것을 알 수 있습니다. 두개의 차이는 나중에 자세히 짚어 보겠지만, 일단은 Intra는 현재 프레임만을 이용해 코딩하는 것이고, Inter는 현재프레임과 또 다른 프레임(레퍼런스)를 이용하여 코딩하는 방법이라고 간략히만 알고 넘어 갑니다.

 

우리가 배워온 방법은 Inter이므로 Inter-silce쪽 화살표를 따라 갑니다. Intra pred.를 만나게 되네요. 아직 배우지 않은 내용이므로 Inter모드에서 Intra를 사용 하는구나.. 라고만 알고 넘어 갑니다. (나중에 설명 할 것이므로) 다른 화살표를 따라가니 Inter Pred.가 나옵니다. 바로 프레임과 프레임사이의 유사성을 이용하는 우리가 3번째 시간에 배운 ME에 관한 내용이군요.

Intra라는 것은 잘은 모르겠지만 Inter-Silce 모드에서는 Intra pred.과 Inter pred.(ME)를 하여 둘중에 작은값을 취한다는 것을 쉽게 알 수 잇습니다.

 

다음 과정을 보도록 하겠습니다. 둘중 작은 값의 Residual 이미지와 Motion Vector(MV)정보를 취하게 됩니다. 그것을 다시 지난시간에 배운 DCT를 하여 주파수 도메인으로 바꿔주게 되구요.. 주파수 도메인으로 바꾸게 되면 DC성분에 에너지가 집중된다고 하였습니다. 그 다음 과정이 QT/Zig-zag입니다. 바로 오늘 배울 내용이죠^^

예전에 어떤분이 ME과정에서 데이터의 감소가 일어나지 않는다고 잘못되었다고 하였는데요. 오늘 내용을 잘 습득하시면 모든 의문은 사라질 것입니다. 자자.. 각설하고 오늘의 본론으로 들어가도록 하겠습니다.

 

 
- Fig2. Video Model의 코딩 과정(빨간색은 오늘 배울 내용) -

#2. Quantization?

퀀타이제이션.. 말도 어렵습니다. 한국말로 양자화라고 한다고 하네요..참 코덱쪽은 생소한 언어들 때매 처음에 고생하는 면도 있는것 같습니다. 여튼 우리모두의 백과사전인 위키백과에서 검색해보면.

  • 물리학에서 양자화(quantization)는 연속적으로 보이는 양을 자연수로 셀 수 있는 양으로 재해석하는 것을 이야기한다. 즉, 어떤 물리적 양이 연속적으로 변하지 않고 어떤 고정된 값의 정수배만을 가지는 것을 '그 양이 양자화 되었다.'고 한다. 예를 들면 전하는 연속적으로 변하는 양이 아니고 어떤 기본량. 즉 전자의 전하 e=4.8x10-10 (esu)의 정수배로 되어 있다. 따라서 전하는 양자화 된 양이라고 할 수 있다.
  • 정보 이론에서 양자화아날로그 데이터, 즉 연속적인 값을 디지털 데이터, 즉 띠엄띠엄한 값으로 바꾸어 근사하는 과정을 뜻한다.

- 표1. 출처 : 위키백과( http://ko.wikipedia.org/wiki/%EC%96%91%EC%9E%90%ED%99%94 ) -

 

요렇게 친절히 설명해 줍니다. 먼 말인지는 잘 모르겠네요 ㅠ 두번째 정의가 좀 코덱의 Quantization 과 일치해 보입니다.

지난시간에 배운 내용중 DCT를 수행하면 DC쪽에 에너지가 집중되고, AC는 덜 집중된다고 하였습니다. 또한 화질의 차이는 DC성분의 변화에는 민갑하지만 AC 성분의 변화에는 덜 민감한 편이지요. 즉 AC성분은 좀 생략해도 화질의 차이는 별로 나지 않는다..라는 건데요. 바로 이 원리를 이용하는 것입니다.

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

 

결국 8×8블럭의 64개의 픽셀들 중 DC가 아닌 AC영역(0.0을 제외한 영역)의 값을 좀 줄여 주자는 것입니다. 왜냐하면? AC는 좀 없어져도 사람들이 화질의 변화를 잘 못느낀다는 거죠!!(대신 데이터는 줄어드니 압축은 되는거죠)

하지만 이방법은 결국 화질의 손실을 가져오게 됩니다. 사람마다 화질을 보는 차이가 틀리기 때문에 제가 차이 안난다고 느껴도 어떤사람은 차이가 나게 보일 수 도 있는거죠.. 그래서 이러한 압축 방법을 손실 압축이라고 합니다. 그러니 AC값을 적당히 날려줘야지 확 날리면 화질의 차이가 확 나게 됩니다. 오늘 마지막에는 소스코드로 이 과정을 구현해서 직접 눈으로 확인도 해보도록 하겠습니다.

 

#3. Quantization 좀 더 자세히 들여다 보면..

그럼 어떠한 방법으로 Quantization을 하는지 보겠습니다. AC 성분을 화질의 저하는 별로 없으면서(잘 느끼지 못하면서) 데이터는 적당히 줄어드는(압축되는) 정도로 날려주어야 하는데.. 대체 그게 어떤 값인가는 참 애매합니다. 그래서 이미 많은 전문가들이 실험적으로 만들어 놓은 Quantization Matrix가 존재합니다. 여러번의 실험 끝에 이정도 값이면 화질의 저하도 별로 없으면서 적당히 압축되 된다는 것이지요.. FIg4를 보시면 휘도(Luminance)와 색(Chrominance)에 관한 행렬을 볼 수 있습니다. 사실 이 Matrix는 Jpeg에서 사용하는 테이블이구요.. H.264에서는 사용자가 Quantization 정도를 옵션으로 조정 할 수 잇게 구성 되어있습니다. 이 수치를 QP(Quantization parameter)라고 합니다. H.264를 인코딩 하실때 QP를 조정해 보시면 화질의 차이를 느낄 수 있습니다.

 

 

 
- Fig4. Quantization Matrix (8×8 Block) in jpeg-

 

여기서 포인트! 바로 위에서 DCT후의 블럭이 DC 성분쪽에 큰 값이 몰린다고 하였습니다. AC쪽에는 비교적 작은 값들이 들어 있지요. 그래서 AC 성분을 적당히 없애 줘서 압축을 한다고 하였습니다. 이제 Fig4의 값을 천천히 보는게 되면. DC에는 작은 값이 DC와 멀어 질 수록 점점 큰값이 쓰여있죠?

DCT를 수행한 블럭을 Quantization Matrix로 나누어 주는 것입니다. 그럼 어떻게 될까요? 큰 값으로 나눈 곳은 데이터가 없어질 것이고, 작은 값으로 나눈곳은 적당히 남아 있을 것이라는 것이죠!

이해 가시나요? AC를 줄이기 위해 Quantization Matrix를 실험적으로 만들었고, 그 Matrix로 나누면 AC의 값이 적당히 없어 진다는 것입니다. 아래의 Fig5에서 보면 대부분의 AC 성분은 0으로 변한 것을 볼 수 있습니다. 그렇습니다. AC성분이 날아간 것이지요.


- Fig5. DCT->Quantization 수행 후 Block data의 변화(8×8) -

 

 

#4. Zig-zag scanning

다음 인코딩 과정은 Zig-zag scanning입니다.  Quantization한 후 MB(메크로블럭)의 값을 살펴 보면 AC쪽은 거의 0으로 변한 것을 볼 수 있다고 하였습니다. Zig-zag scanning은 별게 아니지만 멋진 아이디어 입니다. 여러분이라면 저 데이터를 어떤식으로 구성 하시겠습니까? 2차원 배열이라 생각하고, (0,0), (0,1), (0,3)…  인덱스 순서대로 데이터를 구성 하실건가요?

 


- Fig6. H.265 8×8 Zig-zag scanning -

 

가만히 관찰해보다보니 왼쪽위에는(DC 근처) 데이터가 있지만 다른곳은 거의 데이터가 0이라는것을 알 수 있습니다.(물론 간간히 보이기는 합니다) Fig6에서 같은 순서로 데이터를 저장한다면 어던 차이가 있을까요? 처음에는 값이 들어가지만 스캐닝 할수록 0만 연속적으로 나오게 되겠지요?

 

이쯤대면 센스 만점인 여러분은 왜 지그제그를 하는지 눈치 채셨을 것입니다. 예를들어 스캐닝을 해보니 180,3,2,4,73,0,3,1,6,0,0,0,0,0,0,0……0…0 이런 데이터가 생겼다고 한다면 처음 데이터만 써주고 그다음 수많은 0에 대해서는 0이 몇개인지만 써주므로써 데이터를 줄 일 수 있게 되는 것입니다.(지그제그는 그냥 값을 얻어오는 순서만들 나타내고 0이 몇개인지 카운터하여 줄이는 것은 다음 시간에 알아볼 Run Length라고 합니다.)  코덱에서는 이과정을 지나서 Entropy coding을 통해 다시한번 데이터를 줄이게 됩니다. 너무 길어지니 그 과정은 다음 강좌로 넘기도록 할게요.

 

#5. 마치면서

오늘은 코덱의 전체적인 인코딩 프로세스를 한번 훝어 보았구요. Quantization과 Zig-zag scanning에 대해 알아 보았습니다. 여기서 개념을 이해하는 것도 중요하지만, ME->DCT->Quantization->Zig-zag로 이루어 지는 과정을 한데 묶어서 이해하는 센스가 필요합니다.

 

ME를 수행 할때 정확한 MV(motion vector)를 찾아서 잔류 데이터가 거의 없는 Residual image를 얻어 낸다면, 당연히 DCT의 값도 크지 않게 나타날 것입니다. Quantization을 하게되면 거의 모든 값들은 0이 나오게 되겠지요. 그렇다는것은 0의 갯수를 카운터하는 방식(Run length)으로 표현하면 ‘DC의 값은 100이고 나머지 AC의 값인  0이 63개다’ 라고 표현 할 수 있다는 것이고 그만큼 바이너리 코드도 더 줄일 수 있다는 것이죠.

 

다음 시간에는 Entropy coding에 관해 설명하고, H.264에서 사용하는 개념들을 좀 짚어 보려고 합니다.

Posted by 맨날맑음
,

#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 맨날맑음
,