2017-09-26 13:03:35

지난 번에 엣지 검출이 왜 영상처리분야에서 중요한지에 대해서 생물학적인 근거를 가지고 이야기했었다. (http://bskyvision.com/132) 오늘은 엣지 검출의 한 방법인 Laplacian of Gaussian(LoG)에 대해 다루려고 한다. 



▶ LoG는 무엇인가?


LoG는 Marr과 Hildreth에 의해 1980년에 제안된 방법이다. 먼저 2D 가우시안 함수(공식 1)를 사용하여 이미지를 블러시킨다. 노이즈를 제거 및 완화시키기 위함이다. 노이즈를 엣지로 착각할 수 있기 때문이다.


...(공식 1: 2D 가우시안 함수)


여기서, x, y는 이미지의 픽셀 위치를 의미하고, 는 표준편차를 의미한다(때때로 space constant라고도 불린다). 값이 커질수록 이미지는 더욱 더 흐릿해진다.


그 다음에 라플라시안 연산자(공식 2)를 사용하여 수평 방향, 수직 방향으로의 2차 미분을 구한다. 엣지를 찾기 위함이다.  

 

...(공식 2: 라플라시안 연산자)


이것을 하나로 통합시키면 아래와 같다. 


...(공식 3: LoG 연산자)


LoG 함수의 모양은 그림 1과 같다. 멕시코 전통 모자의 형태와 비슷하므로 LoG 연산자는 Mexican hat 연산자라고도 불린다. 그림 1의 왼쪽 그래프는 공식 3을 그대로 나타낸 결과이고, 오른쪽은 공식에 마이너스(-)를 곱한 결과이다. 왼쪽 그래프의 경우 중앙부는 움푹 깊이 들어가있고, 주변부는 살짝 올라와있다. 오른쪽 그래프의 경우 중앙부는 솟아나와 있고, 주변부는 살짝 들어가 있음을 볼 수 있다.  


그림 1. LoG 함수의 그래프. 이 그래프들은 matlab에서 fsurf 함수를 활용해서 구현했다.

 


이 그래프들을 통해, LoG 연산자는 http://bskyvision.com/132에서 설명한 우리 눈 안의 망막 신경절 세포를 모델링한 것으로 볼 수 있다. 참고로 망막 신경절 세포는 망막에 맺힌 이미지에서부터 엣지를 검출하는 역할을 한다. 두 가지 유형의 망막 신경절 세포가 있는데, OFF-center 신경절 세포는 왼쪽 그래프와 같은 반응을 보인다. 세포의 중앙부에 빛이 비치면 반응이 많이 억제되고, 주변부에 빛이 비치면 평소보다 반응을 활성화된다. 반면 ON-center 신경절 세포는 오른쪽 그래프와 같이 동작한다. 중앙부에 빛이 비치면 크게 활성화되고, 주변부에 빛이 비치면 억제된다. 두 유형의 세포 모두 중앙부, 주변부에 동시에 빛이 비치면 빛이 비치지 않을때와 마찬가지의 활성도를 갖는다. 즉 활성도에 변화가 없다. 이러한 특성을 통해서 어떻게 엣지를 검출해내는지는 http://bskyvision.com/132를 참고하길 바란다. 


라플라시안 연산자(공식 2)의 역할을 n x n 사이즈의 마스크로 근사하게(거의 비슷하게) 수행할 수 있다. 라플라시안 마스크는 딱 하나로 정해져있는 것은 아니다. n이 홀수이어야 하고, 모든 요소의 값을 더했을 때 0이 되고, 그림 1의 멕시칸 모자의 형태만 모방하는 꼴이면 된다. 모든 요소의 값의 합이 0이 되어야 하는 이유는 픽셀값의 변화가 없는 부분(즉 엣지가 아닌 부분)에서는 반응하지 않아야 하기 때문이다. 그림 2에 있는 것들이 라플라시안 마스크로 사용될 수 있다. 


그림 2. 라플라시안 마스크.



LoG 연산의 알고리즘을 정리해보자. 

1. gaussian 필터 처리해서 블러된 이미지를 얻는다. 

2. 블러된 이미지를 라플라시안 마스크로 컨볼루션해주면 엣지 영상을 얻을 수 있다. 


n x n LoG 필터의 사이즈(gaussian filter와 라플라시안 마스크의 사이즈)를 결정할 때  n은 와 같거나 큰 수 중에 가장 작은 홀수여야 한다. 즉, 가 0.5라면 3 x 3 사이즈의 마스크를 사용해야 하고, 가 1.4라면 9 x 9의 마스크를 사용해야 한다. (왜 이렇게 사용해야하는지 이유는 아직 정확히 모르겠다.. )



▶ LoG 매트랩 코드


그러면 매트랩으로 LoG 연산을 구현해보자. 먼저 gaussian 필터를 적용해서 블러된 이미지를 얻은 다음, 라플라시안 마스크로 컨볼루션해주면 끝! 아래 매트랩 코드를 참고하자.


clc, clear, close all


img = imread('GOPR0688.jpg');


img = rgb2gray(img);

imshow(img);

img = double(img);


% 가우시안 마스크

h1 = fspecial('gaussian', 3, 0.5); 

h2 = fspecial('gaussian', 5, 0.8); 

h3 = fspecial('gaussian', 9, 1.4); 


% 가우시안 마스크로 블러된 영상 얻기

blurred_img1 = conv2(img, h1); 

blurred_img2 = conv2(img, h2); 

blurred_img3 = conv2(img, h3); 

 

% 라플라시안 마스크

lap1 = [1 1 1; 

          1 -8 1; 

          1 1 1]; 

lap2 = [0 0 1 0 0; 

          0 1 2 1 0; 

          1 2 -16 2 1; 

          0 1 2 1 0; 

          0 0 1 0 0]; 

lap3 = [0 1 1 2 2 2 1 1 0; 

          1 2 4 5 5 5 4 2 1; 

          1 4 5 3 0 3 5 4 1; 

          2 5 3 -12 -24 -12 3 5 2; 

          2 5 0 -24 -40 -24 0 5 2;

          2 5 3 -12 -24 -12 3 5 2;

          1 4 5 3 0 3 5 4 1;

          1 2 4 5 5 5 4 2 1;

          0 1 1 2 2 2 1 1 0]; 


% 블러된 영상을 라플라시안해서 엣지 영상 얻기

LoG_img1 = conv2(blurred_img1, lap1);

LoG_img2 = conv2(blurred_img2, lap2);

LoG_img3 = conv2(blurred_img3, lap3);


figure, imshow(mat2gray(LoG_img1));

figure, imshow(mat2gray(LoG_img2));

figure, imshow(mat2gray(LoG_img3));


이 코드로 구현된 엣지 영상들이다(그림 3). 작은 사이즈의 LoG 필터를 사용할 수록 좀 더 날카롭고 세밀한 엣지를 검출했고, 사이즈가 커질 수록 좀 더 큼직한 엣지들을 검출한 것을 볼 수 있다.


그림 3. LoG 필터로 얻은 엣지 이미지들.


오늘 정리한 LoG는 Difference of Gaussian (DoG)에 의해서 근사될 수 있다. 


...(공식 4: DoG 연산자)


DoG에 대해서 간단히 말하자면, 원본 이미지를 다른 값들로 가우시안 필터링한 두 개의 블러된 이미지를 빼면 LoG로 얻은 엣지 영상과 굉장히 비슷한 영상을 얻을 수 있다는 것이 핵심이다. 이 때 두 개의 값들은 1.6:1의 비율을 가져야 한다. DoG가 연산상의 편리함으로 인해 LoG보다 좀 더 많이 사용되는 것 같다. 



<참고 자료>

[1] Gonzalez 2010, "Digital Image Processing, Third Edition", p.736-741

[2] http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm => 9 x 9 사이즈의 LoG 필터 마스크 참고.