본문 바로가기

Job Notes/Image Processing

JPEG(Joint Photographic Expert Group)

1. 개요

JPEG은 정지영상의 표준화를 위하여 국제전문가회의(Joint Photographic Expert Group)에서 규정한 표준이다.

ISO(국제 표준화 기구)와 CCITT(국제 전신 전화 자문)의 협력으로 그림파일 양식을 정한 것이다.

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

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

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

JPEG은 손실 압축 방식과 무손실 압축 방식 둘 다 지원한다. 무손실 압축방법의 경우는 영상의 손실을 줄수 없는 의료 영상과 같은 중요한 데이터에 쓰인다. 우리가 흔히 사용하는 JPEG은 DCT(Discrete Cosine Transform)에 기반을 둔 유손실 압축 방식을 이용한 JPEG이다.

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

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

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은 압축의 역순으로 행하면 된다.

이산 코사인 변환(DCT)

정지 영상 데이터의 압축 표준인 JPEG나 동영상 데이터의 압축 표준인 H.261 과 MPEG등에서 부호화 과정의 일부로 이용되는 것이 이산 코사인 변환(Discrete Cosine Transform:DCT)은 2차원 행렬로 정의 된 영상 데이터를 공간 영역에서 주파수 영역으로 변환하는 방법이다.

 

 

위 그림과 같은 어떤 행렬이 있다고 치자. 행렬은 N*N행렬일 테지만 JPEG와의 연관을 위해 8*8행렬을 예로 들었다. 행렬표에 위 공식을 대입하면 데이터 값이 변화되는것을 알 수 있을 것이다. 어떤 데이터가 DCT변환을 거치게 되면 데이터의 표에 있어서 왼쪽 상단에만 데이터 표현값이 높은 수치가 들어가는 것을 알 수 있을 것이다.

 

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

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