根据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
我们无法获得预期的输出,
为什么这不起作用? 我的代码中有什么问题?
源代码#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);
输出
答案 0 :(得分:2)
imfilter采用图像A和空间域内核h的空间域表示,并返回空间域图像B.无论用于计算B的域或算法是实现细节。也就是说,imfilter使用空间卷积来计算B。
正如您在上面的评论中所看到的,Gabor滤波器不是"频域滤波器"。 Gabor过滤器是LTI,因此过滤操作可以在任一域中实现。这应该是有意义的,因为高斯调制用正弦波"在讨论Gabor滤波器组时,文献中经常显示的波形属于空间域。
碰巧在空间域中,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过滤操作。