JPEG 개요 및 원리

댓글 0

[카메라·영상]

2014. 7. 7.

 

 

JPEG 개요 및 원리

 

1. 개요

JPEG은 Joint Photographic Expert Group의 약자입니다.

원래는 ISO(국제 표준화 기구)와 CCITT(국제 전신 전화 자문)의 영상전문가들의 협력을 의미합니다만, 요즘 "JPEG"이란 단어는

가장 널리 쓰이는 정지압축영상의 파일형식(.jpg, .jpeg) 또는 그와 관련된 표준이란 의미로 많이 쓰입니다.

정식 명칭은 'Digital Compression and Coding of Tone Still Image'이며, 이는 ISO/IEC 10918-1(ITU 권고 T.81)로 표준화되어 있고, 정지 영상이나 연속적인 톤의 이미지를 표현하기 위한 압축 표준입니다. JPEG은 손실(loss)압축방식과 무손실(lossless)압축 방식 둘 다 지원합니다.

손실/무손실이 무슨 뜻이냐고요? 말 그대로 손실압축방식이라면 바로 어떤 사진이나 그림의 데이터 정보의 압축을 했을 때 원래 갖고 있던 정보량이 약간 손실된 체로 압축을 한다는 뜻이고, 무손실이라면 압축을 해도, 그 정보량이 변하지 않는다는 뜻입니다.

따라서 무손실압축방식(lossless)의 경우는 영상의 손실을 줄 수 없는 의료 영상과 같은 중요한 데이터에 쓰입니다. 그러나 대부분의 경우, 우리가 흔히 접하는 JPEG 영상은 DCT(Discrete Cosine Transform,이산여현변환)이라는 아주 놀라운 수학변환공식에 기반을 둔 유손실 압축 방식을 이용한 것입니다.

예를 들어 여러분이 Print Screen Key를 이용해서 화면캡쳐를 하시고, 그것을 그림판에서 bmp로 저장을 하신다음 다시 ACDSee나 포토샵 등으로 jpg으로 변환을 해보십시오, 그러면 여러분은 두 가지 사실을 발견하시게 될 겁니다.

첫째, bmp에 비해 jpg이 화질은 얼핏보기에 거의 똑같은데도 파일크기가 무려 10~20배 가량 줄어있다는 점.

둘째, 그런데 bmp와 jpg을 눈을 크게 뜨고 비교해보면, 약간 화질이 jpg이 떨어진다는 점을 발견하실 수 있을 겁니다.

그것은 바로 압축이 되서 데이터량이 현저하게 줄었고, 약간의 데이터 손실도 발생해서 화질이 미세하게 떨어졌다는 여러분이 이용하시는 jpg의 손실압축특성을 의미하는 것입니다.

이처럼 사람들이 jpg을 선호하는 이유는, 사람의 눈이 상당히 둔감하기 때문에 얼핏보기에는 화질을 거의 떨어뜨리지 않으면서, 데이터량은 수십배가량 줄일 수 있기 때문이지요.

이런 일이 가능한 이유는 정지영상의 특성을 이용하여, 수학적으로 아주 멋지고 훌륭한 알고리즘 (DCT, Arithmetic Coding 등)을 세계적인 석학들과 과학자분들이 수십년간의 연구와 노력 끝에 발명해 내셨기 때문입니다.

 

 

2. JPEG의 원리

이제 JPEG의 압축원리를 말씀드리겠습니다. 영상을 전혀 모르시는 하나포스 네티즌 여러분을 주독자로 가정하여 너무나 간단하고 쉽게 설명드릴 것이기 때문에 혹시나 전문가님들께서는 내용이 부족하다고 생각되더라도 양해바랍니다.

 

1) 여러 개의 화소가 모여 하나의 영상 화면을 이룬다.

일단 영상은 화소(pixel)라는 최소단위의 아주 작은 점, 수백~수만개가 모여 네모난 하나의 화면을 구성합니다. 한 화면을 구성하는 pixel수에 따라 소위 1024*768 이니 800*640이니 하는 해상도(resolution)를 나타냅니다. 1024*768 이라면 가로로 1024줄, 세로로 768줄의 총 786432개의 화소로 구성된 네모난 화면을 말합니다.

따라서 화소수가 많을 수록 화질은 선명하겠죠? 하나의 화소는 명도, 채도 등에 따라 정수값을 갖게 되는데, 설계하는 사람 마음입니다만, 예를 들어 명도별로 0~255까지 쓸 수 있다고 가정하고 0이면 검은색 255이면 흰색이라고 정한다면, 128은 회색이 되겠고 200이면 칙칙한 회색이 되겠죠?

그러면 1024*768 영상은 0~255값을 갖는 거대한 1024행*728열의 수학적인 행렬이 되는 것입니다

.

2) 정지영상(ex. 사진)을 보면, 한 pixel 주위는 서로 비슷한 색이 모여있다.

여러분께서 예전에 바닷가에서 친구들과 찍은 사진을 한 장을 꺼내보시면, 발 근처에는 황토색 모래가 쭈욱 있고, 머리 위에는 하늘색 하늘이 펼쳐져 있고, 뒤에는 시퍼런 수평선과 바다가 보이고, 머리에는 검은색 머리가 바람에 휘날리고 있을 겁니다. 사진의 부분부분마다 비슷한 색상이 모여 있지요?

즉, 하나의 화소 입장에서 보면 확률적으로 나랑 비슷한 색을 가진 놈이 근처에 있을 확률이 높은 것입니다. 이런 확률적 특성을 이용해서 화면을 잘잘히 쪼개서 무언가를 해보면 데이터량이 줄어들 수 있지 않을까 해서 생각해낸 방법이 바로 JPEG입니다!!!

 

3) 화면 행렬을 두부판 썰 듯 8*8 행렬로 쪼갠다.

이제 영상을 잘잘하게 쪼개봅시다. 1024*728 화면행렬을 8*8짜리 정사각형 행렬로 쪼개면, 총 가로 128 * 세로 91개의 8*8행렬로 나뉩니다. 영상이론에서는 이 8*8 행렬을 블록(block)이라고 부르고, 영상압축의 아주 기본 단위로 여깁니다. JPEG의 압축은 이 블록단위로 행해집니다.

 

4) encoding (정보압축하기)

8*8의 블록 행렬(고등학교 수학시간 때 행렬 배우셨죠? 바로 그 행렬입니다.)은 여러가지 수학적인 변환에 의해 아래와 같은 과정으로 정보량이 줄어듭니다.

- DCT : 이 연산을 하면 왼쪽 위쪽으로 큰 숫자들이 몰립니다. 제일 좌측 상단에 있는 큰 숫자를 DC(저주파)값, 나머지 63개의 숫자들은 AC(고주파)값이라고 부릅니다. 특히 DC값 및 이 근처에 있는 숫자들은 블록전체의 명도를 좌지우지하는 매우 중요한 정보를 담고 있습니다

 

 

- 양자화 : 전체적인 데이터량을 줄이기 위해 양자화 행렬이라는 설계자가 만든 임의의 정수행렬로 나눕니다. 그러면 작은 값들는 0으로 바뀌겠지요? 이렇게 0이 되어 사라진 숫자들 때문에, 약간의 정보손실(loss)가 발생하는 것입니다.

 

 

 

- 지그재그 스캐닝 및 허프만 코딩 테이블을 이용한 비트열 압축 : 지그재그 줄세우기로 만들어진 정수열을 이진수로 바꾼 후, 그 이진수의 인근값 특성 및 확률(0 또는 1이 연속으로 몇 개가 계속되는지 등등)을 이용한 허프만 코딩(자세한 설명은 생략하겠습니다.)을 이용해서 8*8행렬이 불과 몇 개의 0과 1의 조합으로 줄어들게 됩니다.

 

 

 

이처럼 원래의 8*8 정수 행렬이 DCT è 양자화 è 지그재그 스캐닝 è 허프만 코딩 등의 과정을 거치면서, 데이터량이 엄청나게 줄어드는 것을 확인하실 수 있습니다. 단 양자화 과정에서 아주 작은 AC 값들은 손실되기 때문에 원래 영상에 비해 약간 화질이 저하되는 손실압축방식이 되는 것입니다.

 

5) decoding (압축풀어서 보기)

- encoding과정의 역순으로 진행됩니다. 그렇게 복원된 영상과 원래의 영상값을 비교해보십시오. 별로 차이는 안나지만 다르죠?

색상으로 변환되면 사람의 눈으로 볼 때는 별차이를 못느끼지만 이 엄연한 값의 차이 때문에 JPEG을 손실압축방식이라고 부릅니다.

 

 

어떻게 jpeg에 대해 잘 이해가 되셨는지 모르겠습니다. 다음 기회에는 동영상 압축방식 표준인 MPEG에 대하여 설명 드리겠습니다. MPEG에는 기본적으로 JPEG이 차용되어 있습니다. 따라서 MPEG을 이해하시기 위해서는 JPEG에 대한 이해가 필수적입니다.

예제) 아래 bmp(미압축,좌측) 사진과 jpg(압축,우측) 사진의 화질을 눈으로 비교해보세요.

참고로 bmp파일은 224Kbytes이며, jpg파일은 18.9Kbytes입니다. 거의 열배 이상 데이터량이 줄어들었는데도 화질은 거의 같죠? ♣

 

 

< 그림 BMP, JPG 파일 비교 >

 

 

 

 

 

참조 : http://myspeed.skbroadband.com/comm/tip/view.asp?ListNo=2&code=18&page=1