3

我正在尝试编写一个简单的 matlab 代码,该代码使用fft. 我尝试了已知的图像扩展算法,它计算图像的傅里叶变换,用零填充它并计算填充图像的逆傅里叶。然而,逆傅立叶变换返回包含复数的图像。因此,当我尝试使用 显示结果时imshow,出现以下错误:

Warning: Displaying real part of complex input.

你知道我在做什么错吗?

我的代码:

im = imread('fruit.jpg');
imFFT = fft2(im);
bigger = padarray(imFFT,[10,10]);
imEnlarged = ifft2(bigger);

谢谢!

4

3 回答 3

6

这是因为 FFT 返回的值对应于从 0 到 Fs 的离散(空间)频率,其中 Fs 是(空间)采样率。您需要在高频处插入零,这些零位于返回的 FFT的中心,而不是在其末端。

您可以使用fftshift将高频移到末尾,用零填充,然后移回ifftshift(感谢@Shai 的更正):

bigger = ifftshift(padarray(fftshift(imFFT),[10,10]));

另外,请注意,用零填充会减小放大图像中的值。您可以使用合适的放大系数来纠正它amp,在这种情况下,它等于(1+2*10/length(im))^2

bigger = ifftshift(padarray(fftshift(amp*imFFT),[10,10]));
于 2013-11-05T11:23:33.947 回答
3

您可以直接以更高的频率填充(没有Luis Mendofftshift的建议)

>> BIG = padarray( amp*imFFT, [20 20], 0, 'post' );
>> big = ifft2( BIG );
于 2013-11-05T11:39:05.473 回答
3

如果您想要一个严格真实的结果,那么在执行 IFFT 之前,您需要确保零​​填充数组是完全共轭对称的。添加偏离中心的零点可以防止这种所需的对称性。

由于有限的数值精度,您最终可能仍会得到一个复杂的 IFFT 结果,但虚部都将是基本上等于零的微小值。

您的 FFT 库可能包含半实数(2D 的四分之一大小输入)版本,该版本强制对称并为您丢弃几乎为零的数字噪声。

于 2013-11-05T16:26:57.327 回答