Matlab을 이용한 영상처리 - 4. 양자화와 디더링

Programming/Image Processing 2010. 8. 25. 16:00

1. 양자화

GrayScale 에서, 대부분 256 색을 가지고있다. 이 색은 인간이 인식가능한 대부분의 색을 표현하는 데 무리가 없다. 그런데 ,만약 표현가능한 색이 256보다 제한되있다고 한다면 ?

양자화는 이런 제한사항을 가진 이미지를 만든다 .

매우 간단하게 2가지 색만 가진다고 한다면, 다양한 이미지에 적용될 수 있는 간단한 이분법은 중간값(256에선 128)을 기준으로 그 이하의 값을 가진 픽셀은 0 으로 , 그 값을 초과하는 픽셀은 1로 표시 할 수 있다.

f = floor(double(Image)/d);
와 같이 나누고
q = uint8(f*d);
를 통해 디스플레이에 좋은 값으로 스케일링해 표시 할 수 있다.
( 단순히 나눠 뿌리기만하면 d개의 다른 색이 표현되긴 하겠지만 인간이 인지할 수 없는 차이의 색이 선택될 것이다.)

그러나 영상처리에 관한한 아주 Powerful한 기능을 제공하는 Matlab은 보다 적합한 하나의 함수를 만들어 놓았다.
 
grayslice(Image,d)를 이용하여 d개의 그레이를 만들고,
gray(d)를 이용하여 디스플레이에 좋게 스케일링한다.

지루한 이론 설명은 이쯤하고 소스와 실행결과를 살펴보자.


중요한건 7번 라인이다. 앞에서 장황하게 늘어놓았던건 다 이 하나의 라인을 설명하기 위한 것이었다.

Figure 1. 양자화 결과

2개의 스케일 (흰색,검은색) 만을 가지기 때문에 이진영상과 같은 결과가 나왔다.
4개의 스케일을 가지게 하면 ,


하늘(흰색), 뒤쪽산(연한 회색) , 앞산(진한 회색) , 나무(검은색) 들이 4가지 색으로 표현 되었다.

2. 디더링

뭐 나름 이런 이미지도 분위기 있고 좋지만, 색상이 제한되어 있다 하더라도 이미지를 그자체로 느끼기가 너무 어렵다 !

필자가 만화를 좋아하므로 , 만화책을 생각해보자!
요새는 만화책 원고 작업도 디지털화되어서 잘은 모르겠지만, 가까운 몇년전만해도
색을 표현해야할때 톤을 붙이는 것이 일반적이었다.
기억나는지 ? 톤은 흰색과 검은색밖에 없지만 , 진한 부분은 검은 점이 잦게 찍혀있었고, 그렇지 못한 부분은 검은점이 드물게 찍혀있었다.
필자가 초등학생땐, 만화-라긴 민망하고 낙서에 가까웠다-를 그릴때 톤처럼 표현하겠다고 모나미 펜으로 일일히 점을찍기도......

쨌든!
요는 , 제한 된 개수의 색에서도 색을 좀 더 다채롭게 표현하는 이 '톤'의 기법이 Dithering 이다.

표준 디더링 매트릭스 D = [ 0 128 ; 192 64 ] 를 이용하여 디더링해보자!


13번 라인: repmat - 아마도 repeat matrix의 abbreviation? D 매트릭스를 128 X 128 개 갖는 매트릭스를 생성한다.
14번 라인: g는 grayImage이고, 매트릭스끼리의 비교는 동일한 인덱스끼리 이루어진다. 비교 대상 픽셀의 값이 계속해서 바뀌기 때문에 값이 같은 픽셀끼리도 다른 색이 될 수 있다. 하지만 상대적으로 밝은 부분은 아무리 인덱스가 바뀌어도 대부분 하얀색을 유지할것이며, 그렇지 않은 부분은 검은색을 유지하는데, 이 비교대상 픽셀값의 변경으로 '톤'과 같은 효과를 낼 수가 있다.

Figure 2. 디더링 결과


Figure 1과 같이 사실은 이진영상이지만 , 비교적 다채로운 색상이 표현되었다!