各种不同的卷积滤波核有不同的频率响应特性,我们以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)
画出来是这样: