图像处理 - 使用FFT放大图像(Matlab代码)

时间:2013-11-05 11:11:50

标签: matlab image-processing fft image-enlarge

我试图编写一个简单的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);

谢谢!

3 个答案:

答案 0 :(得分: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]));

答案 1 :(得分:3)

您可以直接在较高频率进行填充(Luis Mendo建议不使用fftshift

>> BIG = padarray( amp*imFFT, [20 20], 0, 'post' );
>> big = ifft2( BIG );

答案 2 :(得分:3)

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

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

你的FFT库可能包含半实体(四分之一尺寸的2D输入)版本,它可以强制对称,并为你抛弃几乎为零的数字噪音。