'jpeg'에 해당되는 글 2건

  1. 2009.10.10 [JPEG] JPEG의 파일구조
  2. 2009.10.09 [JPEG] JPEG 개요
파일 구조2009.10.10 00:02
1. JPEG 파일의 분석


JPEG은 기본적으로 위 그림처럼 파일의 제일 처음 2byte에 FF D8 이 위치한다.
이를 SOI (Start Of Image) marker 라고 하며 이를 통해 JPEG Format 여부를 판단할 수 있다.

JPEG 파일 구조란 JFIF(JPEG File Interchange Format)을 의미한다.

 SOI (Start Of Image)
 APP0 JFIF Marker
 추가 APP Marker(APP0 ~ APP15)
 DQT (Define Quantization Tables)
 SOF (Start Of Frame)
 DHT (Define Huffman Tables)
 SOS (Start Of Scan)
 Scan Data
 EOI (End Of Image)

[ JPEG 기본 구성 블록 ]


(APP0 JFIF Marker 부분에 APP1이 들어갈 수도 있는것 같다;)

각 블록은 Marker에 의해 구분된다. Marker는 0xFF 로 시작되는 2 바이트 데이터로 Marker 하나로 끝나는 것도 있고 Marker 뒤에 추가 데이터가 더 붙는 것도 있다. 추가 데이터가 더 붙는 경우 Marker 뒤에 2 바이트의 데이터 길이가 오고 그 다음 추가 데이터가 온다. 데이터 길이는 데이터 길이 필드를 포함한 길이다. 한가지 주의할 것이 지금까지 살펴본 그래픽 파일에서는 상위 바이트와 하위 바이트의 순서가 바뀌어서 저장되어 있는데 JPEG 파일에서는 그 순서가 뒤바뀌어서 저장되지 않는다는 점이다. 예를 들어 0x12 0x3F 순으로 저장되어 있다면 0x3F12가 아니고 0x123F를 가리키는 것이다.

분류

심볼

설명

추가 데이터 없음

FFD0~FFD7

RST0~RST7

Restart marker

FFD8

SOI

Start Of Image

FFD9

EOI

End Of Image

추가 데이터 있음

FFC0~FFC2

SOF0~SOF2

Start Of Frame

FFC4

DHT

Deine Huffman Tables

FFDA

SOS

Start Of Scan

FFDB

DQT

Define Quantization Tables

FFDD

DRI

Define Restart Interval

FFE0~FFEF

APP0~APP15

Application specific data

FFFE

COM

Commnet


[ JFIF에서 사용되는 Marker ]

JPEG 표준에는 이보다 더 많은 marker들이 정의되어 있으나 JFIF에서는 거의 쓰이지 않는다. 각 블록을 더 자세히 살펴보자.
SOI와 APP0 JFIF Marker
파일의 맨 처음 오는 marker들로 주로 JFIF임을 확인하는 용도로 사용된다. 그 구조는 표 2와 같다.

이름

크기

설명

SOI marker

2

항상 FF D8

APP0 marker

2

항상 FF E0

Data length

2

추가 데이터 길이. 바이트 단위. 상위 바이트, 하위 바이트 순으로 저장되며 Data length 필드를 포함한 길이를 나타낸다.

Identifier

5

항상 4A 46 49 46 00. JFIF임을 나타낸다.

Major version ID

1

버전 번호.

Minor version ID

1

버전 번호.

Units

1

다음 오는 X, Y 해상도의 단위를 나타냄.

0 – 해상도 사용 안함
1 –
단위 인치 픽셀
2 – 단위 cm 픽셀

Xdensity

2

가로 해상도

Ydensity

2

세로 해상도

Xthumbnail

1

미리 보기 이미지의 . 미리 보기가 없으면 0.

Ythumbnail

1

미리 보기 이미지의 높이. 미리 보기가 없으면 0.

Thumbnail

가변

미리 보기 이미지. RGB 컬러 순으로 픽셀 데이터가 저장되어 있다.

[ 표 2 SOI와 APP0 JFIF marker의 구조 ]

추가 보조 Marker : APP0 marker 외에 미리 보기 이미지를 추가로 더 넣거나 주석을 달기 위해 몇 가지 marker가 더 올 수 있다. 보통 이들 marker들은 그림 이미지 자체에 전혀 영향을 주지 않으며 어플리케이션 프로그램에서 보조 자료로 쓰일 뿐이다. marker 뒤에 추가 데이터 길이 필드가 오는데 이를 이용해 다음 marker로 건너 뛸 수 있다.


DQT marker
DQT는 양자화 테이블(Quantization table)을 보관하는 블록이다. 표 3과 같은 구조로 되어 있다.

이름

크기

설명

DQT marker

2

항상 FF DB

Data length

2

추가 데이터 길이.

Quantization table

 

양자화 테이블. 최대 4개의 테이블을 가질 있다.

[ 표 3 DQT marker의 구조 ]

JFIF는 최대 4개의 양자화 테이블을 보관할 수 있다. 각각의 양자화 테이블 구조는 표 4와 같다. 테이블 값은 8비트 샘플링의 경우 1바이트, 12비트 샘플링의 경우 2바이트 크기를 가진다.

Table Identifier

1

상위 4비트 : 테이블 크기. 0= 1바이트. 1=2바이트.
하위 4비트 : 테이블 ID. 0~3 사이의 값을 가진다.

Table

64 또는 128

양자화 테이블. 8 x 8 테이블이 지그재그 순서로 저장되어 있다. (그림 5‑28 참고)

[ 표 4 양자화 테이블의 구조 ]

[ 그림 2 양자화 테이블 값이 저장된 순서 ]


SOF marker
SOF는 그림 이미지의 크기 및 샘플링에 관한 정보를 보관하고 있다. 표 5는 SOF 블록의 구조이다.

이름

크기

설명

SOF marker

2

항상 FF C0 ~ FF C2

FFC0 – baseline
FFC1 – extened sequential
FFC2 - progressive

Data length

2

추가 데이터 길이.

Sampling precision

1

샘플링 비트 8 또는 12

Image height

2

이미지 높이. 픽셀 단위.

Image width

2

이미니 . 픽셀 단위.

No fo components

1

Y, Cb, Cr 성분 . 1 ~ 3.

Component specific

 

성분에 대한 정보.

[ 표 5 SOF marker 구조 ]

JFIF는 Y, Cb, Cr 세 가지 성분 중 하나 또는 3가지 모두를 저장할 수 있다. 각 성분에 대한 정보는 표 6과 같은 구조로 저장되어 있다.

이름

크기

설명

Component ID

1

성분을 구분하기 위한 ID. 0~255 사이의 값을 가질 있으나 JFIF에서는 Y 1, Cb 2, Cr 3으로 고정되어 있다.

Sampling Frequency

1

상위 4비트 : 해당 성분의 가로 샘플링 주기 (1~4)

하위 4비트 : 해당 성분의 세로 샘플링 주기 (1~4)

Quantization table ID

1

해당 성분에서 사용할 양자화 테이블의 ID 0 ~ 3 값을 가진다.

[ 표 6 YCbCr 성분에 대한 정보 ]

SOF는 JPEG 파일 안에 오직 하나만 존재할 수 있다.


DHT marker
DHT는 Huffman 코드 테이블을 보관하고 있는 블록이다. Huffman 코드 테이블은 AC 계수용, DC 계수용이 따로 보관되며 각각 최대 4개의 테이블을 가질 수 있다. 각 테이블의 구조는 표 7과 같다.

이름

크기

설명

DHT marker

2

항상 FF C4

Data length

2

추가 데이터길이.

Huffman table

 

Huffman table 구조 참고

하나의 Huffman table 구조

이름

크기

설명

Table ID

1

상위 4비트 : Table class. 0 DC 1 AC 테이블을 의미.

하위 4비트 : Table ID. 0 ~ 3 값을 가진다.

Codelength Counter

16

코드 길이가 1 ~16 코드의 개수를 보관하고 있다.

Symbols

가변

Huffman 코드 순서대로 코드가 가리키는 실제 데이터를 보관하고 있다. 전체 크기는 codelength counter .

[ 표 7 DHT marker ]


SOS marker
SOS는 각 성분들이 어떤 Huffman table을 사용할지 알려주는 블록이다. 그 구조는 표 8과 같다.

이름

크기

설명

SOF marker

2

항상 FF DA

Data length

2

추가 데이터 길이.

Component count

1

성분 개수

Scan description

 

성분이 사용할 Huffman table ID

Spectral selection start

1

DCT 최적화할 사용하는 .

Spectral selection end

1

Successive approximation

1

[ 표 8 SOS marker ]

Scan description은 성분의 개수만큼 있는데 각각의 구조는 표 9와 같다.

이름

크기

설명

Component ID

1

성분을 구분하는 ID

Huffman table ID

1

상위 4비트 : 해당 성분이 사용할 DC Huffman 테이블의 ID

하위 4비트 : 해당 성분이 사용할 AC Huffman 테이블의 ID

[ 표 9 각 성분의 scan description ]

SOS가 시작되기 전에 최소한 하나 이상의 DHT, DQT와 하나의 SOF가 있어야 한다.

스캔 데이터 : SOS 바로 다음에 스캔 데이터 블록이 오게 되는데 스캔 데이터는 픽셀들의 색 정보를 샘플링-DCT-양자화-Huffman coding 과정을 거쳐 만들어낸 데이터이다. 이렇게 해서 만들어진 스캔 데이터를 다시 원래 픽셀 정보로 바꾸려면 역으로 Huffman decoding-역양자화(Dequantization)-IDCT-업 샘플링 과정을 거치면 된다.


Restart marker
restart marker (RST)는 유일하게 스캔 데이터 안에 존재하는 marker로 손상된 JPEG을 최대한 복원하기 위해 사용하는 marker이다.

SOS 이전에 DRI(Define Restart Interval) marker로 restart 간격을 정의를 한다. DRI marker의 구조는 표 10과 같다.

이름

크기

설명

DRI marker

2

항상 FF DD

Data length

2

추가 데이터 길이.

Restart interval

2

Restart 간격. 0이면 restart marker(RST) 쓰이지 않음을 의미.

[ 표 10 Restart marker ]

DRI에 정의된 restart 간격이 0보다 크면 그 간격만큼의 MCU 마다 RST marker가 놓이게 된다. 예를 들어 restart 간격이 N이라면 그림 3과 같이 N개의 MCU 데이터 마다 RST marker가 놓인다.

[ 그림 3 RST marker ]

RST marker는 RST0부터 RST7까지 8개가 있는데 순차적으로 나타나며 RST7 다음에는 RST0이 다시 나오게 된다.

저작자 표시 비영리 변경 금지
신고

'파일 구조' 카테고리의 다른 글

[BMP] BMP 파일의 구조  (0) 2009.10.24
[JPEG] JPEG의 파일구조  (0) 2009.10.10
[JPEG] JPEG 개요  (0) 2009.10.09
Posted by 코멧'★
파일 구조2009.10.09 19:46

[출처]-http://yebig.tistory.com/165
http://yebig.tistory.com/trackback/165

1. JPEG 개관

영상압축 표준 중의 하나인 JPEG은 칼라 정지영상의 부호화 표준을 목표로 ISO/CCITT에서 1988년 ADCT(Adaptive Discrete Consine Transformation)를 기초로 하는 알고리즘을 선택, 이 부화화 방식을 JPEG이라 명명하였으며 최종적으로 1992년 국제 표준으로 JPEG(Joint Photographic Expert Group) 알고리즘이 확정되었다.

JPEG은 기본적으로 화상의 크기, 칼라 시스템 및 칼라 성분에 대한 제한을 갖지 않으며, 압축 모드로는 순차적 부호화, 점진적 부호화, 계층적 부호화, 무손실 부호화가 있다.

JPEG의 기본 개념은 여러가지 응용 목적에 맞게 부호화 방식을 선택해서 필요한 부분을 선택적으로 적용할 수 있도록 툴 키트 개념을 바탕으로 한다.

즉 JPEG은 무손실 부호화(Lossless Compression)방식과 손실 부호화(Lossy Compression)방식을 모두 포함하고 있으며 칼라정지 화상에 대한 부호화 방식을 폭넓게 수용하고 있으므로 응용 분야에 따라 부호화 방식이나 사용되는 매개변수 등을 적절히 선택해서 조합하여 사용할 수 있다.

JPEG은 손실없는 부호화 방식을 사용할 경우 정보량의 약 1/2정도로 압축이 가능하며, 베니스 라인 방식을 적용할 경우 칼라 화상의 화질에 거의 손상을 주지 않고 평균 1/20까지, 그리고 최대 1/50까지 정보량을 압축할 수 있다.

알고리즘 측면에서 살펴보면 JPEG은 사실상 모든 압축 표준안의 기본이 된다고 말할 수 있다.

동영상의 압축 표준화인 MPEG 또한 JPEG의 기본개념을 많이 따랐다. MPEG은 동영상에 대한 압축을 목표로 하지만 동화상이라는 것은 정지영상인 프레임이 연속적으로 전개되는 것에 불과하기 때문이다.

그럼 구체적으로 JPEG 압축을 살펴보자.

2. JPEG Major Steps

* Encoding
1. RGB영역에서 YIQ영역으로 변환
2. YIQ의 macroblock화
3. macroblock을 8*8 block화
4. 이산코사인변환(DCT)
5. 양자화(Quantizing)
6. Zig-zag scanning
7. 차등부호화(DPCM on DC component) 또는 부호화흐름길이 부호화(RLE on AC component)
8. 엔트로피코딩(Etropy coding : 허프만 부호화 또는 산술부호화)


* Decoding은 Encoding의 역순이다.

3. DCT(Discrete Cosine Transform)

DCT 알고리즘은 영상 압축을 위한 효과적인 코딩기술인데 이를 이용하여 원 데이터의 블록들은 트랜스폼- 영역으로 변환한 것이고, IDCT는 처리된 트랜스폼-영역의 데이터 블록들을 원 데이터로 변환시킨 것이다.

u,v는 변환 영역의 좌표이고 i,j는 화소 영역의 공간 좌표이다.


2차원 DCT의 일반식은 다음과 같다.

Discrete Cosine Transform (DCT):



Inverse Discrete Cosine Transform (IDCT):


여기서 F[0,0]은 DC와 AC성분을 정의한다.

이 DCT를 이용하면 영상을 공간 영역에서 주파수 영역으로 변환할 수 있으며, 영상 데이터는 변화가 적으므로 낮은 주파수, 특히 0 주파수(DC)성분이 큰 값을 가지게 되고 높은 주파수 성분은 상대적으로 낮은 값을 갖게 되므로서, 대부분의 정보가 낮은 주파수 쪽으로 몰리게 되므로 양자화 과정을 적절히 거치면 높은 압축률로 우수한 화질을 얻을 수 있다.

64 (8*8) DCT basis funtions


4. Quantizing & Coding

양자화 과정이란 DCT를 통해 얻어진 DCT계수값 등을 어떤 상수들로 나누어 유효자리의 비트수를 줄이는 과정이다.

양자화된 8*8 block을 1*64 벡테로 Zig-zag scaning을 한다.

Zig-zag scaning을 거친 DC요소(저주파수)에 대해서는 DPCM(Diffrerntial Pulse Code Modulation), AC요소(고주파수)성분에 대해서는 RLE(Run Length Codig)으로 부호화 한다.

DPCM은 가장 간단한 예측 압축 기법으로서 픽셀 레벨에서 이루어진다. 직전 픽셀과 비교하여 둘 사이의 차이만을 전송하는 것이다. 이웃한 픽셀들은 종종 동일 하거나, 이웃한 픽셀들 사이의 차이가 적을 확률이 높기 때문에 새로운 픽셀값 전체를 전송하는 것보다 더 적은 비트를 가지고 안전하게 전송할 수 있다. 이러한 이유로 DC요소(저주파수)에 대해서는 DPCM부호화를 사용한다.

반복길이부호화(RLE) 기법은 반복되는 픽셀의 블럭을 하나의 값과 그값의 반복회수로 나타내는 것이다.
RLE부호화의 장점은 데이타의 압축률을 높일 수 있다는 것이다.

이 방법은 반복되는 횟수가 클때 큰 효과를 낼 수 있으며, 단순히 2번 반복되는 경우의 데이타 흐름이나 또는 연속인 같은 값의 수에 의한 데이타의 흐름은 부호화 할 수 없기 때문에 AC요소에 대해서는 RLE코딩을 사용하난 것이다.

5. Overview of the JPEG bitstream



A "Frame" is a picture, a "scan" is a pass through the pixels (e.g., the red component), a "segment" is a group of blocks, a "block" is an 8x8 group og pixels.

Frame header : sample precision (width, height) og image number of components unique ID (for each component) horizontal/vertical sampling factors (for each component) quantization table to use (for each component)

Scan header : Number of components in scan component ID (for each component) Huffman table for each component (for each component)

Misc. (can occur between headers)
Quantization tables
Huffman Tables
Arithmetic Coding Tables
Comments
Application Data

동영상의 경우는 DCT와 더불어 화면간 물체들의 움직임 보상(motion compensation)을 이용한 예측부호화를 기반으로 하고 있다.
저작자 표시 비영리 변경 금지
신고

'파일 구조' 카테고리의 다른 글

[BMP] BMP 파일의 구조  (0) 2009.10.24
[JPEG] JPEG의 파일구조  (0) 2009.10.10
[JPEG] JPEG 개요  (0) 2009.10.09
Posted by 코멧'★

티스토리 툴바