好的,所以我们有一个图像是原始图像的傅立叶逆。我们想要恢复原始图片。我们使用 Matlab 来完成这项工作。我们导入图像,然后在 ifft() 的帮助下反转它,这给了我们一个复数矩阵。但是要得到原始图片,我们需要对复数做一些操作才能得到它。但那是什么操作。我尝试了幅度、实部和虚部,但这并不能创造出我们想要的画面。
离散傅里叶逆变换复数的哪一部分?
信息处理
傅里叶变换
2022-01-27 08:37:14
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()它来使其看起来像右图像:
以下是使用传统 Lenna 图像的一些可能不正确的结果(和正确的结果)。频域如上所示。
- 顶部:原始图像
- 左中:
ifft2()不ifftshift()先使用的结果 - 右中:结果使用
ifft()而不是ifft2() - 左下:
ifft()没有ifftshift()第一个使用的结果 - 右下
ifftshift():使用then的正确结果ifft2()
其它你可能感兴趣的问题

