Matlab을 이용한 영상처리 - 8. 샤프닝과 ROI 처리

Programming/Image Processing 2010. 8. 30. 19:49
저번 글에서 고주파와 저주파 필터에 대해 살펴보았다 .
이번 포스팅은 좀더 실용적인 부분에 주안점을 두게 될것인데 ,

1. sharen
첫번째로 살펴 볼 내용은 edge sharpen이다 . 이 필터를 사용하게 되면 뚜렷하게 이미지를 볼 수가 있다.
알고리즘은 이러하다 .

원 영상에서 평균 필터링으로 얻은 영상을 빼주면 뚜렷한 부분만 남게 된다 . 

 

10 번 , 11번 라인에서 평균 필터링 이미지를 만들고 12번라인에서 원 영상에서 이 값을 빼어주고 있다.
결과를 보자.


2 번 글의 이미지와 비교해보기 바란다. 산부분에서 좀더 뚜렷한 이미지가 보인다.

 샤프닝
1. 원영상 - average로 흐릿해진 영상
2. 정의된 필터 (unsharp)사용



2. ROI

지금까지 필터링을 영상 전체에 걸쳐 적용시켰다면, ROI(Region of interest)는 영역을 지정하고 그 영역내에서만 필터링등을 적용한다.

roipoly 함수를 이용하여 해당 영역을 지정할 수 있는데, 그 좌표값은 [열][행] 순이며, 적은 순서대로 선을 이어 영역을 만드는 형태이므로 순서를 제대로 지키지 않으면 영역이 맞꼭지각을 이루는 리본모양이 될 수도 있으니 주의!

영역을 설정하고 나면 roifilt2를 이용하여 해당 영역에만 만들어놓은 필터를 적용가능하니 이용해보자.


roi 변수에 영역을 지정하고, average 와 unsharp를 이용해보았다.




아래쪽의 팔목에만 각각 unsharp, average 필터를 적용하였다.
그 차이는 일목요연하다.

 roi
roipoly(image, [열],[행]);  -  영역 지정
roifilt2(filter,image,region);  -  지정 영역에 필터 적용

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

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