JPEG 이미지의 header를 분석하고
이미지에 대한 기본적인 정보를 이로부터 얻어 냈다면 (이에 관한 링크)
이제는 실제로 압축된 이미지를 추출해야 할 순서이다.

압축된 이미지 데이터는 JPEG 파일의 ECS(Entropy Coded Signal) 부분에 있는데 
이를 decoding하는 과정은 다음과 같다.


위의 그림에서 ECS decoding, 즉 실제로 이미지를 decoding하는 과정은
Entrophy decoding(VLD), Dequantization, IDCT
3단계이다.


1. Entropy Decoding (VLD)

JPEG 이미지의 ECS데이터는 VLE를 통해 압축이 되어 있는 bit-stream이다.
어떠한 형식이로 압축이 되어 있는지를 예를 들어 간단히 설명하자면 다음과 같다.

0x01 0x01 0x00 0x00 0x03 0x00 0x04 0x00 0x01 0x04

위의 데이터를 분석해보면 0x01이 총 3번, 0x00이 총 4번, 0x04가 총 2번, 0x03이 총 1번 등장한다.

위 데이터를 압축하는 한 방법으로
위의 데이터에서 가장 많이 등장하는 0x00을 가장 짧은 bit으로 표현하고,
가장 적게 등장하는 0x03을 가장 긴 bit으로 표현할 수 있다.

즉,
0x00 1'b0    (1bit)
0x01 2'b10   (2bit)
0x04 3'b110  (3bit)
0x03 4'b1110 (4bit)
으로 표현하면

위의 8*10 bit, 전체 80 bit짜리 데이터는

1010 0011 1001 1001 0110

의 총 20bit으로 표현이 가능하다.

위와 같은 방법으로 JPEG은 등장하는 빈도수에 따라 해당 데이터의 암호 길이를 정해 
이미지 데이터를 압축하여 ECS데이터에 저장한다.
그리고 JPEG에서의 초록색 대화상자 내용과 같은 mapping 정보는 Huffman Table이라고 하며,
이는 JPEG이미지의 header에 저장되어 있다.
이를 추출하는 방법은 링크되어 있는 포스팅에서 설명하였다. (링크)

즉,
이 단계에서는
JPEG 이미지의 header에 명시되어 있는 Huffman Table을 가지고
ECS의 데이터를 쭉 따라가면서 원래의 데이터를 복원하는 일을 한다.

이에 대한 자세한 설명은 다음 포스팅에서 설명하도록 하겠다. (링크)


2. Dequantization

위의 ECS decoding (VLD) 단계를 거치면
이미지의 각각의 Y, U, V component에 대해서 8x8 단위, MCU (Minimum Coded Unit)로
이미지 데이터가 나온다.

이 MCU에 대해서 간단히 설명하자면,
보통 YUV, RGB와 같은 이미지 데이터는
한 이미지의 최상위 line의 좌측에서 우측 pixel순으로 데이터가 저장되어 있다.

반면 JPEG에서는 이미지가 압축되어 있는 단위가
이미지의 좌측 상단으로부터 우측방향으로
각각의 Y, U, V component에 대해서 8x8 pixel 단위의 MCU로 저장되어 있다.

즉, 하나의 각각의 Y, U, V component의 MCU를 decoding하면,
8x8 pixel의 decoding된 이미지 데이터가 나오는 것이다.

다시 돌아와서, ECS decoding (VLD) 단계를 거치면,
각각의 Y, U, V component에 대해 8x8 pixel의 MCU 데이터가 나오는데,
이는 단순한 pixel 값이 아니다.

Decoding 된 데이터는 frequency domain의 값이고, 1개의 DC성분과 63개의 AC성분으로 구성되어 있다.
그리고 또 그 frequency domain의 값은 weighted 되어 있다.

여기서 왜 JPEG 이미지를 만들때 frequency domain으로 바꾸어서 저장하는지에 대해 설명하도록 하겠다.
우리가 이미지를 압축하는 목적은 그 데이터의 양을 줄이기 위해서이다.
그리고 모든 데이터를 완벽하게 그대로 보존하여 저장하면 가장 좋겠지만 그러는데에는 한계가 존재한다.

그래서 JPEG에서는 어느정도의 데이터의 손실을 감수하면서 그 데이터의 양을 최대한 줄인다.
하지만 이 데이터의 손실은 우리가 눈으로 보는데 거의 차이가 없어야 할 것이다.

우리가 실생활에서 쓰는 방법 중 데이터의 양을 줄이는 가장 쉬운 방법은 아마도
일정한 수로 나누고 반올림하여 자리수를 낮추어 관리하는 방법일 것이다.
이는 나누는 과정에서 어느정도의 손실이 있긴 하지만,
가장 쉬우면서도 효율적인 데이터 압축 방식임에는 분명하다.

이와 마찬가지로 JPEG 이미지에서도
데이터를 일정한 수로 나누어 자리수를 낮추어  데이터의 양을 줄이는데,
이러한 과정을 그냥 pixel 값에 적용하게 되면
나누고 반올림하는 과정에서 원래는 서로 다른 값의 두 pixel의 값이 같아져서
이미지를 복원할 때(이때는 나눈 일정한 수를 곱해줄 것이다.) 복원한 값이 같아 그림이 뭉개져보일 것이다.

하지만 이 나누고 반올림하는 과정을 frequency domain에서 하면 매우 효과적이다.
Frequency domain은 아래 그림과 같이
그림의 한 영역에 대해서 variation의 정도에 따라 그 값을 정하게 되어있다.


그런데 사람의 눈은 넓은 영역에서 그 밝기의 차이는 잘 알아차리지만,
좁은 영역에서의 그 밝기의 차이는 쉽게 비교하질 못한다.
즉, 사람의 눈은 위의 그림에서 좌측 상단에 있는 완만한 패턴의 밝기의 변화는 쉽게 알아차리지만,
우측 하단에 있는 패턴의 밝기 변화는 쉽게 알아차리지 못하는 성향이 있다.

이러한 사람의 눈의 성질을 이용하여 JPEG은 JPEG 이미지를 생성할 때 
8x8 pixel의 데이터를 frequency domain으로 바꾼 다음
모든 MCU에 대해서 각각의 DC, AC성분에 대해서 일정한 weight를 주어 나누는데
위의 그림에서 좌측 상단에 해당하는 값은 사람의 눈이 민감하게 반응하므로 weight를 조금만 주고,
우측 하단의 경우 사람 눈이 둔감하므로 그다지 중요하지 않으므로 weight를 많이 주어 관리하면
이미지에는 크게 영향을 주지 않으면서 데이터의 양을 줄이는 것이 가능하다.

이와 같이 weighted 된 frequency domain의 1 DC, 63 AC성분의 값을 받아
header decoding을 통해 얻은 quantization table로부터 각각 성분의 weight 값을 찾아
그 값을 곱해주는 과정이 바로 dequantization 과정이다.

즉, 데이터의 양을 줄이기 위해 어떠한 수로 나누었던 데이터를
그 나눈수를 곱해주어 원래의 데이터를 복구하는 과정이다.
그리고 각각의 DC, AC성분에 대해 그 나눈 수
header decoding을 통해 얻은 quantization table에 명시되어 있다.

이 과정에 대한 자세한 설명은 다른 포스팅에서 설명하도록 하겠다 (링크)


3. IDCT

위의 두 과정을 거쳤다면 우리는 하나의 MCU에 대해
frequency domain의 1 DC, 63 AC성분의 값을 얻을 수 있을 것이다.

그러면 이 frequency domain의 64개의 값을 통해
이제 8x8 pixel의 pixel값을 얻어내야 할 것이다.

이를 위해서는 domain conversion을 해야하는데
이를 위해 해주는 것이 IDCT (Inverse Discrete Cosine Transform)이다.
이 과정을 수행하고 나면,
8x8 pixel에 대한 64개의 [-128, 127] 값이 나오게 되는데,
여기에 256을 더해주면
우리가 구하고자하는 8x8 pixel에 대한 [0, 255]의 pixel 값이 나오게 된다.

즉, 이 과정에서는 우리가 데이터의 효율적인 압축을 위하여 바꾸어 주었던 domain을
frequency domain에서 pixel value domain으로 바꾸어주는 과정이다.
(거기에 모든 pixel에 256값을 더해주는 과정을 추가한다.)

이에 대한 자세한 설명은 다른 포스팅에서 하도록 하겠다 (링크)


'IP' 카테고리의 다른 글

[JPEG] JPEG Decoding - VLD (Veriable Length Decoding)  (2) 2011.03.08
[JPEG] JPEGSnoop  (0) 2011.03.08
[JPEG] Huffman Table Decoding  (0) 2011.03.08
[JPEG] Image Format, Decoding (Header Format)  (2) 2011.03.08
YUV test media  (0) 2011.03.07
Posted by sunshowers
,