离散傅里叶逆变换复数的哪一部分?

信息处理 傅里叶变换
2022-01-27 08:37:14

好的,所以我们有一个图像是原始图像的傅立叶逆。我们想要恢复原始图片。我们使用 Matlab 来完成这项工作。我们导入图像,然后在 ifft() 的帮助下反转它,这给了我们一个复数矩阵。但是要得到原始图片,我们需要对复数做一些操作才能得到它。但那是什么操作。我尝试了幅度、实部和虚部,但这并不能创造出我们想要的画面。

2个回答

要应用IFFT你需要返回信号做复数,你需要使用幅度和相位信息来正确重建。

真正的部分是=magnitude * cos(phase)

虚部是=magnitude * sin(phase)

您可以使用 -1 ( ) 的平方根sqrt(-1)来获得虚数单位。

现在将虚部乘以虚部并与实部相加,现在您完成申请了IFFT

最后,我应用 mat2gray 函数将矩阵转换为强度!

这里是如何在matlab中真正完成的:

x=imread('C:\Users\Eder\Pictures\download.jpg');
figure(1);imshow(x);
%Make FFT
y=fft(x);
%Amplitude of the FFT
mx=abs(y);
%get Phase Information
ma=angle(y);
%back the signal to complex
y2= mx .* ( cos(ma) + sqrt(-1) * sin(ma) );
%Apply Inverse FFT
x2=real(ifft(y2));
result=mat2gray(x2);
figure(2);imshow(result);

我知道这是一个老问题,但我有一个类似的问题,我想我会分享结果。

下面是一个典型的 fft 图像管道。需要注意的几点:

  • 在处理图像时,使用ifft2()而不是ifft()执行 2D 变换。
  • 频域图像通常被移动以将低频置于中心。用于ifftshift()扭转这一点。
  • 只需要逆变换的实部。虚部应该接近于零。
  • 频域图像的幅度通常以对数方式缩放以用于查看目的。如果您已经有了复杂的值,那么这可能不是问题。

DFT MATLAB 流水线:

%% Original Image
img = imread('lenna.png');
figure(1); imshow(img); % show image

%% Frequency Domain (FFT)
freqDomain = fft2(img);
% swap quadrants
shifted = fftshift(freqDomain);

%% Adjust scaling for viewing (not necessary)
% get magnitude
mag = abs(shifted);
% find the largest value
largest = max(mag(:));
% set the scale factor relative to the largest magnitude
c = (1.0 / log(1.0 + largest));
% scale magnitudes logarithmically
scaled = arrayfun(@(x) c * log(1.0 + x), mag);
% show scaled image
figure(2); imshow(scaled);

%% Spectral Domain (IFFT)
% swap quadrants back
shifted = ifftshift(shifted);
% get real part of ifft
specDouble = real(ifft2(shifted));
% convert result and show image
specDomain = uint8(specDouble);
figure(3); imshow(specDomain);

结果:

如果您缩放频率图像的大小并获得类似于左图像的东西,您可能需要使用ifftshift()它来使其看起来像右图像:

fft 移位示例

以下是使用传统 Lenna 图像的一些可能不正确的结果(和正确的结果)。频域如上所示。

  • 顶部:原始图像
  • 左中ifft2()ifftshift()先使用的结果
  • 右中:结果使用ifft()而不是ifft2()
  • 左下ifft()没有ifftshift()第一个使用的结果
  • 右下ifftshift():使用then的正确结果ifft2()

在此处输入图像描述