从相位和幅度获取傅立叶变换-Matlab
image-processing
matlab
6
0

傅立叶变换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;

非常感谢 :)

参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

您的函数试图同时测试两件事:(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);

希望这可以帮助。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号