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



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

谢谢!

这是因为 FFT 返回对应于从 0 到 F 的离散(空间)频率的值,其中 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]));

您可以直接在更高的频率上垫音(无需路易斯·门多建议fftshift

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

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

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

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

最新更新