1월 152013
 

최근 삼성에서 NX300을 공개하였습니다. NX300의 공개 내용을 보자면, 가장 눈에 두드러진 변화는 센서면 위상차 검출기능의 이미지센서를 채용했고, 새로운 DRIMe 4 이미지 엔진을 올렸습니다. 거기에 언론에 공개된 이미지를 보자면 기존 NX 2세대 카메라의 이미지보다 상당히 나아진 JPG 파일을 볼 수 있습니다.

그래서, 이번엔 JPG 파일 생성(인코딩)에 대해 아주 살~~~짝 글을 써보고, JPG인코딩이 어떻게 이뤄지고, 왜 JPG 파일로 이미지를 만들면 이미지 품질에 손상이 오는지에 대해 아주 살~~~짝 글을 써보겠습니다.

그나마 좀 쉽게 해설이 되있는 ‘한글’ 자료를 찾으려고 했는데, 쉽게 설명을 했음에도 워낙 이해력이 달려서 과정이 이해가 되지 않고, 영문 자료를 찾아봤더니 처음보기엔 난해한 자료들이 주를 이루는지라, 주로 영문 설명글을 몇개 따와서 간단하게 요약을 해보도록 하겠습니다.

1. JPEG 포맷이란..

JPEG는 2가지 큰 기본 전제를 가집니다.
한가지는 실제 세계의 이미지 데이터는 인접 픽셀 데이터 간의 값의 변화가 크지 않다라는 것이고,
두번째는 인간의 눈은 밝기의 변화는 민감하나, 미묘한 색의 변화는 밝기의 변화에 비해 덜 민감하다는 점에 착안해 디자인된 포맷입니다.

따라서, 색깊이가 깊지 않은 데이터나 (예를들면 흑백 이미지), 선의 구분이 명확한 텍스트 이미지는 JPEG 포맷에 적합치 않습니다.

JPEG는 인간이 실세계를 보는 것에 더욱 주안점을 두어 인간의 눈에 덜 민감한 자료를 누락시키는 형태를 취함으로써 전체적인 이미지 파일의 용량을 줄이는 손실이 있는 파일 포맷이 되겠습니다.

2. JPEG 흐름도

위에서 보는 바와 같이 위에 있는 흐름을 통해 JPEG파일을 인코딩하고, 그와 역순으로 디코딩하는 형태를 갖습니다.

인코딩 방법만 놓고 본다면…

1. 컬러 변환.
2. 작은 이미지로 분할.
3. DCT 변환.
4. 양자화.
5. 기록.

순서로 진행 됩니다.

– 컬러 변환: 인간의 눈이 밝기에 더 민감하고 색변화에는 덜 민감하므로 RAW 데이터를 밝기요소(Y’)와 색요소(Cb,Cr)로 분리.
– 작은 이미지로 분할: 전체 이미지를 8×8 픽셀 블록으로 변환.
– DCT 변환: 이거 복잡한데요. 앞서 분할된 8×8 블록자체가 하나의 메트릭스가 되는데, 이 DCT라는 메트릭스 변환 식을 통하면 저주파 값들이 좌측상단 방향으로 모이고, 고주파 값들이 우측하단으로 모임. 저주파 값은 간단하게 8×8 메트릭스에서 큰 값들의 변화를 기록한 값이라고 보시면 되고, 고주파는 좀더 미세한 값의 변화를 기록한 것이라고 보면됨.
– 양자화: 이 양자화를 통해 DCT를 통한 8×8 메트릭스 값을 단순화. (여기서 주요 손실이 발생)
– 기록: 양자화를 거치면 8×8 메트릭스 값이 단순화 되는데, 이를 기록하는 무손실 단계.

3. 살짝 심층 분석

JPEG 인코딩 단계에서 가장 중요한 단계인 DCT 변환, 양자화, 기록을 설명해 보겠습니다. 되도록 간단하게 해보겠습니다.

일단 밝기 데이터와 색 데이터를 각각 8×8 메트릭스로 전체이미지를 잘게 나눈다고 했습니다. 이렇게 나뉘어진 8×8 메트릭스는 모두 같은 절차를 거쳐 나중에 커다란 JPEG 파일로 조합이됩니다.

예를들어 어느 한 8×8 이미지 메트릭스가 있는데, 아래와 같다고 해보겠습니다.

각각의 픽셀 값은 8 bit 즉 값의 범위는 0~255의 범위를 갖습니다. 이를 -128 ~ 127 값의 범위를 갖도록 변환합니다. 그럼 아래와 같이 변화됩니다.

이렇게 얻어진 메트릭스를 2차원 DCT 변환을 하는데, (공식을 아실 필요는 없습니다. 그냥 그렇다고 알고 계심됩니다. 사실은 저도 몰라요… ㄷㄷㄷ)

단지 이 공식을 통하면 원래 주어진 8×8 메트릭스 값에서 최 좌측상단의 값이 8×8 매트릭스의 대표값을 기록하고 나머지 63개 값이 좌측 상단으로 갈 수록 더 낮은 주파수 변화값이 모이고, 우측 하단으로 갈 수록 더 높은 주파수 값들의 변화값이 모인다라고만 보시면 됩니다. 아래의 매트릭스가 DCT 변환 후의 매트릭스 입니다. 이 매트릭스는 역변환을 통해 고대로 원래 8×8 매트릭스로 환원이 됩니다. 이게 JPEG 디코딩 때 쓰이게 됩니다.

이제 여기까지는 모두 무손실 변환단계라고 보시면 됩니다.

다음 양자화 단계가 바로 JPEG파일에 있어 손실을 발생시키는 단계입니다.
양자화라고 말하면 무지하게 와닿지 않는데, 이 양자화란 것은 어느 범위의 숫자를 하나의 대표값을 갖도록 만드는 절차라고 보시면 됩니다. 예를들어 0에서 9까진 대표값 0, 10~19는 1… 이런 식이죠. 가장 간단하게 이를 구현하는 방법은 그냥 어느 숫자로 나눠주고 정수값의 몫만 취하는 방법입니다.

아래의 매트릭스는 JPEG파일 생성에 있어 표준 양자값 매트릭스 입니다. 위에 DCT 변환을 거친 매트릭스를 아래 표준 양자값 매트릭스로 나눕니다.

위의 매트릭스로 DCT변환으로 구해진 값들을 나누면, 아래의 매트릭스가 얻어집니다.

그렇게 하고 보면 값들이 상당히 간단해지죠. 그리고 고주파 값들이 주로 저장된 우측 하단 쪽은 주로 ‘0’이라는 값들이 채워져 있습니다.
자…. 저주파 값이란 뭘까요? 좀더 큰 값이 변화하는 성분값입니다. 그럼 고주파 값들은 뭘까요? 그 미묘한 값의 변화성분, 즉… 이미지에서 말했을 때, 미세한 값의 변화도 기록해주는 능력이 되겠습니다. 이게 디테일과 비슷하지만, 꼭 디테일이라고 하기도 뭐한 부분이 있습니다. 이런 단계를 거쳐 JPEG에서 값의 미묘한 변화 값이 희생되는 것입니다.

자… 이제는 이를 기록하는 단계만 남았습니다.

이를 기록하는 것은 아래 그림처럼 지그재그로 순차적으로 기록합니다.

위의 순서대로 기록하면,

 

engine-1

위와 같이 되는데, 이 값들에서 마지막으로 0이 아닌 부분에서 EOB (End of Block: 블록 끝)마크를 넣어주면, 나머지 매트릭스는 모두 ‘0’이라는 의미로 표현됩니다.
engine-2

위와 같은 방식으로 기록이 완료되면 요렇게 됩니다. 즉 8×8 매트릭스 64개의 값이, 인간의 눈에 무시할 만한 값을 무시하고, 저장을 하면 27개의 값으로 줄어들게 되어 거의 1/2도 안되는 수준으로 용량이 줄어듭니다.

4. JPG 압출률???

이는 바로 DCT 변환을 통해 거쳐진 값을 양자화 하는 과정에서 벌어지는 것입니다. 양자화 값의 범위로 저주파(매트릭스 좌상부)또는 고주파(매트릭스 우하부)의 희생시킬 성분을 조절할 수 있고, 값이 커지면 희생되는 범위는 더욱 넓어지게 됩니다.

이렇게 하여 고주파 부분의 양자값을 크게 잡으면 미세한 값의 변화.. 즉 이미지에서 미묘한 값의 변화는 무시되고,
매트릭스 우하부에 모여있는 ‘0’ 값들의 범위가 더 넓어지게 되며, 데이터 블럭 크기는 더욱 작아집니다.

5. 실제 소니 A-700의 양자화 테이블

좌측이 밝기 데이터 양자화 매트릭스이고, 우측이 색 성분 양자화 테이블입니다.

딱 보시면 아시겠지만, 밝기 양자화 매트릭스의 값이 더 작죠. 왜냐하면 인간의 눈이 밝기변화에 더욱 민감하기 때문입니다. 그리고 색 성분 양자화 매트릭스를 보면 특히 고주파 부분에서 (색의 미세한 변화)를 더 많이 희생합니다. 이는 인간의 눈이 미세한 색변화에 덜 민감하기 때문이라는 연구결과에 따른 결과입니다.

 

engine-3

 

6. 내 맘대로 결론.

이 양자화 매트릭스를 조절하는 것에 따라, 이미지의 미묘한 변화도 기록하는 능력과 파일 용량 크기를 결정할 수 있게 됩니다. 최근 NX300의 JPG 파일 크기가 기존 NX 2세대 바디들에 비해 커졌다는 말은 이 양자화 매트릭스를 조정하여 더많은 고주파 성분을 기록하는, 즉 이미지가 더 세밀한 부분까지 표현하는 결과로 연결될 것으로 예상이되며, 이는 역시 더욱 강력한 이미지 엔진의 성능을 요구하게 됩니다.

신게에 올린 NX300과 NX20의 이미지비교를 다시 참고해보시면, NX300의 경우 예시로 든 곳 뿐만이 아니라, 모든 이미지 부분을 훑어봐도 이미지를 뭉개는 부분이 없습니다. (이는 이미지가 선명하냐 아니냐와는 관계가 없는 부분입니다.)

NX20의 경우 모든 부분은 그렇지 않으나 심심치 않게 이미지가 뭉개져서 마치 유화같은 느낌이 드는 곳을 볼 수 있습니다.

이 말은, 양자화 매트릭스의 범위를 넓게 잡음으로 해서, 미세한 색, 또는 밝기 변화 데이터가 유실됨으로서 미세한 값의 변화를 갖는 인근 비슷한 픽셀들의 값이 하나로 치환됨으로써 이미지의 미세한 디테일이 희생되어 발생하는 결과로 유추됩니다.

즉, 이번 NX300의 DRIMe 4 이미지 엔진의 성능향상은 본격 20.3MP 센서의 데이터를 더욱 살리는 결과로 연결될 것으로 설레발을 쳐봅니다.

참고 링크:
http://en.wikipedia.org/wiki/JPEG
http://www.fileformat.info/mirror/egff/ch09_06.htm
http://www.impulseadventure.com/photo/jpeg-quantization-lookup.html?src1=546

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)