zoukankan      html  css  js  c++  java
  • 傅里叶变换在图像处理中的应用

    1. 背景

      法国数学家吉恩·巴普提斯特·约瑟夫·傅里叶被世人铭记的最大的贡献是:他指出任何周期函数都可以表示为不同频率的正弦和/或余弦之和的形式,每个正弦项和/或余弦项乘以不同的系数(现在称该和为傅里叶级数)。无论函数多么复杂,只要它是周期的,并且满足某些适度的数学条件,都可以用这样的和来表示。即一个复杂的函数可以表示为简单的正弦和余弦之和。甚至非周期函数(单该曲线下的面积是有限的)也可以用正弦和/或许·余弦乘以加权函数的积分来表示。在这种情况下的公式就是傅里叶变换

      傅里叶变换在物理学、数论、组合数学、信号处理、概率、统计、密码学、声学、光学等领域都有着广泛的应用。这里主要从多篇文章中总结一下傅里叶变换和在图像中的应用。在不同的研究领域,傅立叶变换具有多种不同的变体形式,如连续傅立叶变换和离散傅立叶变换。最初傅立叶分析是作为热过程的解析分析的工具被提出的。傅里叶变换是一种分析信号的方法,它可分析信号的成分,也可用这些成分合成信号。许多波形可作为信号的成分,比如正弦波、方波、锯齿波等,傅里叶变换用正弦波作为信号的成分。


      傅里叶变换的实质是将一个信号分离为无穷多多正弦/复指数信号的加成,也就是说,把信号变成正弦信号相加的形式——既然是无穷多个信号相加,那对于非周期信号来说,每个信号的加权应该都是零——但有密度上的差别,你可以对比概率论中的概率密度来思考一下——落到每一个点的概率都是无限小,但这些无限小是有差别的所以,傅里叶变换之后,横坐标即为分离出的正弦信号的频率,纵坐标对应的是加权密度。有点晕


      那么傅里叶变换有什么用呢?

      例如:傅里叶变换可以将一个时域信号转换成在不同频率下对应的振幅及相位,其频谱就是时域信号在频域下的表现,而反傅里叶变换可以将频谱再转换回时域的信号。最简单最直接的应用就是时频域转换,比如在移动通信的LTE系统中,要把接收的信号从时域变成频域,就需要使用FFT。又例如对一个采集到的声音做傅立叶变化就能分出好几个频率的信号。比如南非世界杯时,南非人吹的呜呜主拉的声音太吵了,那么对现场的音频做傅立叶变化(当然是对声音的数据做),会得到一个展开式,然后找出呜呜主拉的特征频率,去掉展开式中的那个频率的sin函数,再还原数据,就得到了没有呜呜主拉的嗡嗡声的现场声音。而对图片的数据做傅立叶,然后增大高频信号的系数就可以提高图像的对比度。同样,相机自动对焦就是通过找图像的高频分量最大的时候,就是对好了。

    2. 基本概念

    2.1 复数

      复数$C$的定义如下:

                         $ C = R + jI$

      其中,$R$ 和 $I$ 是实数,$j$ 是一个等于-1平方根的虚数,即 $j = \sqrt{-1}$。$R$ 表示复数的实部,$I$ 是复数的虚部。

      在极坐标下表示为:

          $ C = \left| C \right|(\cos\theta + j\sin\theta)$

      其中,$\left| C \right| = \sqrt{R^{2}+I^{2}}$是复平面的原点到点$(R, I)$的向量的长度,$\theta$是该向量与实轴的夹角。

      使用欧拉公式

          $e^{j\theta} = \cos\theta + j\sin\theta$

    其中 $e = 2.71828$···,可给出极坐标下我们很熟悉的如下复数表示:

          $C = \left| C \right|e^{j\theta}$

     2.2 傅里叶级数

      由上面的背景可知,具有周期 T 的连续变量 的周期函数 $f(t)$ 可以被描述为乘以适当系数的正弦和余弦和,这个和就是傅里叶级数。它具有如下形式:

          $f(t) = \sum\limits_{n=-\infty}^ {\infty} c_{n} e^{j\frac{2 \pi n}{T}t}$

    2.3 时域与频域

      (1)频域(frequency domain)是指在对函数或信号进行分析时,分析其和频率有关部份,而不是和时间有关的部分,和时域一词相对。

      (2)时域是描述数学函数或物理信号对时间的关系。

    例如一个信号的时域波形可以表达信号随着时间的变化。
    若考虑离散时间,时域中的函数或信号,在各个离散时间点的数值均为已知。
    若考虑连续时间,则函数或信号在任意时间的数值均为已知。在研究时域的信号时,常会用示波器将信号转换为其时域的波形。

    (3)两者相互间的变换

      时域(信号对时间的函数)和频域(信号对频率的函数)的变换在数学上是通过积分变换实现。对周期信号可以直接使用傅立叶变换,对非周期信号则要进行周期扩展,使用拉普拉斯变换。

    3. 一维傅里叶变换

      

      一个信号能表示成傅里叶级数的形式是有条件的,首先它必须是周期信号,第二必须是满足狄里赫利条件的周期信号。

    4. 快速傅里叶变换(FFT)

      计算离散傅里叶变换的一种快速算法,简称FFT。函数或信号可以透过一对数学的运算子在时域及频域之间转换。快速傅里叶变换是1965年由J.W.库利和T.W.图基提出的。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。

      人们想让计算机能处理信号,但由于信号都是连续的、无限的,计算机不能处理,于是就有了傅里叶级数、傅里叶变换,将信号由时域变到频域,把一个信号变为有很多个不同频率不同幅度的正弦信号组成,这样计算机就能处理了,但又由于傅里叶变换中要用到卷积计算,计算量很大,计算机也算不过来,于是就有了快速傅里叶变换,大大降低了运算量,使得让计算机处理信号成为可能。快速傅里叶变换是傅里叶变换的快速算法而已,主要是能减少运算量和存储开销,对于硬件实现特别有利。

    5. 图像中傅里叶变换的意义

     (1)图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。如:大面积的沙漠在图像中是一片灰度变化缓慢的区域,对应的频率值很低;而对于地表属性变换剧烈的边缘区域在图像中是一片灰度变化剧烈的区域,对应的频率值较高。傅立叶变换在实际中有非常明显的物理意义,设 $f$ 是一个能量有限的模拟信号,则其傅立叶变换就表示 $f$ 的谱。从纯粹的数学意义上看,傅立叶变换是将一个函数转换为一系列周期函数来处理的。从物理效果看,傅立叶变换是将图像从空间域转换到频率域,其逆变换是将图像从频率域转换到空间域。换句话说,傅立叶变换的物理意义是将图像的灰度分布函数变换为图像的频率分布函数,傅立叶逆变换是将图像的频率分布函数变换为灰度分布函数

     (2)傅立叶变换以前,图像(未压缩的位图)是由对在连续空间(现实空间)上的采样得到一系列点的集合,我们习惯用一个二维矩阵表示空间上各点,则图像可由 $z=f(x,y)$ 来表示。由于空间是三维的,图像是二维的,因此空间中物体在另一个维度上的关系就由梯度来表示,这样我们可以通过观察图像得知物体在三维空间中的对应关系。为什么要提梯度?因为实际上对图像进行二维傅立叶变换得到频谱图,就是图像梯度的分布图,当然频谱图上的各点与图像上各点并不存在一一对应的关系,即使在不移频的情况下也是没有。傅立叶频谱图上我们看到的明暗不一的亮点,实际上图像上某一点与邻域点差异的强弱,即梯度的大小,也即该点的频率的大小(可以这么理解,图像中的低频部分指低梯度的点,高频部分相反)。一般来讲,梯度大则该点的亮度强,否则该点亮度弱。这样通过观察傅立叶变换后的频谱图,也叫功率图,我们首先就可以看出,图像的能量分布,如果频谱图中暗的点数更多,那么实际图像是比较柔和的(因为各点与邻域差异都不大,梯度相对较小),反之,如果频谱图中亮的点数多,那么实际图像一定是尖锐的,边界分明且边界两边像素差异较大的。对频谱移频到原点以后,可以看出图像的频率分布是以原点为圆心,对称分布的。将频谱移频到圆心除了可以清晰地看出图像频率分布以外,还有一个好处,它可以分离出有周期性规律的干扰信号,比如正弦干扰,一副带有正弦干扰,移频到原点的频谱图上可以看出除了中心以外还存在以某一点为中心,对称分布的亮点集合,这个集合就是干扰噪音产生的,这时可以很直观的通过在该位置放置带阻滤波器消除干扰。


    6. matlab代码

    [i,lcmp]=imread('F:/123.jpg');%=======读取图像 显示图像
    
    subplot(2,2,1),imshow(i,lcmp);
    
    title('original');
    
    ii=im2double(i); %=====将图像矩阵类型转换为double(图像计算很多是不能用整型的),没有这个会报错!! ,如果不用这个就必须转化为灰度图!
    
    i1 = fft2(ii); %======傅里叶变换
    
    i2 =fftshift(i1); %======将变换的频率图像四角移动到中心(原来良的部分在四角 现在移动中心,便于后面的处理)
    
    i3=log(abs(i2)); %=====显示中心低频部分,加对数是为了更好的显示
    
    subplot(2,2,2),imshow(i3,[]);
    
    title('Fourier');
    
    map=colormap(lcmp); %===取色谱
    
    imwrite(i3,map,'f:/ffttank.bmp'); %===将上面i3输入到ffttank文件中
    
    i5 = real(ifft2(ifftshift(i2))); %===频域的图反变换到空域 并取实部
    
    i6 = im2uint8(mat2gray(i5)); %===取其灰度图
    
    imwrite(i6,map,'f:/tank2.bmp','bmp'); %===利用灰度图和原来取得颜色模板 还原图像
    
    subplot(2,2,3),imshow(i6);
    
    title('anti-Fourier');
    
    i7=rgb2gray(i);
    
    i8=fft2(i7);%===对灰色图才能归一化。因为那是2维矩阵,彩色图是3维矩阵,需要转化为2维灰图
    
    m=fftshift(i8); %直流分量移到频谱中心
    
    %RR=real(m); %取傅立叶变换的实部
    
    %II=imag(m); %取傅立叶变换的虚部
    
    A=abs(m);%计算频谱幅值
    
    %A=sqrt(RR.^2+II.^2);
    
    A=(A-min(min(A)))/(max(max(A))-min(min(A)))*225; %归一化
    
    subplot(2,2,4),imshow(A); %显示原图像
    
    colorbar; %显示图像的颜色条
    
    title('FFT spectrum'); %图像命名

      

    参考文章:

    (1)https://blog.csdn.net/ebowtang/article/details/39004979

    (2)孟凡文, 吴禄慎.基于FTP的二维傅里叶变换的研究.激光与红外.第38卷第9期 2008年9月

    (3)董健,邓国辉,李金武. 基于二维傅里叶变换实现图像变换的研究. 福建电脑. 2015年第 9期

      

  • 相关阅读:
    [转发]深入理解git,从研究git目录开始
    iOS系统网络抓包方法
    charles抓包工具
    iOS多线程中performSelector: 和dispatch_time的不同
    IOS Core Animation Advanced Techniques的学习笔记(五)
    IOS Core Animation Advanced Techniques的学习笔记(四)
    IOS Core Animation Advanced Techniques的学习笔记(三)
    IOS Core Animation Advanced Techniques的学习笔记(二)
    IOS Core Animation Advanced Techniques的学习笔记(一)
    VirtualBox复制CentOS后提示Device eth0 does not seem to be present的解决方法
  • 原文地址:https://www.cnblogs.com/Lynn0101/p/9892469.html
Copyright © 2011-2022 走看看