卷积滤波核的FFT频率响应分析

各种不同的卷积滤波核有不同的频率响应特性,我们以bicubic插值kernel为例,用Matlab绘制出频谱图,可以看出卷积后哪些频率成分会被加强,哪些频率成分会被减弱。

首先分享一个介绍图像傅立叶变换的资料:https://www.cs.unm.edu/~brayer/vision/fourier.html

我们以bicubic插值kernel为例,先定义一个二维卷积核,d在0-1之间,表示采样相位,a在 -1 到 0 之间,表示采样kernel的形状:

function k = bicubic_kernel(d, a)
k1 = zeros(4,1);
k1(1) = bicubic_wt(d-2, a);
k1(2) = bicubic_wt(d-1, a);
k1(3) = bicubic_wt(d, a);
k1(4) = bicubic_wt(d+1, a);
k = k1*k1';
end


function r = bicubic_wt(d, a)
d = abs(d);
d2 = d*d;
d3 = d2*d;
r1 = (a+2)*d3 - (a+3)*d2 + 1;
r2 = a * d3 - 5*a*d2 + 8*a*d - 4*a;
r = (d<=1) * r1 + (d>1&&d<=2)*r2;
end

接下来我们做一个实验,首先,看一个周期纹理的频谱,然后,看下两个bicubic kernel的频谱响应,kernel fft之后大于1的区域,会因为卷积加强对影频率成分,反应在kernel fft之后幅度谱上,就是大于1的值,就是代码中打印出的sp点。

I = zeros(400, 400);
%I(1:4:end,:) = 1;
I(1:4:end,1:4:end) = 1;

Y = fft2(I,1600,1600);
figure('Color','White','Position',[0,0,1150,450])
subplot(121),imshow(I);
subplot(122),imagesc(abs(fftshift(Y)));

k1 = bicubic_kernel(0.5, -0.5);
k2 = bicubic_kernel(0.5, -0.75);

f1 = fft2(k1, 400, 400);
f2 = fft2(k2, 400, 400);
m1 = abs(fftshift(f1));
m2 = abs(fftshift(f2));

figure('Color','White')
subplot(121),imagesc(k1);
subplot(122),imagesc(abs(fftshift(f1)));
figure('Color','White')
subplot(121),imagesc(k2);
subplot(122),imagesc(abs(fftshift(f2)));

figure('Color', 'White'), surf(abs(fftshift(f1)))
figure('Color', 'White'), surf(abs(fftshift(f2)))

sp = 200-70;

m1(sp, sp)
m2(sp, sp)

画出来是这样:

发表评论