我正在尝试编写一个简单的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 的四分之一大小输入)版本,该版本强制执行对称性并为您丢弃几乎为零的数值噪声。