JPEG 이미지를 decoding하기 위해서는 먼저 JPEG 이미지의 header를 decoding 해야한다.
Header 안에는 decoding하기 위한 여러가지 필수 정보가 존재하는데
Header의 구성과 그 내용을 해석하는 방법에 대해서 알아보도록 하자

1. JPEG 이미지의 구조

아래 그림은 JPEG 이미지의 전체 구조를 나타낸다.


우리가 보통 알고 있는 JPEG 이미지와는 달리 하나의 JPEG 이미지 파일 내에 여러 프레임이 존재할 수 잇는데 이러한 경우 연한 파란색 부분의 데이터가 존재하고
보통의 경우에는 존재하지 않는다.


2. Marker


위 그림에서 빨간색 박스에 해당하는 데이터는 이를 시작하는 이를 나타내는 marker가 시작부분에 붙는다.
Marker는 위에서 보는바와 같이 JPEG 이미지의 구조를 구분하기 위해 사용된다.
모든 marker는 2byte 크기를 갖고, 처음 1byte는 0xFF, 
그 다음 1byte는 marker의 종류에 따라 0xC0~0xFE까지의 수로 되어있다.
JPEG 이미지 파일에서는 marker와 실제 데이터를 분류하기 위하여 나중에 Huffman coded 데이터의 값이 0xFF인 경우 그 뒤에 0x00을 삽입하여, marker가 아님을 명시해준다.
(다른 header payload data에는 0xFF를 그냥 0xFF라고 쓴다. 위의 그림에서 초록색 부분인 ECS영역에 있는 데이터만 0xFF를 0xFF00으로 바꿔준다.)

그럼 JPEG 이미지 파일을 구성하는 marker의 종류와 그 의미를 알아보도록 한다.
다음 표는 JPEG 이미지 파일을 구성하는 marker를 나타나는 순서에 따라 나타낸 것이다.


위의 표는 앞서 제시했던 그림에서 빨간색 박스에 해당하는 부분의 marker와 그것이 의미하는 내용을 보여준다.
표에서 payload data가 variable size로 표기된 항목은
marker 바로뒤에 2byte가 그 payload data의 size를 의미한다. (이 size를 의미하는 2byte를 포함한 payload data의 총 크기. marker는 제외)

예를 들어 보자면


위는 어느 JPEG 이미지를 16진수 모드로 열어 0xFFC0(빨간색)를 찾은 것인데, 
0xFFC0는 표에서 보는바와 같이 SOF0, 즉, Start of Frame이며, Baseline DCT로 이루어진 것을 알 수 있다.
그리고 0xFFC0는 payload data를 variable size만큼 가지는데 이는 marker 뒤 2byte(노란색)에 명시되어 있다.
여기서는 0x0011(17)인것을 알 수 있다.
그럼 17byte중 노란색 2byte를 뺀 나머지 15byte (초록색 부분)이 실제로 SOF0 내부에 들어가 있는 data에 해당한다.


3. Header Information

JPEG 이미지의 header의 구조와 각각의 header 정보를 marker를 이용해 실제로 구분하는 방법을 알아보았다.
그럼 이제 앞서 제시했던 JPEG 이미지의 전체 구조에서
marker로 나누어진 각각의 빨간색 박스의 payload data를 분석하여
더욱 세분화된 정보를 얻어내보도록 하자.

a. SOI
단순히 이미지의 시작을 알리는 marker일 뿐, payload data가 존재하지 않으므로 세부 정보가 담겨있지 않다.

b. APPn
다양한 application specific data가 들어가 있다.
예를 들어, n=0인 0xFFE0의 경우 JFIF데이터가 들어가있고, n=1인 0xFFE1의 경우 Exif데이터가 들어가 있다.
이 marker의 payload data는 variable size이므로 marker 뒤 2byte에 payload data의 size가 명시되어 있다.
이 영역에 있는 data의 경우 application에 따라 그 영역을 쓰는 방법이 다르므로 자세한 설명은 넘어가겠다.
 
c. DQT
Quantization Table이 존재하는 영역이다.
이 영역은 다음과 같이 구성되어 있다.


1. Lq: Length of Quantization table header - Quantization table header의 size
2. Pq: Precision of Quantization table - 이 값이 0일 경우 quantization table의 각 값은 8bit, 1일 경우 16bit로 
                                                       표현된다
3. Tq: Table numver of Quantization table - Quantization table의 번호
4. Table: Quantization table - Quantization table (Pq가 1일 경우 128byte)
여기서 quantization table의 데이터는 아래 그림과 같이 Zig-zag scan 순으로 존재한다.


즉, table 항목의 데이터가 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 순으로 존재한다면,
(0, 0): 0x00
(0, 1): 0x01
(1, 0): 0x02
(2, 0): 0x03
(1, 1): 0x04
(0, 2): 0x05
(0, 3): 0x06
과 같은 순으로 quantization table에 배치된다.

d. SOFn
JPEG 이미지의 한 frame이 시작하는 것을 알리는 영역이다.
여기에서 n에따라 marker가 달라질 뿐만 아니라 그 의미 또한 다른데,
위의 표에서 확인하였듯이 이 n은 수행된 DCT의 method를 의미한다
그 외에도 여러가지 정보가 추가적으로 들어가 있는데 그 내용은 다음과 같다.


1. Lf: Length of Frame header - Frame header의 size
2. P: Precision - Image sample의 quantization bit 수
3. Y: Height - Image의 세로 크기
4. X: Width - Image의 가로크기
5. Nf: Number of Component of Frame - Frame을 구성하는 component의 개수
6. C: Component Number - Component의 번호
    H: H Factor - Subsampling 시 수평 sampling 인자
    V: V Factor - Subsampling 시 수직 sampling 인자
    QT: Quantization Table - Quantization Table 번호
(5(Nf)에서 명시한 수만큼 6의 내용이 반복되어 나온다)

e. DHT
Huffman Table이 존재하는 영역이다.
이 영역에 있는 데이터를 통해 Huffman table을 얻어내는 방법은 조금 복잡하므로 다른 포스팅(링크)에서 따로 설명하도록 한다.

f. SOS
JPEG 이미지의 한 scan data가 시작되는 것을 알리는 영역이다.
이곳에는 여러가지 정보가 추가적으로 들어가 있는데 그 내용은 다음과 같다.


1. Ls: Length of Scan header - Scan header의 size
2. Ns: Number of Component of Scan - Scan을 구성하는 component의 개수
3. Cs: Component Number - Component의 번호
   Td: DC Huffman Table Number - DC Huffman Table 번호
   Ta: AC Huffman Table Number - AC Huffman Table 번호
(2(Ns)에서 명시한 수만큼 3의 내용이 반복되어 나온다)
4. Ss: Spectral Selection Start - Spectral selection 범위의 시작 값
5. Se: Spectral Selection End - Spectral selection 범위의 끝 값
6. Ah: Successive Approximation High - Successive Approximation시 상위 정보
7. Al : Successive Approximation Low - Successive Approximation시 하위 정보

g. EOI
단순히 이미지의 끝을 알리는 marker일 뿐, payload data가 존재하지 않으므로 세부 정보가 담겨있지 않다.

h. COM
주석을 달기위한 marker이다.
이 marker의 payload data는 variable size이므로 marker 뒤 2byte에 payload data의 size가 명시되어 있다.
그 payload data에 이미지 작성자가 달아놓은 주석이 존재한다.


4. ECS (Entropy Coded Signal) Decoding

JPEG 이미지의 실제 encoding된 이미지(위의 그림에서 ECS부분)를 decoding하는 방법은 다른 포스팅(링크)에서 설명하도록 하겠다


5. JPEGSnoop

JPEGSnoop(링크)은 위에서 설명한 JPEG 이미지의 header information을 추출하여 정리해 보여주는 프로그램이다. 이를 이용하면 빠르고 편리하게 JPEG 이미지의 이미지 정보를 알 수 있다.

'IP' 카테고리의 다른 글

[JPEG] JPEG Decoding - VLD (Veriable Length Decoding)  (2) 2011.03.08
[JPEG] JPEG Decoding (Entropy Coded Signal Decoding)  (1) 2011.03.08
[JPEG] JPEGSnoop  (0) 2011.03.08
[JPEG] Huffman Table Decoding  (0) 2011.03.08
YUV test media  (0) 2011.03.07
Posted by sunshowers
,