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

#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

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

가장 덥다는 말복이 바로 어제 였습니다. 다들 ‘삼계탕’은 맛있게 드셨는지 모르겠네요; 저는 이마트의 닭이 매진되어 삼계탕은 못 먹고 말았네요 ㅠ_ㅠ 그 큰 마트에서 매진이라니..말복 때 죽음을 맞이한 수많은 닭들에게 감사할 때 입니다;

이번 포스팅에서는 동영상 압축의 핵심이라 할 수 있는 Block-based Motion Estimation(이하 ME)에 관해 알아 보려고 합니다.

본 내용으로 들어가기 전에 ME에 관해 간단히 소개하자면, 지난 시간에 프레임과 그 인접한 프레임은 거의 비슷한 형태로 이루어 져 있다고 하였습니다. 만약 프레임1과 프레임2가 있을 때 프레임2는 1과 거의 비슷하기 때문에 굳이 모든 데이터를 가지고 있을 필요 없이, 1의 어느 부분과 비슷하다..라고 표시만 해주는 방법으로 데이터의 양을 줄이게 됩니다. 이렇게 하기 위해서 ME를 하여, 프레임1(Reference Frame) 에서 어느 부분과 가장 일치하는지 찾아주는 과정이라고 할 수 있습니다. 아래에서 자세히 알아보도록 하죠.

#1. Block-based?

위에서 Block-based Motion Estimation라고 했습니다. 굳이 번역하자면 블럭 기반의 움직임 추정(?)이라고 하면 될 것 같습니다. 그럼 블럭 기반이라는 말부터 살펴 보면 ME를 할때 프레임 전체를 한번에 하는 것이 아니라 하나의 프레임을 잘게 잘라(8×8, 16×16 or 32×32) 사용하게 됩니다. 기본적으로는 16×16의 매크로 블럭(Macro-Block)을 사용하게 됩니다.


-그림1. 16×16 Macro Block으로 나눈 모습-

#2. Motion Estimation



-그림2. Motion Estimation 개념도-

그림 2가 이해 가시나요?  Frame(t)(현재 프레임)에서 3번째 매크로 블럭을 처리하고 있다고 가정 합니다. Frame(t-1)(이전 프레임)에서 매크로 블럭과 가장 비슷한 곳을 찾는 모습이죠. 저 빨간색 사각형은 Frame(t-1)에서 비슷한 곳을 찾을 Search Range(검색 범위) 입니다. 눈으로 보아도 분홍색 화살표가 가르키고 있는곳이 현재 매크로 블럭과 많이 일치하는 것을 알 수 있습니다. Search Range는 임의로 정할 수 있지만 일반적으로 Block Size의 ±7을 사용하게 됩니다.

그럼 그림처럼 현재 매크로 블럭이 이전 프레임과 가장 일치하는 최고의 매칭 포인트를 어떻게 찾게 되는지 매우 궁금 해 집니다. 비밀은 바로 SAD 방정식에 있습니다. SAD 방정식을 사용하여 최고의 매칭 포인트를 찾아 내는 것이지요.


-그림3 SAD equation-

수식을 보니 갑자기 머리가 아파옵니다. 저 같이 수식 알러지가 있으신 분들을 위해 친절하게 그림으로 설명해 드리죠.갑자기 제가 친절한 금자씨(?)라도 된 것 같습니다;



 -그림4. Motion Estimation 과정(1)-

그림 4를 보면서 설명 하겠습니다. 이 그림은 이전 프레임(frame t-1)을 나타냅니다. 사각형 하나는 하나의 픽셀입니다. 빨간색 사각형으로 Search Range(검색 영역)가 있습니다. Cerrent block이 바로 현재 프레임의 매크로 블럭입니다. (원래 16x16으로 해야 하지만 그림 그리는 것도 만만치 않습니다)



 -그림5. Motion Estimation 과정(2)-


그림 5에서 보는 것 처럼 Search Range를 매크로 블럭으로 탐색 하면서 Frame(t-1) - Cerrent block 를 계산하여 그 ‘절대값’을 Origin에 저장하게 됩니다.



 -그림6. Motion Estimation 과정(3)-


이렇게 계산된 값들 중 그림 6에서 처럼 가장 작은 값을 찾는 것이죠. 숫자 22가 들어있는 좌표(6.5)가 최소값을 갖는 바로 Current Block과 가장 일치하는 이전 프레임의 좌표인 것입니다. 이 지점을 Motion Vector라고 합니다. 즉 이전 프레임에서 현재 블럭과 가장 일치하는 지점을 말합니다.



-그림7. Motion Vector-


이렇게 Search Range의 모든 좌표를 전부 검색하는 방법을 Full Search라고 합니다. 이러한 ME의 과정은 코덱이 영상을 압축하는 과정에서 많은 비트 수를 감소 시켜 주게 됩니다.  그림7의 단순한 프레임과의 차이와 ME를 사용한 차이를 보시면 확연하게 그 차이를 알 수 있습니다.(흰색이 데이터가 있는 부분입니다) ME를 했을 경우는 잔여 데이터가 거의 없는 것을 볼 수 있습니다.



-그림8. 단순한 프레임간의 차와 ME를 수행 했을 때의 차이-

 

그런데 ME는 전체 인코딩 과정중에 가장 많은 부하(?)를 일으킵니다. ME를 통해 데이터의 양은 많이 감소하게 되지만 Search를 하는 계산 과정이 있기 때문에 속도는 많이 떨어지게 되는 것이죠. 실제 H.264에서는 Full Search외에 여러 가지 Search 방법(예. 다이아몬드 서치)을 통해 속도 향상을 할 수 있도록 하고 있습니다.(이런 방법들은 차차 소개하도록 하겠습니다)

글이 많이 길어지는군요.. ME를 간단하게 요약 해 보자면.
  • 현재 프레임(t)의 처리 할 매크로 블락을 만든다.
  • 이전 프레임(t-1)에 Search Range를 설정한다.
  • Search Range를 SAD 방정식으로 Search 하여 그 결과 값을 저장한다.
  • 결과값 중에 가장 작은 값(Motion Vector)을 찾는다.
  • Moton Vector의 매크로 블럭과 현재 매크로 블럭의 차이의 절대값을 결과(Residual) 데이터에 저장한다. 


#3. 디코더(Decoder)의 데이터 복구

지금까지 인코더(Encoder) 측에서 ME를 통해 데이터를 줄이는 방법을 상세하게 설명 했습니다. 그렇다면 디코더에서는 어떻게 Residual 데이터를 가지고 원본 데이터를 복원해 나갈까요?


-그림9. 디코더는 어떻게 원본 이미지를 복원 할 수 있을까?-


정답은 ME의 과정을 반대로 수행 하면 될 것입니다. 디코더 또한 현재 프레임을 되 살릴 때 매크로 블럭 단위로 복원하게 됩니다. 그렇다면 디코더가 매크로 블럭을 복원하기 위해 가지고 있는 데이터는 무엇이 있을까요? 디코더는 바로 이전에 처리한 이전 프레임의 원본 이미지(사실 조금의 손실이 있는..)와 현재 프레임의 Residual 데이터를 가지고 있을 것 입니다. 이 두 가지를 가지고 현재 복원 할 매크로 블럭의 Residual 데이터와 이 Residual 데이터가 이전 프레임의 어디에 위치하였는지(Motion Vector)정보를 이용하여 둘을 합하여 현재 블럭을 복원 하는 것입니다. 그림 10과 같이 이러한 방법을 반복하여, 프레임 전체를 복원 하게 됩니다.



-그림10. 디코더의 이미지 복원 과정-
 


#4 . 실습

ME의 과정이 이해 가시나요? 설명 만으로는 100% 자신의 것으로 만들기 어렵습니다. C나 C++을 이용하여 프로그램을 만들어 보면 확실하게 이해가 될 것 입니다.

준비물.

  • 각자 익숙한 개발 툴(저는 Visual Studio 2008)
  • 실습에 필요한 YUV 파일 Download(http://trace.eas.asu.edu/yuv/)
    - 저는 football_sif.yuv 사용
  • 결과를 확인하기 위한 YUV 플레이어
    - 이 플레이어를 열고 마우스 오른쪽 버튼을 누른 후 셋팅에서 화면의 해상도와 Color 타입을 조정하여 사용하면 됩니다.

 

준비가 되었으면, ME를 작성 해 보시면 됩니다. 그런데 가장자리를 Search 하기 위해서는 Search Range가 –인덱스가 나오는 경우가 발생 하므로, 저는 학습의 편의상 동영상의 가장자리 16은 ME의 대상에서 제외 하도록 하였습니다.


아래에 제가 만들어본 프로그램을 올려 놓지만, 꼭 자신이 만들어 보아야 자신의 것이 됩니다.

프로그램을 컴파일 한 후, Debug 폴더안의 실행파일을 실행 시켜 ME를 수행 할 수 있으며, 결과는 Root 폴더의 Me_sample에서 residual.foo 파일을 열어 보면 확인 가능 합니다



#. 마치면서

이번 포스트에서는 동영상 압축의 핵심인 ME에 대한 자세한 소개와 디코더 쪽에서 데이터를 복원하는 방법을 알아 보았습니다. 다음번에는 DCT를 이용하여 데이터의 비트 수를 줄이는 방법에 대해 자세히 알아 보겠습니다.

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

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

이전 포스팅에서는 동영상의 정의와, 동영상을 압축하는 기본적인 방법에 대해 간단히 살펴 보았습니다.
이번 시간에는 동영상을 압축하는 자세한 방법을 알아보기 전에 색공간 RGB, YUV(YCbCr) 그리고 YUV 서브샘플링에 대해 알아 보도록 하겠습니다.

본론으로 들어가기 전에 간단하게 색공간(Color Space)에 관해 알아 보도록 하겠습니다.
위키의 설명에 보면 색공간은 색표시계를 3차원으로 표현한 공간 개념이라고 나와있습니다. 즉 색을 표현하는 방법은 여러가지(RGB, CMYK, HSV, CIE, YCbCr 등)가 있는데 각각이 색을 표현하는(담는) 방법이라고 생각해도 될 것 같습니다.

#1. RGB 색공간

-그림1. RGB 채널의 원리 -

빛의 삼원색(빨강, 녹색, 파랑)을 이용하여 색을 표현하는 방법 입니다. 원색 신호라고도 불립니다. 일반적으로 TV나 모니터, HTML의 색상표현에 쓰이며,  컴퓨터의 모니터는 RGB방식을 사용하므로, 우리가 영상을 화면에 디스플레이 하기 위해서는 RGB로 변화 하여야만 합니다. 각 값들은 0~255까지의 값(8bit)을 가지고 있으며, 각 값들을 가산 혼합하여 색상을 표현합니다.

#2. YCbCr 색공간

-그림2.  YCbCr 이미지의 구성요소-

YCbCr에서 Y는 휘도(빛의 양)이고, Cb와 Cr은 색차(크로마)를 나타냅니다. 색차 신호라고도 불립니다.이 방식은 RGB보다 색상의 분리 및 전달 효과는 약하지만, 적은 데이터로 보다 많은 색상을 나타낼 수 있는 장점을 가집니다.

YUV를 사용하는 대표적인 기계는 텔레비전입니다. 지금은 전부 칼라 텔레비전이지만, 예전 흑백의 경우 휘도(밝기)만을 가지고, 방송을 하다가, 컬러TV는 CbCr성분을 더해서 방송을 하기 때문에 지금에 와서도, 흑백 TV를 볼 수 있는 이유입니다. Y 성분만 뽑아 쓰면 되니까요.

이 방식에서 흑백을 표현하기 위해서는 Y 성분만 있으면 됩니다. 사람이 물체를 인식하는데 휘도(밝기)에 민감하지 그 외 Color 성분은 별로 민감하지 않습니다. 이것은 눈의 특성을 보면 알 수 있는데요, 사람의 눈에서 휘도를 구분하는 ‘간상세포’는 눈 전체영역에 분포하게 되고, 색을 구분하는 ‘원추세포’는 눈의 중심부에만 분포하여, 사람의 눈은 색상보다는 밝기에 민감하게 됩니다.

이렇게 때문에 사람이 민감하지 않은 모든 색상정보를 전부 포함해야 하는 RGB방식에 비해서, 적응양의 데이터(약 2/1)로도 비슷한 화질을 낼 수 있게 됩니다. (아래 설명 할 서브샘플링을 하였을때..)

영상장치가 영상을 만들 때, 빛을 인식하여(RGB)를 YUV로 바꿔 주게 되며, YUV를 압축하기 위해 서브샘플링을 하여 데이터를 줄이고, 저장장치에 저장하게 됩니다. 계속 알아야 할 개념이 늘어나고 있습니다. 다음은 서브샘플링에 관해 알아보겠습니다.

#3. YbCbCr 서브샘플링

동영상(Image)의 크기를 줄이기 위해 YbCbCr을 그대로 사용하기 보다는 압축하는 것이 효율 적입니다. 앞서 설명처럼 인간은 색차 보다는 밝기에 더 민감하기 때문에 샘플링에서도 이러한 기법을 사용함으로써 데이터를 압축 할 수 있습니다. 쉽게 말해 Y성분을 CbCr보다 많이 할당 함으로써 데이터를 줄이는데 감소한 데이터에 비해서 시각적인 차이는 거의 없게 됩니다.

러한 샘플링 기법은 Y Cb Cr의 각각의 비율에 따라 조금씩 다르게 나누어 집니다. 인코딩에서 사용하는 샘플링 비율은 아래의 3개의 비율을 사용합니다.

  • YCbCr 4:4:4 format

                                                  - 그림3. YCbCr 4:4:4 format -
     각 픽셀당 Y Cb Cr이 각각 4개가 들어가게 됩니다.

 

  • YCbCr 4:2:2 format
                                                       - 그림4. YCbCr 4:2:2 format -
    각 픽셀당 2개의 블럭을 기준으로 Y 4개 CbCr 2개를 공유하여 사용합니다.

  • YCbCr 4:2:0 format (YCbCr 4:1:1)
                                                        - 그림5. YCbCr 4:2:0 format -
    이 방식이 동영상 인코딩시 표준으로 쓰입니다. 그림5를 보면 YCbCr 4:1:1로 표현하는 것이 맞지만 표준화 기구에서 정한 이름이 4:2:0이라고 합니다. 저도 처음에 이름 때문에 좀 개념이 해깔렸습니다. 각 픽셀당 Y 4개 CbCr 1개를 공유하여 사용합니다.

    내용 추가 '09.09.02
    YCbCr (4:2:0) 와 YCbCr (4:1:1) 의 차이는 같이 사용하는 자료들도 있고 다르게 구분하는 자료들도 있는 것 같군요. 그래서 제 생각에는 YCbCr (4:2:0) 와 YCbCr (4:1:1)이 유사하다고 생각하면 댈 것 같습니다.  실제로 많은곳에서  같은 서브샘플링 개념으로 사용되고 있는 것도 사실이니까요.


#4. YCbCr 4:2:0 video format일 경우 데이터 구조는 어떠할까요?

데이터의 Type은 Byte이고 값은 0~255의 값이 들어갑니다. 그리고 중요한 것은 YCbCr의 경우 파일의 정보를 표시하는 ‘헤더’는 존재 하지 않습니다. 그래서 다음과 값은 데이터 구조를 가지게 됩니다.


-그림6. YCbCr 4:2:0의 데이터 구조-

빨간 점선은 프레임의 구분을 의미 합니다. 즉 한 프레임에 해당하는 Y정보가 먼저 나오고, 뒤를 이어 Cb Cr의 정보가 파일에 쓰여 있습니다. 예를 들어  해상도가 10X10이고, 10개 Frame으로 구성된 동영상의 경우 Y 100개, cb 25개, Cr25개의 정보가 쭉 이어 나오고 또 Y 100개, cb 25개, Cr25개의 정보가 쭉 이어 나오는 식으로 총 10개(10 프레임이므로)가 나열 됩니다.

 

생각보다 간단한 구조입니다. 이렇게 생각해 보면 파일에서 100Byte를 읽어오고 50Byte 건너뛰고 또 100Byte를 읽고 50Byte를 건너뛰는 방법으로 파일을 읽어 새롭게 저장하면, 원래 영상에서 흑백영상을 뽑아 올 수도 있습니다.

이번엔 RGB, YCbCr의 색공간에 대해 살펴 보았고, 서브샘플링에 관해서도 살펴 보았습니다. 다음 번에 어떠한 내용부터 올려야 할지 아직 잘 모르겠네요. 일단은 Motion Estimation 기법에 관해 올리려고 생각 중에 있습니다.




-------------------------------------------------------------------------------------------------------------------------------------------

# 마치면서..(좀더 알아볼 점)

  • YCbCr에서 Y는 어떤(? 정확히 모르겠어요) 용어와 해깔리지 않기 위해 Y’라고 표현해야 맞다고 합니다. 즉 Y’CbCr입니다. 대강 설명하자면 아날로그 인코딩과 디지털 인코딩 방식의 차이라고 알고 있습니다.
  • YUV와 YCbCr이 같은 거처럼 글을 썻지만, 사실 비슷하지만 조금 다른 개념인 것 같습니다. 저는 인코딩에 필요한 개념으로 용어에 따른 차이가 있을 수 있겠습니다.

 

참고 사이트 : http://www.fourcc.org/

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

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

#0. 들어가며..

방학을 이용하여, H.264 코덱을 공부하는 것을 목표로 해서 동영상의 인코딩, 디코딩에 관해 배워 나가고 있습니다.

이 내용들은 제가 세미나를 통해 배운 내용을 나름대로 정리하여 잊어 버리지 않게 하는 것이 용도이고, 저도 세미나 도중 이해 가지 않는 부분이 있으므로, 제가 올린 내용이 틀릴 수 있습니다. 내용에 틀린 점이 있을 시 지적해 주시면 즉시 내용을 수정 하도록 하겠습니다.

#1. 동영상이란?

동영상 압축의 기본을 알기 위해선 우선 동영상이 무엇인지 알아야 합니다.

 
-그림1. 동영상의 구조-

위의 그림에서 알 수 있듯이 동영상은 정지된 사진(프레임)이 시간을 축으로 여러 장 모여 있는 것입니다. 즉 주어진 시간 동안 연속으로 촬영된 사진이라 볼 수 있습니다.(사실 여기서 소리도 포함 되야 하지만, 소리는 별도의 인코딩 과정을 거친 후 먹싱 되므로 소리는 빼고 생각해 보겠습니다.)

렇다면 동영상(RGB 비디오)의 데이터 크기는 어떻게 될까요? 프레임은 그림파일(Image)와 같습니다. 예를 들어 512×512의 동영상이 있다고 하면, 이 동영상의 한 프레임을 기준으로 가로 : 512, 세로 : 512개의 점(픽셀)으로 구성되어있으며, 1픽셀은 8bit(256 levels)입니다.  그 중에서 회색이 차지하는 비율만 생각해 보면, Width×Height×Bit(512×512×8)가 됩니다. 그리고 3개의 Color들로 구성 되어있으므로, RGB의 경우 Width×Height×Bit×Color(512×512×8×3)이 되어 6291456bit가 됩니다. 6291456(bit) == 6144(kbit) == 6(mbit) 입니다.

512×512라는 비교적 작은 사이즈의 동영상도 무 압축일 경우, 한 프레임에 6메가라는 큰 사이즈가 되는 것입니다. 동영상서비스를 제공 할 경우 적어도 초당 24프레임을 보장해야 한다고 하니 1초의 동영상에 144메가라는 큰 용량이 필요한 것입니다. 이것이 우리가 동영상 압축을 공부해야 하는 이유이기도 합니다.

네트워크 기술이 많이 발달하였지만, 이런한 무 압축 비디오까지 실시간으로 전송 하는 데는 역부족 입니다. 더군다나 요즘 많이 보급된 FullHD의 경우 1920×1080의 해상도를 지원해야 하기 때문에, 어마어마한 데이터 양이 될 수 밖에 없습니다. 또한 네트워크 대역폭이 이 정보를 전부 전송해 줄 수 있다고 하더라도, 동영상의 크기를 줄여, 그 남는 대역폭을 이용하여 여러 다른 서비스를 제공 해 줄 수도 있을 것입니다.

 

#2. 동영상 압축 기법(동영상 압축을 위한 기본적인 방법)

이러한 동영상을 압축 하려면 어떻게 해야 할까요?

동영상 압축에는 크게 세 가지 기법이 사용 됩니다. 첫번째는 프레임 간의 상관관계 (temproal correlation)이고, 두번째는 공간적인 상관관계(spatial correlation)입니다. 세번째는 저주파 성분에 민감한 시각의 특성을 이용합니다 (DCT 변환).

                        -그림2. 프레임 9-                                                   -그림3. 프레임 10-

먼저 프레임간의 상관관계를 알아보도록 하겠습니다. 그림 2와 3은 각각 같은 동영상(football_sif.yuv)의 9번과 10번 프레임입니다. 마치 같은 그림처럼 닮아있습니다.  근접한 프레임은 거의 비슷한 이미지로 이루어져 있다는 아이디어를 이용하여, 영상의 크기를 줄일 수 있습니다.


-그림 4. Image의 공간적인 중복-

그림 4에서 보는 것과 같이 한 장의 이미지에도 인접한 픽셀간의 정보는 거의 중복 된다는 것을 알 수 있습니다. 이방법으로도 영상의 크기를 줄 일 수 있을 것입니다.

Temporal correlation(프레임간의 상관관계)은  그림 5,6처럼 현재 프레임(t)의 하나의 픽셀(x,y)은 이전 프레임(t-1)의 비슷한 위치(x,y)에 있을 가능성이 높고, 또한 두 필셀 사이에는 유사성이 높다는 것입니다.

                       -그림 5. Frame(t)-                                                -그림 6. Frame(t-1)-

이렇게 프레임(t)에서 프레임(t-1)과의 차를 계산해 보면 중복 데이터가 사라지고, 차이인 그림 7이 나오게 됩니다.


      -그림 7. Frame(t) 와 Frame(t-1)의 Difference - 


이번에 간단한 동영상의 정의와, 동영상을 압축하는 기본적인 방법을 알아 보았습니다. 다음에는 RGB와 YUV를 알아보고, 위에서 간단히 소개한 압축의 기법들을 자세히 소개하는(주파수 도메인(DCT)을 이용한 방법, Motion Estimation 등) 순으로 진행 할 예정이며, 기본적인 지식을 갖춘 후, H.264에 대해서도 알아 보도록 하겠습니다.

Posted by 맨날맑음
,