我正在尝试解决一个问题, 给定大小为 N,M 且具有傅里叶变换 F 的图像 f(x,y)。 我们定义函数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)。
谢谢!
最佳答案
填充必须添加高频,这不是你正在做的。对于 1D FFT F
、F(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”时,您在傅里叶域中引入了不对称性,该不对称性转化为空间域中的非真实图像。相反,按照我在这个答案中指示的填充可以保留共轭对称性,从而保留实值输出(虚部全黑)。
(抱歉图像周围有所有空白)
关于image - 图像的零填充傅里叶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52575913/