-2

根据这个 Quora 答案,Gabor 滤波器是频域滤波器。而且,这里是一个Gabor 滤波器的实现,它imfilter()用于实现过滤,这意味着

imfilter()工作在频域

现在,让我们看一下Source Code #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

我们没有得到预期的输出,

在此处输入图像描述

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


源代码 #1

主文件

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);

输出

在此处输入图像描述

4

1 回答 1

2

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

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

空间域 Gabor 滤波器内核示例

碰巧在空间域中,Gabor 滤波器内核可能会变大并且在一般情况下是不可分离的,除非 theta 是 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 滤波操作。

于 2017-07-27T16:33:00.647 回答