【问题标题】:MATLAB How To Apply Gaussian Filter Without imfilter and fspecial functionsMATLAB 如何在没有 imfilter 和 fspecial 函数的情况下应用高斯滤波器
【发布时间】:2014-04-28 09:58:27
【问题描述】:

您好,我必须在不使用 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

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

【问题讨论】:

    标签: matlab image-processing filter


    【解决方案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(:));
    

    【讨论】:

    • 我想我无法表达清楚。我必须这样做只是循环。我不能为此作业使用特殊的 matlab 函数。你能帮助我吗?谢谢。
    • @user3580816 我添加了一个用于生成高斯滤波器的代码。你的意思是你不能使用任何matlab函数进行卷积?在那种情况下,我认为您必须了解here所写的内容
    • 对不起,我看不到代码,我会试试这个。谢谢
    【解决方案2】:

    最简单的方法是在傅立叶域中使用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');
    

    【讨论】:

      【解决方案3】:

      看起来像那条线

      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。在您的代码中,循环会遍历 图像 中的所有像素,这将使过滤器的大小与图像相同。

      【讨论】:

      • 是的,你是对的,我还没有做卷积,但我稍后会做。我不确定它是否有效。感谢您的帮助。
      猜你喜欢
      • 2018-05-02
      • 2021-05-22
      • 1970-01-01
      • 2011-02-15
      • 2014-07-21
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多