计算机视觉 图像的傅里叶变换

2024-05-17 12:25

1. 计算机视觉 图像的傅里叶变换

 傅里叶基础
    法国数学家吉恩·巴普提斯特·约瑟夫·傅里叶被世人铭记的最大的贡献是:他指出任何周期函数都可以表示为不同频率的正弦和/或余弦之和的形式,每个正弦项和/或余弦项乘以不同的系数(现在称该和为傅里叶级数)。无论函数多么复杂,只要它是周期的,并且满足某些适度的数学条件,都可以用这样的和来表示。即一个复杂的函数可以表示为简单的正弦和余弦之和。甚至非周期函数(单该曲线下的面积是有限的)也可以用正弦和/或许·余弦乘以加权函数的积分来表示。在这种情况下的公式就是傅里叶公式。 
    比如说我们以制作一个饮料的过程,使用时域的角度来看就是这样: 
       这里是什么意思呢,就是说一个饮料的制作需要在18点整放1个单位冰糖、3个单位红豆、2个单位的绿豆、4个单位的西红柿,还有1个单位的纯净水。然后再18:01分只需要假如一个单位的纯净水。后面也是一致。而频域是怎么描述这件事的呢? 
       具体来说就是说他发现了一个规律,就是说这个制作过程,每分钟都要加入冰糖,每两分钟都要加入红豆,每三分钟都要加入一次绿豆…。对于时域角度我们这样描述。 
       对于频域角度我们这样描述这件事,用直方图表示就是: 
       如果要考虑更精准的时间精度,我们就要引入相位这个概念。他是一个和时间差有关的一个表述。 
       这里我们说明一下就是时域和频域的表述是互逆的,对于时域我们是时间为横坐标,振幅为纵坐标。对于频域我们以频率为横坐标,振幅为纵坐标。但是可以看得出来频域的表述更加简单,但是比较抽象,不容易理解。傅里叶说:   任何连续周期信号,可以由一组适当的正弦曲线组合而成。   注意这里是一组而不是一个。比如对于这样的一个图像:   f(x)=3   np.sin(0.8   x)+7   np.sin(1/3   x)+2   np.sin(0.2   x)  
       看上去是毫无规律可言吧,但是它也可以由一组正弦函数组成。 
          他们是可逆的,想不到吧,乱七八糟的东西也有规律了。但是他们就是这样组合而成的吗?不可能吧,所以这里就是不是同时开始的一组余弦函数,在叠加时要体现开始的时间。也就说组合的函数他们的开始时间是不一样的。在这里分别对应0,2,3.看公式就看出来啦。这里多说一嘴就是说傅里叶变换从时域角度来看,这个世界是动态的!从频域角度来看这个世界是静止的。从数学角度来讲:傅里叶变换将一个任意的周期函数分解成为无穷个正弦函数的和的形式。从物理角度来讲:傅里叶变换实现了将信号从空间域到频率域的转换。 
   傅里叶基础numpy实现
    python是可以实现傅里叶变换的,这里就要说到三剑客的numpy了。对应的函数是:    numpy.fft.fft2   返回一个复数数组(complex ndarray)。   numpy.fft.fftshift   这个函数时表示把将零频率分量移到频谱中心。
       还要设置频谱的范围    20*np.log(np.abs(fshift))   ,对于图像来说就是255了。
    结果是: 
       原图和频谱图像。 
   逆傅里叶numpy实现
    对于傅里叶的逆操作这里没有什么可说的,就是把频域图像转回原图像。 
       函数是:    numpy.fft.ifft2   ,那么还有一个操作就是把中间移动回去对啊。   numpy.fft.ifftshift   。   iimg = np.abs(逆傅里叶变换结果)   而第二个图就表示低频部分,边缘就表示为高频部分。
    首先我们要进行傅里叶变换吧,才可以进行逆操作。结果是: 
       完全一致!!! 

计算机视觉 图像的傅里叶变换

2. 通俗解释图像的傅里叶变换

姓名:李沈轩    学号:20181214373    学院:广研院
  
 【原文链接】 通俗讲解:图像傅里叶变换 - 知乎 (zhihu.com) 
  
 【嵌牛导读】本文通俗的讲解了什么是图像的傅里叶变换
  
 【嵌牛鼻子】傅里叶变换
  
 【嵌牛提问】什么是图像的傅里叶变换?
  
 【嵌牛正文】
  
 首先来看一张很厉害的一维傅里叶变换动图。
                                          
 它把时域和频域解释的很清楚!
  
 简单点说就是:所有的波都可以用 很多个正弦波叠加表示 。
  
 然而这些波又可以通过 频率 、 幅值 和 相位 来表示。这样就可以从左边那张图中 时域的视角 转化为咱们高大上的 频域视角 啦。
                                          
 先来看一个例子~
                                          
 其实右边图的每一个点,可以理解为它在描述一种平面波。
  
 那…其实还是有两个点之间还是有半分钱关系的, 右边点所描述的波是构成左边点的无数个波面中的其中一个。 
  
  右边图中,每一个点 :
  
 1)它到 中点的距离 描述的是 频率 
  
 2) 中点到它的方向 ,是 平面波的方向 
  
 3)那一点的 灰度值 描述的是它的 幅值

3. 图像处理之_傅立叶变换

将一幅图像从其空间域(spatial domain)转换为频域(frequency domain)。图像处理用到的主要是离散傅立叶变换(Discrete Fourier Transform),下文中简称DFT。
                                          
 如上图所示,左边是原始图像(左白右黑),中间是DFT变换,右侧为变换后生成的频谱图(幅度相位共同决定了图中点亮度)。
   上图展示了红色点(x,y)的变换,在纵轴方向,它所在的列颜色值都为0(黑色),因此组成它的波形也能量也都为0,在横轴方向,如中间图所示,左则为255(白色),右则为0(黑色),将其拆分成正弦波的组合,再利用拆分后的各个波的幅度(亮度)相位(亮度)以及频率大小(位置)生成频谱图(上图中简化了相位)。
   原始图中的每个像素点,是由不同频率波投射在该点的能量叠加而成的,而频谱图中的每个点是原始图中每个像素点在该频率上的能量叠加而成的。它们之间都是一对多的关系,不存在一一对应。
                                          
 以上公式分别是一维和二维DFT的定义(摘自《学习OpenCV》),先看看一维DFT公式,其中x0…xN-1是N个复数,它是原始数据,如音频数据中的每一帧,图像的像素点的灰度等,f是映射到频域后的值,也是复数.下标n是x的变化范围,下标k是f的变化范围.二维空间公式同理.
   图像对应的二维空间举例:把一个256x256像素(Nx=256,Ny=256,共65536个点,每一点视为x,其值为亮度)的灰度图转换到频域,得到的也是一个256x256的矩阵,矩阵中的每个点都是复数(每一点视为f).
  
 每一个f点的值,都由所有的x点通过上述公式累加求得.
  
 拆分点x在各个频率上的相位和幅度分量.exp()和正弦/余弦波的关系,详见欧拉公式:
                                          
 描述频率三个重要属性是:频率高低、幅值、相位。
   输出的频域数据也由矩阵表示,其中每个点都是复数,实部和虚部分别对应幅值和相位,而该点在矩阵中的位置表示它的频率高低。
                                          
 在很多例程中,变换后,都得到一个从中间到四周的放射状图形,如上图所示。
   右侧图就是频率分布图谱,其中越靠近中心的位置频率越低,越亮的位置代表该频率的信号振幅越大。示意图大多是经过频谱中心化之后的图,如:OpenCV的例程OpenCV/samples/cpp/dft.cpp.在该程序中可以看到调整象限的操作。即左上右下互换,右上左下互换。数字图像的二维DFT所得结果,左上角是直流成分(图像的平均灰度级),四个角周围对应于低频成分,中央部分对应于高频部分。通过象限调整后,低频位置被换到了中间,这称为频谱中心化。对显示的频谱图而言,我们知道中间是低频,周围是高频即可。低频对应图像大致轮廓,高频对应图像细节。
   一维DFT的系数对称(2N点的数据做DFT,变换系数关于N点位置对称,类似图5)。这是因为DFT的的变换基是对0~2π分析的,因为0到π和π到2π对称所以对称。二维可理解为两个一维的组合(见图1,2,3),因此它是从中心向四周扩散的。
   图像中的像素点与频谱中的点虽然大小一样,但并没有一一对应的关系(见图4)
  
 图6中能量分布在中高频区,从原始上看,它的细节比较多,局部跳变明显(梯度大),可想见,组成它的波成也是在某一中高频波的能量更大,也就是说边缘越多,变化的剧烈程序,中高频波分量越多。
   滤波一般分为:低通(Low-pass)、高通(High-pass)、带通(Band-pass)。所谓高通就是保留图像中的高频成分,过滤低频成分,它类似于通过梯度求图像边缘。需要注意的是它过滤的是频率,而不是亮度。
   具体实现就是将图片转成频谱图,过滤某一部分后,再通过逆变换转成灰度图。
  
 图像的旋转平移等操作,只是位置变化,整体的亮度(能量)不变,但是在频谱图中却有差异。这是由于变换之后相位的差异,在频谱图上看到的点,实际是由幅度和相位共同算出的(见dft.cpp中的magnitude函数)
                                          
 利用DFT可以大大加快卷积运算的速度。卷积定理:空间域的卷积运算可以转换为频域的乘法运算。具体实现是将图片转换到频域,将卷积核也转换到频域,计算频域乘法,最后将乘积进行逆变换,转回空间域。
   一般只在卷积核比较大时,才使用该方法优化。
  
 把声音拆成正弦波比较好理解,声音是声波的叠加:不同高度,宽度,起始位置的波的叠加。比如弹奏“do”,发出的声音是琴弦振动的结果,弦的连续振动,必然是有规律的。人听到的是一系列基音和泛音组合的结果。声音是时域到频域的映射,维度是一,即y=f(x),其中x是帧发生的时间,y是该帧强度的大小。我们可以通过切分出一个小的时间片 (do所在的时间段),把它拆分到频谱,找个它的各个基音和泛音,进行对比,重组等等后续处理,人声也是一样,当发出“啊“声音的时候,也是一系列振动引起的。频率是声音的局部特征,即从整条音频中切出“do”或”啊”的时间片段,求取其频谱。
   把一张画拆分成频率,首先把一张彩图拆成不同通道的灰度图,考虑单张灰度图的频谱。图片是空间到频域的映射,维度是二,即z=f(x,y),其中x,y是像素点的坐标,z是灰度。我们认为像素点间的灰度变化(即梯度)是有规律的。比如画中,墙和窗相交边缘上的各个点,变化都差不多(变化快,梯度大,频率高),远处云与蓝天的边缘也有相似性(变化慢),在单色的区域,比如蓝天整体变化不大(无变化),多处具体共同的性质,也是视作一种重复,我们就把它提取为规律和特征。除了图像音频,还有很多地方都可以用到频域映射,只要是有规律的重复出现即可,进而通过频谱分析,什么东西重复出现最多?它背后原因是什么?
  
  http://blog.csdn.net/abcjennifer/article/details/7622228 
  
  http://www.jiqizhixin.com/article/2558 
  
  https://wenku.baidu.com/view/c5e2cca8fab069dc502201db.html 
  
  https://zhuanlan.zhihu.com/p/19763358?columnSlug=wille 
  
  http://www.matongxue.com/madocs/8.html

图像处理之_傅立叶变换

4. 傅里叶变换的图像应用--学好了用处大~

傅里叶变换,一个听起来高大上的名词。初学之时也是云里雾里,一旦学成,应用及其广泛,图像、信号、声波、深度学习等各领域都存在它的身影,包括在地学中,它也能有很大的用处~至于哪些方面?不展开啦
  
 。其中傅里叶变换的公式是:
                                          
 看不懂是吧,没关系,用一个动图来表示:
                                          
 简单的说,就是通过傅里叶变换可以叠加波形,至于怎么叠加,可以搜搜百度谷歌微软,有很多相关的教程可以让你们深(nao)入(po)浅(tou)出(pi)的学会它!!!
  
 算了,为了增加文字量~援引一段百度吧:傅立叶变换是一种线性的积分变换,常在将信号在时域(或空域)和频域之间变换时使用,在物理学和工程学中有许多应用。因其基本思想首先由法国学者约瑟夫·傅里叶系统地提出,所以以其名字来命名以示纪念。在不同的研究领域,傅立叶变换具有多种不同的变体形式,如连续傅立叶变换和离散傅立叶变换。最初傅立叶分析是作为热过程的解析分析的工具被提出的(emmmm越描越黑)。
  
 跳过理论吧,总之它很有用就是啦,包括更难理解的小波分析(挠头)
                                          
 我随意用电脑桌面截个图,用Numpy库中的fft函数计算~
                                          
 这是结果~
                                          
 不要觉得它奇怪~因为它大概率只是个中间产物!!!!
  
 好啦,加油吧

5. 图像处理中的数学-从傅里叶变换到滤波器

 一段音乐随着时间变化的震动.
                                           音乐更直观的理解是这样的:
                                           图1是音乐在时域的样子,而图2则是音乐在频域的样子。
                                                                                   频率为  ,若以横轴为频率,纵轴为幅值,则频率域图像为   
                                           
   正弦函数是单一频率,在频域中只需要一根竖线就能表现出来。我们期望的也是将时域的信号转换成一个个单一频率的正弦函数的组合,这样我们就能够在频域中用一根根竖线表示出来,也就完成了从时域到频域的转换。
   如果任意波形都可以转化成常数、若干个正余弦函数的线性组合,我们就可以完成时域到频域的转换。用数学公式表达如下面所示:
                                           于是问题就转化成,对于任意波形,我们能不能找到一组系数   和   ,使上述等式成立?   法国数学家傅里叶在1807年发表的论文中提出了一个当时非常具有争议性的论断: 任何连续周期信号都可以由一组适当的正弦曲线组合而成。 
                                           随着频率越来越丰富,合成的波形也越来越接近方波了,当n趋近于无穷大,也就是频谱范围无限大的时候,就可以无限逼近方波了
   从频域的角度看
                                                                                                                           做图像处理的人来说,每一副数字图像就是一组信号,也就是说做图像处理相当于就是做的信号处理。对于信号有他的频域特征以及时域特征,连接时域与频域的通道便是傅里叶变换了。
   图像频率特性分析   频谱图上的每一个像素点都代表一个频率值,幅值由像素点亮度变码而得。对于一幅图像,图像信号的 频率特性 如下:
                                                                                                                                                                   说明:这里的低通滤波,意思就是把频率低的波留下,把频率高的波过滤掉。示意图是经过居中处理的频谱,就是从频谱的中心到四周频率由低到高。示意图表示的是,留下中间低频的,过滤点中心周围高频的部分。我们知道,低频对应的图像中变化不明显的部分,于是,图像就变的非常模糊。这在图像处理中也叫平滑滤波。
                                                                                                                                                                   图像的锐化所达到的效果,与平滑化相对,很明显,图像边缘增强了。

图像处理中的数学-从傅里叶变换到滤波器

6. 图片处理-opencv-12.图像傅里叶变换

 傅里叶变换(Fourier Transform,简称FT)常用于数字信号处理,它的目的是将时间域上的信号转变为频率域上的信号。随着域的不同,对同一个事物的了解角度也随之改变,因此在时域中某些不好处理的地方,在频域就可以较为简单的处理。同时,可以从频域里发现一些原先不易察觉的特征。傅里叶定理指出“任何连续周期信号都可以表示成(或者无限逼近)一系列正弦信号的叠加。”
   傅里叶变换可以应用于图像处理中,经过对图像进行变换得到其频谱图。从谱频图里频率高低来表征图像中灰度变化剧烈程度。图像中的边缘信号和噪声信号往往是高频信号,而图像变化频繁的图像轮廓及背景等信号往往是低频信号。这时可以有针对性的对图像进行相关操作,例如图像除噪、图像增强和锐化等。
   Numpy中的fft模块,相关函数如下:
   Numpy中的 FFT包提供了函数 np.fft.fft2()可以对信号进行快速傅里叶变换,其函数原型如下所示,该输出结果是一个复数数组(Complex Ndarry)。
     fft2(a, s=None, axes=(-2, -1), norm=None)  
   频率分布图谱,其中越靠近中心位置频率越低,越亮(灰度值越高)的位置代表该频率的信号振幅越大
                                           傅里叶逆变换,是傅里叶变换的逆操作,将频谱图像转换为原始图像的过程。通过傅里叶变换将转换为频谱图,并对高频(边界)和低频(细节)部分进行处理,接着需要通过傅里叶逆变换恢复为原始效果图。频域上对图像的处理会反映在逆变换图像上,从而更好地进行图像处理。
   图像逆傅里叶变换主要使用的函数如下所示:
                                           OpenCV 中相应的函数是cv2.dft()和用Numpy输出的结果一样,但是是双通道的。第一个通道是结果的实数部分,第二个通道是结果的虚数部分,并且输入图像要首先转换成 np.float32 格式。其函数原型如下所示:
     dst = cv2.dft(src, dst=None, flags=None, nonzeroRows=None)  
   由于输出的频谱结果是一个复数,需要调用cv2.magnitude()函数将傅里叶变换的双通道结果转换为0到255的范围。其函数原型如下:
     cv2.magnitude(x, y)  
                                           OpenCV 中,通过函数cv2.idft()实现傅里叶逆变换,其返回结果取决于原始图像的类型和大小,原始图像可以为实数或复数。其函数原型如下所示:
     dst = cv2.idft(src[, dst[, flags[, nonzeroRows]]])  
                                           傅里叶变换的目的并不是为了观察图像的频率分布(至少不是最终目的),更多情况下是为了对频率进行过滤,通过修改频率以达到图像增强、图像去噪、边缘检测、特征提取、压缩加密等目的。
   过滤的方法一般有三种:低通(Low-pass)、高通(High-pass)、带通(Band-pass)。
   高通滤波器是指通过高频的滤波器,衰减低频而通过高频,常用于增强尖锐的细节,但会导致图像的对比度会降低。该滤波器将检测图像的某个区域,根据像素与周围像素的差值来提升像素的亮度。
                                           低通滤波器是指通过低频的滤波器,衰减高频而通过低频,常用于模糊图像。低通滤波器与高通滤波器相反,当一个像素与周围像素的插值小于一个特定值时,平滑该像素的亮度,常用于去燥和模糊化处理。
最新文章
热门文章
推荐阅读