📜  MATLAB 中图像的正向和反向傅里叶变换

📅  最后修改于: 2022-05-13 01:55:04.206000             🧑  作者: Mango

MATLAB 中图像的正向和反向傅里叶变换

在本文中,我们将对图像应用傅里叶变换。傅里叶变换是一种数学技术,有助于将时域函数x(t) 转换为频域函数X(ω)。在本文中,我们将了解如何在 MATLAB 中找到傅立叶变换。

傅里叶变换的性质:

  • 线性度: 对应于两个频谱相加的两个函数相加称为线性度。如果我们将一个函数乘以一个常数,则结果函数的傅里叶变换将乘以相同的常数。两个或多个函数之和的傅里叶变换是函数的傅里叶变换之和。
  • 缩放:缩放是用于改变自变量或数据特征的范围的方法。如果我们在时域中按因子拉伸函数,则在频域中按相同因子压缩傅里叶变换。
  • 微分:关于时间的微分函数产生初始函数的常数倍数。
  • 卷积: 它包括两个函数的乘法。两个函数卷积的傅里叶变换是它们各自傅里叶变换的逐点乘积。
  • 频移和时移:频率根据坐标偏移。时域和频域之间存在对偶性,频移会影响时移。时间变量偏移也影响频率函数。时移特性得出结论时间上的线性位移对应于频域中的线性相位因子。

本文实验选用的图像是著名的摄影师图像。

图:输入图像

DFT 方程: X(k) = \sum_{n=0}^{N-1}\ x[n].e^{\frac{-j2\pi kn}{N}}

IDFT 方程: x(n) = \sum_{k=0}^{N-1}\ X[k].e^{\frac{j2\pi kn}{N}}

脚步:

  • 阅读图像。
  • 应用正向傅里叶变换。
  • 显示日志和移位 FT 图像。

使用的函数:

  • imread( ) 内置函数用于图像。
  • fft2( ) 内置函数用于对 2D 信号应用正向傅里叶变换。
  • ifft2( ) 内置函数用于对二维信号应用傅里叶逆变换。
  • fftshift( ) 内置函数用于在 FT 图像中将角移到中心。
  • log( ) 内置函数用于计算 FT 复信号的对数。
  • imtool( ) 内置函数用于显示图像。

例子:

Matlab
% MATLAB code for Forward and 
% Inverse Fourier Transform
  
% FORWARD FOURIER TRANSFORM
k=imread("cameraman.jpg");
  
% Apply fourier transformation.
f=fft2(k);
  
% Take magnitude of FT.
f1=abs(f);
  
% Take log of magnitude of FT.
f2=log(abs(f));
  
% Shift FT from corners to central part.
f3=log(abs(fftshift(f)));
  
% Display all three FT images.
imtool(f1,[]); 
imtool(f2,[]);
imtool(f3,[]);
  
% Remove some frequency from FT.
f(1:20, 20:40)=0;
imtool(log(abs(f)),[]);


Matlab
% MATLAB code for INVERSE FOURIER TRANSFORM
% apply inverse FT on FTransformed image.
% we get original image in this step.
j=ifft2(f);
  
% Take log of original image.
j1=log(abs(j));
  
% Shift corners to center.
j2=fftshift(j);
  
% Again shift to get original image.
j3=fftshift(j2);
  
% Remove some frequency from FT image.
f(1:20, 20:40)=0;
  
% Apply inverse FT.
j4=ifft2(f);
  
% Display all 4 images.
imtool(j,[]);
imtool(j1,[]); 
imtool(j2,[]);
imtool(j3,[]);%j and j3 are same.
imtool(abs(j4),[]);


输出:

图 1:傅立叶变换图像的绝对值

图 2:图像 FT 绝对值的对数

 图 3:FT 图像的中心光谱

图 4:FT 图像中的一些频率被阻塞

代码说明:

  • k=imread(“cameraman.jpg”);此行读取图像。
  • f=fft2(k);这条线计算傅立叶变换。
  • f1=abs(f);这需要 FT 的大小。
  • f2=log(绝对值(f));这条线取 FT 幅度的对数。
  • f3=log(abs(fftshift(f)));这条线将 FT 从角落转移到中心部分。
  • f(1:20, 20:40)=0;这条线从 FT 中删除频率。

例子:

MATLAB

% MATLAB code for INVERSE FOURIER TRANSFORM
% apply inverse FT on FTransformed image.
% we get original image in this step.
j=ifft2(f);
  
% Take log of original image.
j1=log(abs(j));
  
% Shift corners to center.
j2=fftshift(j);
  
% Again shift to get original image.
j3=fftshift(j2);
  
% Remove some frequency from FT image.
f(1:20, 20:40)=0;
  
% Apply inverse FT.
j4=ifft2(f);
  
% Display all 4 images.
imtool(j,[]);
imtool(j1,[]); 
imtool(j2,[]);
imtool(j3,[]);%j and j3 are same.
imtool(abs(j4),[]);

输出:

图 1:原始输入图像是通过对 FT 图像进行 Inverse FT 获得的

图 2:绝对逆傅里叶变换图像的对数

图 3:角落转移到中心

图 4:从 Freq Domain 中移除一些频率后的逆 FT

代码说明:

  • j=ifft2(f);此行计算 FT 图像的逆 FT。
  • f(1:20, 20:40)=0;这条线从 FT 图像中去除了一些频率。
  • j4=ifft2(f);这条线在去除一些频率后计算逆 FT。
  • imtool(abs(j4),[]);此行显示修改后的图像,其中包含一些振铃伪影。

特性:

  • 摄影师图像和傅里叶变换图像之间没有一一对应的关系。
  • 摄影师图像表示空间域中的强度。
  • 傅里叶变换图像表示频域中的频率。
  • 较低频率表示图像的平滑部分,而较高频率表示图像边缘等形状分量。
  • 如果从频域图像中去除低频部分,则空间域图像将变得模糊。
  • 如果频域图像中的任何频率值被移除(设为 0),则将从空间域图像中的每个强度值中移除(减去)该特定频率。