[Standard]/ITU-T

JPEG 라이브러리 source code 및 JPEG 구조

하늘을닮은호수M 2007. 6. 13. 17:24
반응형

갑자기 JPEG에 다시 정리해야할 일이 생겼다. ㅜ.ㅜ

전공이 영상 압축/통신이다 보니.. 학부며 대학원에서 매일같이 하던일이... 영상 압축과 새로운 알고리즘의 구현과 영상의 전송부분이었는데... ^^

하여간 갑자기 타겟보드에서 JPEG 이미지를 만들어야 할 일이 생겼는데..

편하게 사용하는 라이브러리가 하나 있어서 소개하고자 한다.

자세한 내용은 아래 참조...

내가 사용하는 소스코드를 첨부한다. 소스코드는 아래의 인디펜던트 jpeg 그룹의 ftp 싸이트에서도 받을 수 있다. 또하나는 구글에서 찾은 JPEG 구조에 대한 설명이다. 학교다닐때 JPEG , MPEG 부분의 비트스트림구조나 헤더구조에 대해서는 거의 암기하다시피...ㅜ.ㅜ 할정도였기에.. 학교졸업하고 이런 문서를 보니 참 반갑기도 해서 한번 옮겨보았다.

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

Independent JPEG Group

IJG is an informal group that writes and distributes a widely used free library for JPEG image compression.

The latest release is version 6b of 27-Mar-1998. This is a stable and solid foundation for many application's JPEG support.

You can find our code and some supporting documentation at http://www.ijg.org/files/, or by FTP at ftp://ftp.uu.net/graphics/jpeg/. If you can't cope with tar.gz-format archives, you may prefer the zip-format release at ftp://ftp.simtel.net/pub/simtelnet/msdos/graphics/jpegsr6.zip.

To learn more about how to use JPEG, see the JPEG FAQ. If you'd like to learn about how JPEG works, start with the comp.compression FAQ.

The ISO JPEG standards committee has their own web site. IJG is not affiliated with the ISO committee.

IJG development continues. Advanced features are being prepared for coming releases...

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

홈으로

JPEG

1. 개요

JPEG은 Joint Photographic Expert Group 의 약자이다.

ISO(국제 표준화 기구)와 CCITT(국제 전신 전화 자문)의 협력을 의미한다.

정식 명칭은 'Digital Compression and Coding of Tone Still Image'이다.

이는 ISO/IEC 10918-1(ITU 권고 T.81)로 표준화돼 있다.

정지 영상이나 연속적인 톤의 이미지를 표현하기 위한 압축 표준이다.

JPEG은 loss 압축 방식과 lossless 압축 방식 둘 다 지원한다. lossless의 경우는 영상 의 손실을 줄수 없는 의료 영상과 같은 중요한 데이터에 쓰인다.

우리가 흔히 말하는 JPEG은 DCT에 기반을 둔 유손실 압축 방식을 이용한 JPEG이다.

본 문서에서는 JPEG의 기본 이론 및 JPEG Decoder를 중점적으로 서술한다.

또한 이 문서에 나오는 소스는 IJG의 JPEG 라이브러리를 이용하였다.

2. JPEG 개관

2-1. JPEG의 History

·1982년 국제 표준화 기구 ISO(International Standard Origanization)는 정지 영상의 압축표준을 만들기 위해 PEG(Photographic Experts Group)을 만들었다.

·1986년 CCITT(international Teleghraph and Telephone Consultative Committee: 국제 전신 전화 위원회)에서는 팩스를 이용해 영상을 전송하기 위한 영상 압축 방법을 연구하기 시작했다.

동일한 연구 과제로 인해 1987년 위의 두 기구의 영상 전문가들이 연합해 공동 연구 착수하기 시작했다. 이를 JPEG(Joint Photographic Experts Group)라고 부름

·1990년 픽셀 당 6비트에서 24비트를 갖는 정지영상을 압축할 수 있는 고성능 정지영상 압축 방법에 관한 국제 표준을 만들어 냈다.

2-3. JPEG의 특징

기본적으로 JPEG은 인간 비전 시스템의 한계를 이용한 것으로 인간의 시각 시스템은 휘도 신호(luminance)에는 민감하지만, 색차 신호에는 둔감하다.

또한 JPEG이 압축의 대상으로 삼고 있는 사진과 같은 자연의 영상이 인접한 픽셀간의 픽셀 값이 급격히 변하지 않는다는 속성을 이용한다. 따라서 JPEG에서는 고주파 자료가 여과되므로 만화 및 컴퓨터 그래픽과 같은 영상에서는 GIF보다 코딩된 영상의 질이 떨어지게 되며, 잘 이용되지 않는다.

대개 Baseline 순차적 코딩 방법을 이용하며, 압축할 때 Q 벡터를 선택하여 영상의 Quality와 압축률을 정할 수 있다. (Q벡터가 작으면 , 영상의 질은 떨어지지만 파일 사이즈는 작아짐)

Full-color 및 Grayscale에서 뛰어난 효과를 얻을수 있다.

2-4. JPEG의 종류

: 다른 압축 방법과는 달리 JPEG은 특정한 압축 알고리즘을 지칭하는 말이 아니다.

JPEG에는 여러 가지 압축에 관련된 국제 표준이 규정이 규정돼있으며, 압축하고자 하는 대상의 성질에 따라 적합한 알고리즘을 선택할 수 있다.

Baseline System

- 어떠한 DCT 기반 복호기도 베이스라인 연속적 부호화를 할 수 있어야 한다는 점에서 이러한 명칭이 붙어 있다.

JPEG에 필요한 최소한의 기능을 규정

DCT에 기반한 압축방법인데, 미세한 유손실 압축방식이다.

Extended System

- 가변 길이 인코딩을 할 수 있는 시스템

- Progressive 인코딩과 계층적 인코딩이 가능한 시스템

- 반드시 지원할 필요는 없지만 JPEG 내에서 사용할 수 있기 때문에 이 기능을 일단 인식할 수 있어야 한다.

◆ Four distinct mode of Operation

· Sequential DCT-based

- DCT를 기반으로 한 가장 많이 쓰이는 압축방식

- 우리가 흔히 말하는 JPEG이라고 하면 거의 이 방식을 이용한다.

· Progressive DCT-based

- 점진적 전송이 가능한 압축 방법

: 이것은 영상 파일을 읽어오는 중에 데이터의 일부만 가지고도 화면 출력을 할 수 있도록 고안한 압축방법이다. 네트웍을 통해 영상을 전송받아 화면에 출력할 때 베이스라인 JPEG으로 압축된 파일은 완전히 전송받은 후에야 화면에 출력할 수 있지만, 점진적 전송이 가능한 모드로 압축된 영상은 데이터를 전송받은 만큼 바로 화면에 출력이 가능하다. 하지만 화면을 한번 갱신할 때마다 JPEG 복원의 전과정을 거치므로 시스템 사양(하드 디스크가 고속으로 동작해야함)이 떨어지면 베이스라인 JPEG보다 속도가 떨어질 수 있다.

· Lossless

- 무손실 압축 방식

의료 영상과 같은 중요한 데이터가 있는 영상을 압축할 때 쓰인다.

이를 위해 DCT가 아닌 2D-DPCM을 이용한 압축 방법을 이용해 무손실로 영상을 압축할 수 있다.

2D-DPCM이란 어떤 픽셀 값을 그 픽셀 값의 주위 값으로부터 예측하고 예측치와의 차이만을 코딩함으로써 데이터량을 줄이는 방식을 의미한다.

대개 2:1정도의 압축이 좋은 결과를 갖는다.

· hierarchical

- 점진적 전송이 가능한 압축방법과 비슷한 기능을 갖는 또 다른 방법으로, 피라밋 코딩방법이라고도 하며, 하나의 영상파일에 여러 가지 해상도를 갖는 영상을 한번에 저장하는 방법이다. 예를 들면, 아래 그림과 같이 250*250,500*500,1000*1000의 크기를 갖는 3장의 영상이 하나의 파일에 저장되면 각각의 영상을 3개의 파일에 저장하는 것보다 압축률을 높일 수 있다.

2-5. Baseline JPEG의 압축 및 복원 과정

앞서 말했듯이 Baseline JPEG은 JPEG 압축의 최소 사양으로, 모든 JPEG 관련 애플리케이션은 적어도 이 압축 방법만큼은 반드시 지원해야 한다.

간단하게 Baseline을 살펴보면 다음과 같다.

모든 DCT 기반 복호기에 적용되는 동작 모드는 다음과 같다.

1. DCT 기반 처리

2. 원영상 : 각 컬러 성분당 8비트 샘플

3. 연속적 처리

4. 허프만 부호화 : 2AC 및 2DC 테이블

5. 1-4개의 색 성분에 대한 처리 가능

6. 격행(interleave) 및 비격행 주사

위 그림에서 보는 것과 같이 JPEG Baseline 압축방법은 다음과 같은 순서를 거친다.

a. 영상을 휘도, 색도 컬러 색상으로 변환

b. 컬러 구성 요소 감축(옵션) -> 색차신호 down sampling

c. 영상을 8X8 화소의 블록들로 분할하고 각 블록에서 DCT를 실행

d. 결과 DCT 계수를 양자화

e. 감축된 계수를 zigzag Scan을 이용하여 엔트로피 코딩( EX. Huffman Coding)을 함

Decoding은 압축의 역순으로 행하면 된다.

3. JPEG의 파일 구조

3-1. 파일 구조 개관

: Entropy-coded Segments와 Marker Segments로 구성된다.

아래의 그림과 같이 4계층 형태로 구성되어진다.

전체영상 -> 프레임 -> 스캔 -> 스캔과 연결된 실제 데이터

각 층은 시작 마커 코드에 의해 분리됨.

파일의 제일 처음으로 등장하는 코드는 "FFD8" --> SOI (Start Of Image)

기본적인 JPEG 파일

-> 파일 헤더 , 허프만, 양자화 테이블, 영상의 기본 정보를 가지고 있는 Frame

Table에는 허프만 테이블, 양자화 테이블이 존재.

스캔 헤더에는 DC와 AC 계수, 엔트로피 코딩 테이블(Entropy Coding Table)등의 정보가 저장돼 있다. 스캔 헤더 뒤로 실질적인 데이터 정보를 포함하고 있는 MCU가 존재한다.

JPEG 압축된 데이터를 위한 3가지 포맷들

1. Interchange Format for Compressed image data

decoder에 의해 요구되어지는 모든 테이블들을 포함한다.

2. Abbreviated Format for Compressed image data

decoding에 필요한 테이블들 모두 또는 약간을 생략할 수 있다.

3. Abbreviated Format for table specification data

*JPEG은 어떤 프레임 뒤에 순차적으로 다른 프레임이 연결되는 것이 아니라 마커코드 를 확인해 그 코드에 대한 데이터가 연결되는 형식을 취한다.

SOI : Start Of Image Marker : 영상의 시작을 의미

EOI : End Of Image Marker : 영상의 끝을 의미

3-2. 마커 코드

: JPEG은 정보를 기록하기 전, 최상단에 마커코드를 위치시킨다. 이 마커코드에 의해서 필요한 정보를 읽을 수 있는 데, 이것은 2바이트 형태로서 첫째 코드는 'FF'로 시작하고, 그 이후에 'C0~FE'까지의 코드를 사용한다. '02~BF'까지의 코드와 '00' 및 'FF'는 둘째 코드로 사용되지 않는다. '00','FF'는 허프만 부호중에 'FF'가 생길 경우 'FF'뒤에 '00'을 삽입, 마커코드가 아님을 알려준다.

자세한 마커코드는 「7-2. 부록」을 참조하길 바란다.

마커 코드(2Byte)

마커 코드의 길이(2Byte)

데이터

마커 코드의 일반적인 구조

내용

16진수

마커코드

설명

프레임 개시 마커코드

FFC0-FFCF

SOF0-SOFF

저장 방식

허프만 테이블

FFC4

DHT

허프만 테이블

Arithmetic 코드

FFCC

DAC

Arithmetic 통계 모델 규정

시작, 종료 마커 코드

FFD0-FFD7

RTS

프레임 종단마다 사용되는 마커

영상정보 시작

FFD8

SOI

이미지의 시작

영상정보 끝

FFD9

EOI

이미지의 끝

스캔 테이블

FFDC

SOS

스캔의 시작

RTS

FFDC

DRI

RTS 간격을 지정, MCU 단위로 2바이트

양자화 테이블

FFDB

DQT

양자화 테이블

중요 마커 코드 리스트

프레임 헤더

프레임 마커는 FFC0 ~ FFCF 까지 이다. 이 마커는 현재 프레임이 어떤 방식으로 저장되어 있는 가를 알려준다. 만약 Baseline DCT라면 프레임 마커는 FFC0이다.

jdmarker.c의 get_sof (decompress_info_ptr cinfo, int code)함수 부분에 있음

코드명

SOF

Lf

P

Y

X

Nf

컴포넌트

바이트

2

2

1

2

2

1

C

H

V

Tq

1

0.5

0.5

1

프레임 헤더 구조

SOF : 저장방식 인식 마커

Precision : 영상의 샘플의 양자화 비트수

Lf : 프레임의 헤더 길이

X : 영상의 가로 크기Y : 영상의 세로 크기

Nf : 프레임을 구성하는 컴포넌트의 개수

(1~255 in Sequential DCT-Based and Lossless frames)

C : 컴포넌트 번호

H : 수평 샘플링 인자

V : 수직 샘플링 인자

Tq : 양자화 테이블 번호 (0,1,2,3) -> 최대 4개의 양자화 테이블을 가짐

Sample precision

: 8-bits integer, DCT압축 알고리즘에 따라 8 또는 12bits의 precision을 가진다.

프레임 헤더를 분석하는 것은 다음과 같다.

스캔 헤더

: 스캔 헤더에는 데이터의 부호화 코드 정보가 들어있다. Cs는 컴포넌트 데이터의 번호이며, Td는 DC 계수 부호화 테이블이고, Ta는 AC 계수 부호화 테이블 번호이다. 이 번호는 Baseline에서는 양자화 테이블 번호에 해당한다. 이후에 실제 영상 데이터가 MCU 블록 단위로 등록된다.

코드명

SOS

Ls

Ns

스캔 컴포넌트

Ss

Se

Ah

Al

Cs

Td

Ta

바이트

2

2

1

1

0.5

0.5

1

1

0.5

0.5

스캔 헤더의 구조

SOS : 스캔 마커 코드 (FFDA)

Ls : 스캔 헤더 블록의 길이

Ns : 스캔 컴포넌트의 수 ( 1~4 )

Se : 스팩트럴 선택방식의 개시

Se : 스팩트럴 선택방식의 종료1

Ah,Ai : 연속 근사 방식시 비트 위치를 표시하는 상위 정보와 하위 정보

Cs : 컴포넌트 번호

Td : DC 계수 엔트로피 부호 테이블 번호

Ta : AC 계수 엔트로피 부호 테이블 번호

jdmarker.c의 get_sos (decompress_info_ptr cinfo)함수 부분에 있슴

양자화 테이블

: 양자화 테이블은 마커코드 다음 양자화 테이블 번호의 정보가 설정되어 있으며, 64개의 데이터가 연속적으로 들어있다. Pq가 1일 경우에는 이 64개의 데이터가 각각 2바이트씩 설정되며, 0일 경우 1바이트씩 설정된다.

코드명

DQT

Lq

Pq

Tq

양자화 테이블

바이트

2

2

0.5

0.5

64

양자화 테이블의 구조

DQT : 양자화 테이블 마커 코드(FFD8)

Lq : 테이블 헤더 정의부의 길이

Pq : 양자화 테이블의 각 값의 비트수가 0일 경우 8비트, 1일 경우 16비트

Tq : 양자화 테이블 번호

jdmarker.c에 구현되어있는 get_dqt()

: 파일로부터 양자화 테이블을 읽어들여 quant_tbl_ptrs[]에 넣는다.

허프만 테이블

: 허프만 테이블에는 허프만 부호의 길이와 허프만 부호가 설정되어 있다. 이 두 개의 데이터를 이용하여 영상 정보의 원래 데이터를 복구하게 된다.

코드명

DHT

Lh

Tc | Th

허프만 부호 길이

허프만 부호

바이트

2

2

1

16

64

허프만 테이블의 구조

DHT : 허프만 마커 코드(FFC4)

Lh : 허프만 테이블 헤더의 길이

Th : 허프만 테이블의 번호

Lh는 허프만 마커코드를 제외한 나머지 길이이다.

jdmarker.c에 get_dht()로 구현되어 있다

3-3. JPEG file Scanning 소스부분

따로 헤더에 대한 구조체는 두지 않고, file scanning하면서 얻어진 정보는 jpeglib.h에 선언된 jpeg_decompress_struct 구조체에 저장한다.

JPEG file Scanning에 관한 함수는 다음과 같다.

jdmarker.c 에 구현되어있다.

read_file_header()

파일 헤더를 읽고, SOF로부터 모든 것을 읽고, JPEG Format을 결정한다.

또한 color space를 결정한다.

get_sof()호출 - frame 마커를 읽고 프레임 헤더 정보를 읽어온다.

입력 JPEG의 color space를 해석

read_scan_header()

scan헤더를 읽는다. read_file_header후에 호출된다.

get_sos ()를 호출해서 scan 헤더의 내용을 읽는다.

EOI 마커가 발견되면 이미지의 끝으로 인식하고 끝냄

read_scan_trailer()

한 번의 scan이 끝나고, 또 다른 read_scan_header을 준비한다.

read_file_trailer()

end of file->finish

즉, 영상의 끝에서 처리됨.

반응형