本文要点都体现在最后的Matlab 例子。
1. g=ifft2(fft2(f).*fft2(h))
这样g 对应f和h的 circular convolution,
考虑一维信号,循环卷积通常是对两个长度为 N的信号说的,普通卷积有反折,平移,乘加三个步骤,循环卷积要把f或者h做周期为N的延拓,之后是同样的三个步骤。
Matlab 中 DFT 域循环卷积正确做法:(像素域可用 imfilter 完成,且h不进行如下的变换)
假设 f为mxn图像,h为size小于f的滤波器。f 不进行padding, 先将h移到mxn的中心,然后fftshift 移到四个角落。这样h会很怪,但是要想象把h进行mxn的周期延拓。
g=ifft2(fft2(f).*fft2(h)) 结果为循环卷积
循环卷积对应矩阵相乘,矩阵为 circulant matrix.
2. Matlab 中 DFT域正常卷积正确做法:注:padding 为在尾部加zeroes

注意Matlab 中 fft2(f) 和 ifft2(F) 对应的 f 和 F 都是 centered at (0,0),亦即matlab的(1,1),因为 DFT 是 periodic,因此中心为 (0,0)(M-1,0)(0,N-1)...
如设计的频域滤波器中心在 M/2,N/2,要使用 fftshift 把中心移到4个角落
fftshift和ifftshift貌似作用是一样的,对于2D信号,将图像分为4部分,1、3平移互换,2、4平移互换。
也可以把信号和滤波器的中心都移到图像中心,但是反变换之前要移回来。
cropping: 假设filter 为 9x9,中心为(5,5),用以上方法进行卷积计算后,最后步骤 cropping 要从 (5,5) 开始 crop,因为matlab 中图像中心为(1,1),padding 不改变中心。
code:
clear
clear
f = imread('d:\Lib\DigitalImageProcessing\DIPUM\img\dipum_images_ch06\Fig0604(a)(iris).tif');
f = rgb2gray(f);
f = double(f)./255;
f = imresize(f,[128,128]);
[m n] = size(f);
%% Equivalence of padded DFT and normal convolution
%padding is appending zeros
addpath D:\Lib\DigitalImageProcessing\DIPUM\dipum_1.1.4
h2=zeros(9,9);
for i=-4:4
for j=-4:4
h2(i+5,j+5)= (1/(1+i*i+j*j));
end
end
h2 = h2/sum(h2(:));
ps = paddedsize(size(f),size(h2));
out1 = real(ifft2(fft2(h2,ps(1),ps(2)).*fft2(f,ps(1),ps(2))));
out1 = out1(5:m+4,5:n+4);
figure
subplot 121
imshow(out1)
out2 = imfilter(f,h2,'same','conv'); %zero padding
subplot 122
imshow(out2)
% Test whether out1 and out2 are the same
find(abs(out1-out2)>10^-5)
%% Equivalence of non-padded DFT and circular convolution
middle = n/2 + 1;
h = zeros(size(f));
for i=-4:4
for j=-4:4
h(i+middle,j+middle)= (1/(1+i*i+j*j));
end
end
h = fftshift(h);
h = h/sum(h(:));
zz = real(ifft2(fft2(h).*fft2(f)));
zz2 = imfilter(f,h2,'same','conv','circular');
figure
subplot 121
imshow(zz,[])
subplot 122
imshow(zz2,[])
find(abs(zz-zz2)>10^-5)
FFTSHIFT 和 DFT/IDFT 的关系
注意箭头是双向的
Power Spectrum
对于实信号
注意是相关,而不是卷积。以上式子,对于普通相关和循环相关都是成立的。
code
注意此处 imfilter 取 full,然后从 (m,n) 处截取。这是因为 imfilter 使用 same 的截取方法不保证 (1,1) 处是自相关的原点。
clear
f = rand(4,4);
r = [1 -1 1 -1
-1 1 -1 1
1 -1 1 -1
-1 1 -1 1];
% DFT
ffft = fft2(f);
ffft2 = fft2(f.*r);
find(ffft~=fftshift(ffft2))
ffft3 = fft2(fftshift(f));
find(ffft~=ffft3.*r)
% IDFT
finv = ifft2(f);
finv2 = ifft2(f.*r);
find(finv~=fftshift(finv2))
finv3 = ifft2(fftshift(f));
find(finv~=finv3.*r)
% Power Spectrum
zz = imfilter(f,f,'full','corr','circular');
[m n]=size(f);
zz=zz(m:end,n:end);
zz2 = ifft2(abs(fft2(f)).^2);
find(abs(zz-zz2)>10^-4)


0 comments:
Post a Comment