傅立叶变换 F 的幅度和相位定义为:
Mag = sqrt(Real(F)^2 + Imaginary(F)^2)
和
Phase = arctan(Imaginary(F)/Real(F))
我曾尝试编写接受灰度图像矩阵的 matlab 代码,对矩阵执行 fft2(),然后根据变换计算幅度和相位。然后我想计算傅立叶变换的虚部和实部。这是通过将前两个方程式重新排列为:
Real = Mag/sqrt(1 + tan(Phase)^2)
和
Imaginary = Real*tan(Phase)
最后合并和反演 fft2:
F = Real + i*Imaginary
image = ifft2(F)
我希望看到与输入相同的图像,但我得到的是垃圾。我的数学错了吗?我的matlab mfile代码如下:
function y = forwardBackwardFFT(image)
F = fft2(image);
mag = sqrt(real(F).^2 + imag(F).^2);
phase = atan(imag(F)./real(F));
re = sqrt((mag.^2)./(1 + tan(phase).^2));
im = re.*tan(phase);
F = re + i*im;
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;
非常感谢:)
最佳答案
您的函数试图同时测试两件事:(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);
希望这对您有所帮助。
关于matlab - 从相位和幅度获取傅里叶变换 - Matlab,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6393257/