您的函数试图同时测试两件事:(1)对图像进行FFT和逆FFT,以及(2)将复数分解为实部和虚部,变换为幅度和相位,然后将其重新放在一起。您不必立即尝试整个过程并想知道为什么它不起作用,您应该分别测试这两个功能。
要测试ifft(fft(image))
是否返回原始图像,您可以删除或注释掉所有复数操作:
function y = forwardBackwardFFT(image)
F = fft2(image);
%# stuff removed
f = ifft2(F);
subplot(1,2,1);
imshow(image);
title('Original Image');
subplot(1,2,2);
imshow(f, []);
title('Image after forward and backward FFT');
y = f;
这有效 。所以问题出在您的复数操作上。考虑当phase = 0或phase = pi / 2时会发生什么。 0的切线为0,导致被零除; tan(pi / 2)是无限的。
这是一些有效的代码:
mag = sqrt(real(F).^2 + imag(F).^2);
phase = atan2(imag(F),real(F));
re = mag .* cos(phase);
im = mag .* sin(phase);
F = re + 1i*im;
为了显示最终的逆变换图像,您将必须执行imagesc(abs(f))
来摆脱(几乎为零)虚构分量。
获取复数的大小和相位的更惯用的方法是简单地执行以下操作:
mag = abs(F);
phase = angle(F);
希望这可以帮助。
0
傅立叶变换F的大小和相位定义为:
和
我尝试编写matlab代码,该代码采用灰度图像矩阵,对矩阵执行fft2(),然后从变换中计算幅度和相位。然后,我希望计算傅立叶变换的虚部和实部。通过将前两个方程重新安排为:
和
最后组合并逆向fft2:
我希望看到与输入相同的图像,但是我得到了垃圾。我的数学错了吗?我的matlab mfile代码如下:
非常感谢 :)