图像的零填充傅里叶

Zero padding fourier of image

我正在尝试解决一个问题, 给定大小为 N,M 的图像 f(x,y),并进行傅立叶变换 F。 我们定义函数g,其傅立叶变换G定义如下:

G(x,y)=F(x,y) 如果 x

这意味着我们用零填充图像。 我尝试使用带有以下代码的 matlab 检查它:

i1 = imread('1.bmp');
i1 = im2double(i1);
k=fft2(i1);
newmat = padarray(k,[84,84],0,'post');
mat2=ifft2(newmat);
imshow(mat2);

出于某种原因,我得到了一个复杂的矩阵,我真的不能说出一些有趣的东西, 我错过了什么? (澄清一下,我试过的图像大小为 84x84)。

谢谢!

padding要加高频,这不是你做的。对于 1D FFT FF(2)F(end) 对应于相同的频率——在 2D 中,对于沿每个图像维度的每个图像线,这完全相同。通过扩展数组用零填充,您正在创建一个新的 F(end)。该值不再与 F(2) 中的值匹配。为了使逆变换成为实值,这两个值应该是彼此的复共轭。

解决方案是在数组的中间添加填充,那里是频率最高的地方。最简单的方法是先用fftshift把零频移到数组的中心,然后在数组周围填充,然后再移回去:

k = fft2(i1);
k = fftshift(k);
k = padarray(k,[84,84]/2,'both');
k = ifftshift(k);
mat2 = ifft2(k);

这样您就可以保留实值图像的傅里叶变换所期望的共轭对称性。


OP 似乎对在傅立叶频谱的不同部分用零填充时会发生什么感到困惑。这是一个小实验:

% Create a test image, a simple Gaussian, purely real-valued
x = linspace(-3,3,84);
img = exp(-0.5*x.^2);
img = img.' * img;
imshow(img)

% OP's method
k = fft2(img);
k = padarray(k,[84,84],0,'post');
k = complex(k); % This line does nothing
out = ifft2(k) * 4;
subplot(1,2,1); imshow(real(out)); title('real part')
subplot(1,2,2); imshow(imag(out)); title('imaginary part')

% Correct method
k = fft2(img);
k = fftshift(k);
k = padarray(k,[84,84]/2,'both');
k = ifftshift(k);
out = ifft2(k) * 4;
subplot(1,2,1); imshow(real(out)); title('real part')
subplot(1,2,2); imshow(imag(out)); title('imaginary part')

如您所见,在填充 'post' 时,您在傅立叶域中引入了不对称性,该不对称性转化为空间域中的非真实图像。相比之下,按照我在这个答案中的指示进行填充会导致保留共轭对称性,从而保留实值输出(虚部全黑)。

(抱歉图片周围都是白色 space)