“imfilter”可以在频域工作吗?

时间:2017-07-25 14:37:11

标签: matlab image-processing filter frequency-domain gabor-filter

根据this Quora answer,Gabor滤波器是一个频域滤波器。并且,here is an implementation Gabor过滤器使用imfilter()来实现过滤,这意味着

  

imfilter()适用于频域

现在,让我们看一下源代码#1

如果我更换

I_ffted_shifted_filtered = I_ffted_shifted.*Kernel;

I_filtered = imfilter(I, Kernel);

如下

function [out1, out2] = butterworth_lpf_imfilter(I, Dl, n)

    Kernel = butter_lp_kernel(I, Dl, n);

    I_filtered = imfilter(I, Kernel);

    out1 = ifftshow(ifft2(I_filtered));

    out2 = ifft2(ifftshift(I_filtered));
end

我们无法获得预期的输出,

enter image description here

为什么这不起作用? 我的代码中有什么问题?

源代码#1

的main.m

clear_all();
I = gray_imread('cameraman.png');
Dl = 10;
n = 1;
[J, K] = butterworth_lpf(I, Dl, n);    
imshowpair(I, J, 'montage');

butterworth_lpf.m

function [out1, out2] = butterworth_lpf(I, Dl, n)    
    Kernel = butter_lp_kernel(I, Dl, n);        
    I_ffted_shifted = fftshift(fft2(I));

    I_ffted_shifted_filtered = I_ffted_shifted.*Kernel;

    out1 = ifftshow(ifft2(I_ffted_shifted_filtered));        
    out2 = ifft2(ifftshift(I_ffted_shifted_filtered));
end

butter_lp_kernel.m

function k = butter_lp_kernel(I, Dl, n) 
    Height = size(I,1); 
    Width = size(I,2);                
    [u, v] = meshgrid( ...
                    -floor(Width/2) :floor(Width-1)/2, ...
                    -floor(Height/2): floor(Height-1)/2 ...
                 );         
    k = butter_lp_f(u, v, Dl, n);    

function f = butter_lp_f(u, v, Dl, n)
    uv = u.^2+v.^2;
    Duv = sqrt(uv);
    frac = Duv./Dl;
    denom = frac.^(2*n);
    f = 1./(1.+denom);

输出

enter image description here

1 个答案:

答案 0 :(得分:2)

imfilter采用图像A和空间域内核h的空间域表示,并返回空间域图像B.无论用于计算B的域或算法是实现细节。也就是说,imfilter使用空间卷积来计算B。

正如您在上面的评论中所看到的,Gabor滤波器不是"频域滤波器"。 Gabor过滤器是LTI,因此过滤操作可以在任一域中实现。这应该是有意义的,因为高斯调制用正弦波"在讨论Gabor滤波器组时,文献中经常显示的波形属于空间域。

Example of spatial domain Gabor filter kernels

碰巧在空间域中,Gabor滤波器内核可能会变大并且在一般情况下是不可分离的,除非θ是90度的倍数,除非您想使用近似技术。因此,为了速度目的,通常使用Gabor滤波的频域实现。这就是imgaborfilt在IPT中的作用。

如果您有IPT,我建议您查看gabor和imgaborfilt中的代码以获取更多信息。

https://www.mathworks.com/help/images/ref/imgaborfilt.html

https://www.mathworks.com/help/images/ref/gabor.html

在您使用的实现中,他们使用频域实现。如果要使用imfilter,则必须传入Gabor过滤器的等效空间域表示。将Gabor滤波器的频域表示传递给您正在进行的imfilter是没有意义的。这不是Gabor过滤操作。