MATLAB如何应用高斯滤波器而不使用imfilter和fspecial函数

时间:2014-04-28 09:58:27

标签: matlab image-processing filter

我必须在不使用imfilter和fspecial函数的情况下对图像应用高斯滤镜。我写了这样的代码,但它不起作用:

I=imread('IMG.tif'); 

[row,col]=size(I); 
k=input('k girin'); 
s=input('sigma girin'); 
for i=1:row 
    for j=1:col 
        h(i,j)=(1/2*pi*s^2)*exp(-((i-k-1)^2 + (j-k-1)^2)/2*s^2); 
    end
end

我不知道如何在没有这些功能的情况下应用高斯滤波器。你能帮我么 ?感谢。

3 个答案:

答案 0 :(得分:1)

代替imfilter,有几种选择。

您可以使用filter2xcorr2。它基本上做同样的事情,除了边界(零填充是唯一的规则)。函数conv2是相同的,对称内核(事实上filter2调用conv2)。因此,您只需要在边界上扩展图像,根据规则填充边界,过滤图像,然后从结果图像中删除边界。

至于fspecial,这个有用的功能设计了预定义的过滤器。在doc中,编写了这些过滤器的公式,因此实现起来非常简单。您还可以查看this post代码示例。

编辑:这是一个代码,用于生成大小为[2*N1+1,2*N2+1]且标准偏差(沿着x和y)[s1,s2]的高斯滤波器:

h = exp(-(-N1:N1).^2/(2*s1^2)).'*exp(-(-N2:N2).^2/(2*s2^2));
h = h/sum(h(:));

答案 1 :(得分:0)

看起来像

h(i,j)=(1/2*pi*s^2)*exp(-((i-k-1)^2 + (j-k-1)^2)/2*s^2); 

只需生成高斯滤波器的元素,但不会将其乘以相应的图像像素。从本质上讲,问题在于你根本就没有在这里进行卷积。

更好的方法是首先创建给定大小和sigma的过滤器。使用imshow显示过滤器,以确保其正确。然后编写代码进行卷积。提示:在图像上的两个嵌套循环内,过滤器上应该有两个嵌套循环。

编辑:如果你要做的就是创建过滤器,那么你还有其他一些问题。首先,您应该使用zeros函数预分配过滤器。其次,您的过滤器不应该是图像的大小。它应该是小的,如5x5或9x9。在您的代码中,循环遍历图像中的所有像素,这将使过滤器与图像的大小相同。

答案 2 :(得分:0)

最简单的方法是使用fourier convolution theorem在傅立叶域中。该定理简单地说明空间域中的卷积是傅里叶域中的乘法。由于高斯的傅立叶变换是高斯变换,这使问题更容易。不需要循环。像这样的东西会起作用:

sigma = input('Input a standard deviation in the fourier domain: ');
im=imread('peppers.png');
[rows,cols,bands]=size(im);
%make the meshgrid of coordinates
x=1:cols;y=1:rows;
[X,Y] = meshgrid(x,y);
%compute the filter in the fourier domain,
%centered top right so we dont need to shift
filter = mvnpdf([X(:) Y(:)],[0 0]',sigma.*eye(2));
filter = reshape(filter,[rows,cols]);
%convolution theorem
im_fft = fft2(im);
im_filt = ifft(im_fft.*repmat(filter,[1,1,bands]));
%display
figure;subplot(1,2,1);imagesc(im);title('Original image');
subplot(1,2,2);imagesc(im_filt);title('Filtered Image');