Matlab을 이용한 영상처리 - 2. Matlab의 기본

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

2 학년때 Matlab기본 조작법을 선형대수학 시간에 알려줬었지만, 사실 실제로 실습을 한 것도 아니고 ..
제대로 사용해 보는 것도 이번이 처음이다.

때문에 내 의지와 상관없이 아주 기본부터 해보았다..
불행히도 나는 하이라이트 기능 사용법을 모르기 때문에 (ㅠ_ㅠ) 스크린샷을 일일히 찍었다.


첫 소스답게 짧다. 하지만 의외로 많은 것이 이루어져있다.
C 나 Java에서 이만한 작업을하려면 , 먼저 이미지를 불러오는데만 3~5라인, (CreateBitmap, DrawBitmap...) 픽셀을 받아오는데만 수십 라인... (Java , 안드로이드에서는 그래도 함수하나로 해결이 된다)그리고 조작에 for문 등의 삽질이 들어가는데 .. 아주 편하다.

짧지만 이미지 크기 조정도 해보고, grayscale로도 만들어보고, 밝기조절(?)도 해보고 이진화도 되었다. 평균 2라인.. 이래서 영상처리는 Matlab을 하라고 하는가 보다.

아무튼, Line by line으로 짚고 넘어가보자.
먼저 첫번째 라인 w = imread('img_0605.jpg'); Image read의 약어(Abbreviation) 이다.
현재 폴더(Matlab의 작업환경)에서 이미지를 읽어와 w 변수에 저장, resize를 통해 250 x 250의 크기로 조정하였다.

figure를 통해 새창을 띄우고, 그 새창에 image를 보여준다(show)  여기서 콤마(,)는 그저 한 작업이 끝났음을 표기한 것이다. (한 라인에 표기하기 위해. 콤마가 없을때는 에러가 발생한다. 콤마없이 쓰고싶다면 엔터키를 살포시 눌러주자)
이를 세미콜론(;)과 혼동할 가능성이 있는데, Matlab에서 세미콜론은 조금 특별한 의미가 있다.

; 표기시, 실행결과를 보여주지 않는다. 만약 1번째나 2번째 라인에서 ;이 표기 되지 않고 한줄이 끝났다면, w 의 사이즈 만큼의 Matrix가 Command Window에 출력된다. 이 Matrix의 수치값은 지금 당장 필요치 않기때문에 ;을 넣어주었다.

3번 라인까지의 실행결과는 다음과 같다. Figure 1 : 원본이미지


9번라인이 현재 주석처리가 되어있다. 머리에 붙어있는 %를 떼고 실행하면 Figure 2가 짜잔하고 나타난다. RGB 형태인 원본이미지 w를 함수(rgb2gray)를 사용, 간단하게 grayscale화 시켰다.


Figure 2 : GrayScale


11번 라인을 보자. w를 double형으로 변환시켜 d 변수에 저장했다.
Matrix d의 어떤 픽셀은 125.00 일 수도 있고, 255.00 일 수도 있다. 그런데 imshow 함수는 double형을 출력 할때 0~1의 범위내에서만 색상을 표현한다. 그럼 125.00인 픽셀과 255.00인 픽셀은 어떻게 될까?
1로 간주 된다. 1은  흰색으로 약속되어 있기 때문에 , 125도 255도 , 1도 흰색이 되어 원하는 이미지를 얻기는 어렵다.

그럼 double형의 이미지를 제대로 출력하려면 어떻게 해야 할까 ?
간단하다. d를 /255로 나눈 몫을 이용하면 된다. 12라인과 같이 매트릭스에 /x 를 연산하면 매트릭스의 모든 값이 /x연산을 수행한 결과가 되기 때문에 올바르게 분포된 0~1사이의 이미지를 얻을수 있다.

11번라인은 /255 대신에 128을 수행하였다.
128로 나누면 범위가 0~2임을 의미하고, 여기서 1~2는 흰색으로 디스플레이 되므로
그 결과는 원본 이미지보다 밝게 나타나게 된다.

Figure 3. 밝은 이미지
 

15번 라인을 보자. grayscale 이미지중 100보다 큰 값은 참 (1)이 된 Matrix를 b에 저장하였다.
나머지는 거짓(0)이 되므로 1과 0 두값만 가지게 되며, 따라서 이미지는 이진화가 된다.

Figure 5 . 이진화


Matlab에 대한 기본적인 문법설명 또한 첨부되다보니 분량이 많이 늘었다.
그래도 이미지가 들어가니 이제 좀 영상처리에 대한 포스팅 다워졌다.

다음 글은 비트평면과 공간분해능(모자이크)에 대해 알아본다.