2D Gaussian Convolution filter

2D space에서 image smoothing, noise 제거 등을 위해서 Gaussian filter를 적용할 때가 있다.

Matlab에는 워낙 다양한 toolbox들이 있어서 간혹 유사한 기능을 하는 함수들이 존재하기도 하는데, 때문에 같은 기능을 다양한 방식으로 구현을 할 수 있다.

오늘 imgaussfilt 함수와 mvnpdf 함수를 사용해서 Gaussian filter를 적용을 하다가 몇가지 차이점과 유의점을 발견하여 이곳에 적는다.

 

Original Image

코드 설명에 사용할 Original Image를 만드는 코드이다.

100 x 100 이미지에 (50, 50) 과 (20, 50) 의 pixel만 1의 값이 들어가있다.

originalImage = zeros(100,100);
originalImage(50, 50) = 1;
originalImage(20, 50) = 1;

Method 1: imgaussfilt

함수 개발 목적 자체가 2D 이미지에 Gaussian filter를 적용하기 위한 것이기 때문에 가장 간단하게 원하는 목적을 달성할 수 있다.

figure(1);
clf;
sigma = 1;
fimage1 = imgaussfilt(originalImage, sigma, 'FilterSize', 101);
imagesc(fimage1);

여기서 중요한 것은, 'FilterSize' Name-Value pair인데, 이 값을 입력하지 않거나, 작은 값으로 설정하는 경우 convolve 하는 kernel의 크기가 작아서 빠르지만 조금은 부정확한 결과가 나올 수 있다.

참고로 fimage1의 합은 2가 된다.

 

Method 2: mvnpdf로 kernel을 만든 뒤 conv2

직접 2D Gaussian kernel을 만든 뒤에 원본이미지와 conv2 함수를 사용해서 적용하는 방식이다.

[X,Y] = meshgrid(1:101, 1:101);
X = X(:);
Y = Y(:);
mu = 51;
sigma = [1, 0; 0, 1];
kernel = reshape(mvnpdf([X,Y],mu,sigma),101, 101);

fimage2 = conv2(originalImage, kernel, 'same');

figure(2);
imagesc(fimage2);

51의 값은 101 크기의 kernel의 중간값이다.

 

위 결과는 imgaussfilt의 결과와 정확히 일치한다.

 

 

 

함수 개발 목적 자체가 2D 이미지에 Gaussian filter를 적용하기 위한 것이기 때문에 가장 간단하게 원하는 목적을 달성할 수 있다.

Posted by Knowblesse