matlab - 从相位和幅度获取傅里叶变换 - Matlab

标签 matlab image-processing signal-processing fft

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

相关文章:

java - 拼接2张图片(OpenCV)

python - 从图像中的绝对点创建相对点网格

c - IIR滤波器差分方程中负指标的处理

mysql - MySql使用fastinsert时中文变成乱码

matlab - 如何检测图像中的斜线?

matlab - 一次将一个数组中的元素添加到另一个数组

xml - 如何通过单个XPath表达式选择某些子项的所有属性?

python-3.x - 水平计数加工织物中的白色簇

swift - 使用 Swift 对增长的时间序列进行峰值检测

python - 如何使用平滑技术消除姿势估计中的抖动?