下图是低通滤波器的频率响应曲线。

一维信号时域频域分析 python_一维信号时域频域分析 python

低通滤波器频响曲线

横轴是频率(Hz),纵轴是声音大小(dB)。(请忽略图中的频率刻度,没有对应人声的频率范围)

所谓的低音效果,其实就是对人声中的低音部分保留或增强,对应上图中左侧的横线部分;而对于人声中的高音部分进行衰减,对应上图中右侧的斜坡部分。通过这个低通滤波器,我们就能将低音过滤,将高音衰减。为了实现更好的视听效果,实际中,功放或播放器的实现会比这个复杂得多,上图中进行了极简化。

可见,低音效果是在频率范围内考虑问题,而波形图是在时域内的图像,所以如果想在时域内解决低音效果的问题,就如同鸡同鸭讲。所以我们要就要找到一个沟通时域和频域的桥梁,也就是一个翻译,让时域和频域能够无障碍的沟通。但是,时域和频域表达的又只能是同一种信息,只是表现形式不同。

时域转频域

极坐标与直角坐标系类比

前面类比了RGB空间,解释了为什么要进行时域到频域的转换。可能还不够形象,这里再用直角坐标系和极坐标系做一个类比。

我们来看一下阿基米德螺线(如下图),当一点P沿动射线OP以等速率向外运动的同时,这射线又以等角速度绕点O旋转,点P的轨迹称为“阿基米德螺线”。它的极坐标方程为:

一维信号时域频域分析 python_人工智能_02

  。这种螺线的每条臂的间距永远相等于 2

一维信号时域频域分析 python_人工智能_03

b 。

一维信号时域频域分析 python_一维信号时域频域分析 python_04

这种曲线在极坐标系中很容易的表示出来,而且形式非常简单优雅。但是在直角坐标系下要以X-Y的形式表示出来确是非常困难的,只能用参数化方程来表示。也就是说,有些问题,当我们换一个空间或者说域去考虑的时候,可能会豁然开朗。

傅里叶级数

为了形象的理解为什么要进行时域到频域的转换,前面已经举了很多的例子,下面正式开始进入时域和频域的变换。我们先来看一下标准正弦函数,如下图。

一维信号时域频域分析 python_时域_05

 

一维信号时域频域分析 python_一维信号时域频域分析 python_06

magnitude   英/ˈmæɡnɪtjuːd/   n.巨大,重要性;震级;规模,大小;数量,数值;(恒星的)亮度,星等

 

一维信号时域频域分析 python_人工智能_07

一维信号时域频域分析 python_图像处理_08

一维信号时域频域分析 python_时域_09

一维信号时域频域分析 python_频域_10

 

画出它的模的图像

一维信号时域频域分析 python_时域_11

一维信号时域频域分析 python_频域_12

一维信号时域频域分析 python_一维信号时域频域分析 python_13

一维信号时域频域分析 python_一维信号时域频域分析 python_14

一维信号时域频域分析 python_一维信号时域频域分析 python_15

一维信号时域频域分析 python_人工智能_16

一维信号时域频域分析 python_频域_17

一维信号时域频域分析 python_时域_18

一维信号时域频域分析 python_一维信号时域频域分析 python_19

一维信号时域频域分析 python_一维信号时域频域分析 python_20

一维信号时域频域分析 python_时域_21

一维信号时域频域分析 python_时域_22

 模的图像 

一维信号时域频域分析 python_一维信号时域频域分析 python_23

一维信号时域频域分析 python_人工智能_24

一维信号时域频域分析 python_一维信号时域频域分析 python_25

一维信号时域频域分析 python_图像处理_26

一维信号时域频域分析 python_频域_27

一维信号时域频域分析 python_人工智能_28

一维信号时域频域分析 python_时域_29

一维信号时域频域分析 python_频域_30

一维信号时域频域分析 python_一维信号时域频域分析 python_31

一维信号时域频域分析 python_时域_32

一维信号时域频域分析 python_时域_33

一维信号时域频域分析 python_时域_34

一维信号时域频域分析 python_一维信号时域频域分析 python_35



 

一维信号时域频域分析 python_一维信号时域频域分析 python_36

傅里叶分析

傅里叶分析不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维模式。 

一维信号时域频域分析 python_一维信号时域频域分析 python_37

一维信号时域频域分析 python_时域_38

一、什么是频域 时域

时域是信号在时间轴随时间变化的总体概括;频域是把时域波形的表达式做傅立叶等变化得到复频域的表达式,所画出的波形就是频谱图,是描述频率变化和幅度变化的关系。

示波器用来看时域内容,频普仪用来看频域内容。
时域:
时间域,time domain。自变量是时间,即横轴是时间,纵轴是信号的变化。其动态信号x() 是描述信号在不同时刻取值的函数。
频域:
频率域,frequency domain。自变量是频率,即横轴是频率,纵轴是该频率信号的幅度,也就是通常说的频谱图。频谱图描述了信号的频率结构及频率与该频率信号幅度的关系。

时域分析与频域分析:

对信号进行时域分析时,有时一些信号的时域参数相同,但并不能说明信号就完全相同。因为信号不仅随时间变化,还与频率、相位等信息有关,这就需要进一步分析信号的频率结构,并在频率域中对信号进行描述。动态信号从时间域变换到频率域,主要通过傅立叶级数和傅立叶变换等来实现。很简单,时域分析的函数是参数是t,也就是y=f(t );频域分析时,参数是w,也就是y=F(w ) 两者之间可以互相转化。时域函数通过傅立叶或者拉普拉斯变换就变成了频域函数

一维信号时域频域分析 python_一维信号时域频域分析 python_39

一维信号时域频域分析 python_一维信号时域频域分析 python_40

一维信号时域频域分析 python_人工智能_41

一维信号时域频域分析 python_图像处理_42

一维信号时域频域分析 python_频域_43

一维信号时域频域分析 python_频域_44

一维信号时域频域分析 python_一维信号时域频域分析 python_45

傅里叶告诉我们,任何周期函数,都可以看作是不同振幅,不同相位正弦波的叠加。 

二、傅里叶级数(Fourier Series)的频谱

一维信号时域频域分析 python_一维信号时域频域分析 python_46

 正弦波就是一个圆周运动在一条直线上的投影。所以频域的基本单元也可以理解为一个始终在旋转的圆。

一维信号时域频域分析 python_人工智能_47

Fourier series square wave circles animation  傅里叶级数方波圆动画

一维信号时域频域分析 python_频域_48

Fourier series sawtooth wave circles animatio 傅立叶级数锯齿波圆动画

一维信号时域频域分析 python_人工智能_49

介绍完了频域的基本组成单元,我们就可以看一看一个矩形波,在频域里的另一个模样了:

一维信号时域频域分析 python_人工智能_50

一维信号时域频域分析 python_图像处理_51

这是什么奇怪的东西?

这就是矩形波在频域的样子,是不是完全认不出来了?教科书一般就给到这里然后留给了读者无穷的遐想,以及无穷的吐槽,其实教科书只要补一张图就足够了:频域图像,也就是俗称的频谱,就是——

一维信号时域频域分析 python_频域_52


再清楚一点:

一维信号时域频域分析 python_时域_53


可以发现,在频谱中,偶数项的振幅都是0,也就对应了图中的彩色直线。振幅为 0 的正弦波。

从时域来看,会看到一个近似为矩形的波,这个矩形的波可以被拆分为一些正弦波的叠加。

从频域方向来看,就看到了每一个正弦波的幅值,可以发现,在频谱中,偶数项的振幅都是0。也就对应了图中的彩色直线,振幅为0的正弦波。下图展示了频域图像:

一维信号时域频域分析 python_人工智能_54

Fourier series and transform 傅里叶级数及其变换

想象一下,世界上每一个看似混乱的表象,实际都是一条时间轴上不规则的曲线,但实际这些曲线都是由这些无穷无尽的正弦波组成。我们看似不规律的事情反而是规律的正弦波在时域上的投影,而正弦波又是一个旋转的圆在直线上的投影。那么你的脑海中会产生一个什么画面呢?

短时傅立叶变换的频谱图(伪彩图)

对信号做傅里叶变换,横轴为时间,纵轴为频率,用颜色表示幅度即得到信号的时频分布。也可以理解为颜色代表能量的分布。

一维信号时域频域分析 python_图像处理_55

为更直观的对比各个角度的观察结果,通过一段chirp信号来对比

t=0:0.001:1;
f0=10;
t1=1;
f1=100;
y=chirp(t,f0,t1,f1,'q');
subplot(3,1,1);plot(t,y);
subplot(3,1,2);plot(abs(fft(y)));
subplot(3,1,3);specgram(y,128,1e3,128,120);

  chirp函数的功能是提供扫频的正余弦波形。

y = chirp(t,f0,t1,f1)在阵列t中定义的时刻产生线性扫频余弦信号的样本,时刻0的瞬时频率为f0,时刻t1的瞬时频率为f1。
y = chirp(t,f0,t1,f1,method)指定替代扫描方法选项。
y = chirp(t,f0,t1,f1,method,phi)指定初始相位。
y = chirp(t,f0,t1,f1,'quadratic',phi,shape)指定二次扫频信号的频谱图的形状。
y = chirp(___,cplx)如果将cplx指定为“实数”则返回实数chirp,如果将cplx指定为“复数”则返回复数chirp。
subplot函数用于在同一图形窗口中创建多个子图。其基本语法是subplot(m,n,p),其中mn分别表示子图的行数和列数,p表示当前子图的位置。例如,subplot(2,2,1)将在当前图形窗口中创建一个2行2列的子图网格,并将第一个子图设置为当前子图。

plot是matlab中的二维线画图函数,基本调用格式为plot(y),plot(x,y),plot(x1,y1,x2,y2,……)。
spectrogram是一个MATLAB函数,使用短时傅里叶变换得到信号的频谱图。当使用时无输出参数,会自动绘制频谱图;有输出参数,则会返回输入信号的短时傅里叶变换

一维信号时域频域分析 python_频域_56

还可以通过三维的角度观察时频图

一维信号时域频域分析 python_人工智能_57

 

三、傅里叶级数(Fourier Series)的相位谱

频谱只代表了一个正弦函数的幅值,还需要相位,不同相位决定了波的位置,所以对于频域分析,仅仅有频谱(振幅谱)是不够的,我们还需要一个相位谱。

一维信号时域频域分析 python_频域_58

一维信号时域频域分析 python_频域_59

所以很多在时域看似不可能做到的数学操作,在频域相反很容易。这就是需要傅里叶变换的地方。尤其是从某条曲线中去除一些特定的频率成分,这在工程上称为滤波,是信号处理最重要的概念之一,只有在频域才能轻松的做到。

再说一个更重要,但是稍微复杂一点的用途——求解微分方程。(这段有点难度,看不懂的可以直接跳过这段)微分方程的重要性不用我过多介绍了。各行各业都用的到。但是求解微分方程却是一件相当麻烦的事情。因为除了要计算加减乘除,还要计算微分积分。而傅里叶变换则可以让微分和积分在频域中变为乘法和除法,大学数学瞬间变小学算术有没有。

 继续说相位谱:

通过时域到频域的变换,我们得到了一个从侧面看的频谱,但是这个频谱并没有包含时域中全部的信息。因为频谱只代表每一个对应的正弦波的振幅是多少,而没有提到相位。基础的正弦波A.sin(wt+θ)中,振幅,频率,相位缺一不可,不同相位决定了波的位置,所以对于频域分析,仅仅有频谱(振幅谱)是不够的,我们还需要一个相位谱。那么这个相位谱在哪呢?我们看下图,这次为了避免图片太混论,我们用7个波叠加的图。

一维信号时域频域分析 python_人工智能_60


鉴于正弦波是周期的,我们需要设定一个用来标记正弦波位置的东西。在图中就是那些小红点。小红点是距离频率轴最近的波峰,而这个波峰所处的位置离频率轴有多远呢?为了看的更清楚,我们将红色的点投影到下平面,投影点我们用粉色点来表示。当然,这些粉色的点只标注了波峰距离频率轴的距离,并不是相位。

一维信号时域频域分析 python_人工智能_61


这里需要纠正一个概念:时间差并不是相位差。如果将全部周期看作2Pi或者360度的话,相位差则是时间差在一个周期中所占的比例。我们将时间差除周期再乘2Pi,就得到了相位差。

在完整的立体图中,我们将投影得到的时间差依次除以所在频率的周期,就得到了最下面的相位谱。所以,频谱是从侧面看,相位谱是从下面看。

注意到,相位谱中的相位除了0,就是Pi。因为cos(t+Pi)=-cos(t),所以实际上相位为Pi的波只是上下翻转了而已。对于周期方波的傅里叶级数,这样的相位谱已经是很简单的了。另外值得注意的是,由于cos(t+2Pi)=cos(t),所以相位差是周期的,pi和3pi,5pi,7pi都是相同的相位。人为定义相位谱的值域为(-pi,pi],所以图中的相位差均为Pi。

最后来一张大集合:

一维信号时域频域分析 python_人工智能_62

四、傅里叶变换(Fourier Tranformation)

傅里叶级数的本质是将一个周期的信号分解成无限多分开的(离散的)正弦波,但是宇宙似乎并不是周期的。

傅里叶变换,则是将一个时域非周期的连续信号,转换为一个在频域非周期的连续信号。

算了,还是上一张图方便大家理解吧:

一维信号时域频域分析 python_频域_63



或者我们也可以换一个角度理解:傅里叶变换实际上是对一个周期无限大的函数进行傅里叶变换。

所以说,钢琴谱其实并非一个连续的频谱,而是很多在时间上离散的频率,但是这样的一个贴切的比喻真的是很难找出第二个来了。

因此在傅里叶变换在频域上就从离散谱变成了连续谱。那么连续谱是什么样子呢?

从频率较高的方向看。

一维信号时域频域分析 python_一维信号时域频域分析 python_64


以上是离散谱,那么连续谱是什么样子呢?尽情的发挥你的想象,想象这些离散的正弦波离得越来越近,逐渐变得连续……直到变得像波涛起伏的大海:

一维信号时域频域分析 python_人工智能_65


很抱歉,为了能让这些波浪更清晰的看到,我没有选用正确的计算参数,而是选择了一些让图片更美观的参数,不然这图看起来就像屎一样了。

不过通过这样两幅图去比较,大家应该可以理解如何从离散谱变成了连续谱的了吧?原来离散谱的叠加,变成了连续谱的累积。所以在计算上也从求和符号变成了积分符号。

 五、 欧拉公式

虚数i这个概念大家在高中就接触过,但那时我们只知道它是-1 的平方根,可是它真正的意义是什么呢?

一维信号时域频域分析 python_人工智能_66


这里有一条数轴,在数轴上有一个红色的线段,它的长度是1。当它乘以 3 的时候,它的长度发生了变化,变成了蓝色的线段,而当它乘以-1 的时候,就变成了绿色的线段,或者说线段在数轴上围绕原点旋转了 180 度。我们知道乘-1 其实就是乘了两次 i 使线段旋转了 180 度,那么乘一次 i 呢——答案很简单——旋转了 90 度。

一维信号时域频域分析 python_图像处理_67


同时,我们获得了一个垂直的虚数轴。实数轴与虚数轴共同构成了一个复数的平面,也称复平面。这样我们就了解到,乘虚数i的一个功能——旋转。现在,就有请宇宙第一耍帅公式欧拉公式隆重登场——

一维信号时域频域分析 python_人工智能_68


这个公式在数学领域的意义要远大于傅里叶分析,但是乘它为宇宙第一公式是因为它的特殊形式——当x等于 Pi 的时候。

一维信号时域频域分析 python_人工智能_69


 这个公式关键的作用,是将正弦波统一成了简单的指数形式。我们来看看图像上的涵义:

一维信号时域频域分析 python_一维信号时域频域分析 python_70


欧拉公式所描绘的,是一个随着时间变化,在复平面上做圆周运动的点,随着时间的改变,在时间轴上就成了一条螺旋线。如果只看它的实数部分,也就是螺旋线在左侧的投影,就是一个最基础的余弦函数。而右侧的投影则是一个正弦函数。

一维信号时域频域分析 python_人工智能_71

一维信号时域频域分析 python_图像处理_72

关于复数更深的理解,大家可以参考:
复数的物理意义是什么?

六、指数形式的傅里叶变换

有了欧拉公式的帮助,我们便知道:正弦波的叠加,也可以理解为螺旋线的叠加在实数空间的投影。而螺旋线的叠加如果用一个形象的栗子来理解是什么呢?

光波

高中时我们就学过,自然光是由不同颜色的光叠加而成的,而最著名的实验就是牛顿师傅的三棱镜实验:

一维信号时域频域分析 python_一维信号时域频域分析 python_73


所以其实我们在很早就接触到了光的频谱,只是并没有了解频谱更重要的意义。

但不同的是,傅里叶变换出来的频谱不仅仅是可见光这样频率范围有限的叠加,而是频率从 0 到无穷所有频率的组合。

这里,我们可以用两种方法来理解正弦波:

第一种前面已经讲过了,就是螺旋线在实轴的投影。

另一种需要借助欧拉公式的另一种形式去理解:

一维信号时域频域分析 python_时域_74


一维信号时域频域分析 python_人工智能_75


将以上两式相加再除2,得到:

一维信号时域频域分析 python_人工智能_76


这个式子可以怎么理解呢?

我们刚才讲过,e^(it)可以理解为一条逆时针旋转的螺旋线,那么e^(-it)则可以理解为一条顺时针旋转的螺旋线。而 cos (t)则是这两条旋转方向不同的螺旋线叠加的一半,因为这两条螺旋线的虚数部分相互抵消掉了!

举个例子的话,就是极化方向不同的两束光波,磁场抵消,电场加倍。这里,逆时针旋转的我们称为正频率,而顺时针旋转的我们称为负频率(注意不是复频率)。

好了,刚才我们已经看到了大海——连续的傅里叶变换频谱,现在想一想,连续的螺旋线会是什么样子:

一维信号时域频域分析 python_一维信号时域频域分析 python_77

是不是很漂亮?

你猜猜,这个图形在时域是什么样子?

一维信号时域频域分析 python_一维信号时域频域分析 python_78


哈哈,是不是觉得被狠狠扇了一个耳光。数学就是这么一个把简单的问题搞得很复杂的东西。

顺便说一句,那个像大海螺一样的图,为了方便观看,我仅仅展示了其中正频率的部分,负频率的部分没有显示出来。

如果你认真去看,海螺图上的每一条螺旋线都是可以清楚的看到的,每一条螺旋线都有着不同的振幅(旋转半径),频率(旋转周期)以及相位。而将所有螺旋线连成平面,就是这幅海螺图了。

好了,讲到这里,相信大家对傅里叶变换以及傅里叶级数都有了一个形象的理解了,我们最后用一张图来总结一下:

一维信号时域频域分析 python_一维信号时域频域分析 python_79

展示了将海螺图投影到实数空间就形成了傅立叶变换的连续非周期的连续的曲线,此曲线在时域上就表现为一个矩形波的形式。

到这里可以直观的理解傅立叶级数和傅立叶变换,傅立叶级数是说周期性变换的函数可以用有限个正弦波叠加而来,傅立叶变换说非周期变换的函数也可以用连续的正弦波来模拟,也了解了在复平面、频域和时域上傅立叶变换的效果。

halcon快速傅里叶变换

一维信号时域频域分析 python_一维信号时域频域分析 python_80

说明

  • 高频:噪声、细节和边缘,图像高频分量指图像突变部分,在某些情况下指图像边缘信息,某些情况下指噪声,更多是两者的混合
  • 低频:图像整体轮廓,图像低频分量指图像(亮度/灰度)变化平缓的部分,代表着那是连续渐变的一块区域,这部分就是低频。对于一幅图像来说,除去高频的就是低频了,也就是边缘以内的内容为低频,而边缘内的内容就是图像的大部分信息,即图像的大致概貌和轮廓,是图像的近似信息。

高通滤波器 —— 让图像高频分量通过,抑制低频分量。
低通滤波器 —— 与高通相反,让图像低频分量通过,抑制高频分量。
带通滤波器 —— 使图像在某一部分的频率信息通过,其他过低或过高都抑制。
带阻滤波器—— 是带通的反。

加强理解:图像噪声一般是白点或者黑点,因为它与正常的点颜色不一样了,也就是说该像素点灰度值明显不一样了,也就是灰度有快速地变化了,所以是高频部分;图像细节处也是属于灰度值急剧变化的区域,正是因为灰度值的急剧变化,才会出现细节,也属于高频部分;所以一般会对信号先进行低通滤波处理,即过滤掉图像中的高频部分(噪声/细节/边缘),留下低频(图像轮廓),结果就是图像模糊了。

图像处理中,有书上说低频反应轮廓,高频反应细节;有的文章里面说低频反应的是背景,高频反应的是边缘;低频反应轮廓,这里的轮廓指的不是边缘(很多人会搞混觉得轮廓是指的就是边缘),打个比方,近视眼的人摘了眼镜,人们通常会说:“我什么也看不清,仅仅能看到一个大致轮廓。”就是类似的意思。所以图像的边缘提取仍是提起的边缘的高频信息,这两种说法并不矛盾。(参考链接:)

一维信号时域频域分析 python_图像处理_81

傅里叶变换公式如下:

一维信号时域频域分析 python_一维信号时域频域分析 python_82

滤波后的效果

  • 低通滤波,保留低频分量,实际相当于模糊图像,傅里叶转到时域上后,都是正值
  • 高通滤波,保留高频分量,傅里叶转到时域上后,在边缘部分或缺陷部分会出现正负变换的现象,此时可通过gray_range_rect算子来突出缺陷部分,再进行后续处理!

关键算子 rft fft

快速傅里叶变换 (fast Fourier transform)

RftGeneric — Compute the real-valued fast Fourier transform of an image.计算图像的实值快速傅里叶变换

optimize_rft_speed( : : Width, Height, Mode : )

优化当前选择的FFT算法,halcon中有好多FFT算法,在不同的数据规模硬件下有多种不同的选择,调用该方法可自动评估出最合适的算法,显著提升FFT的速度。

rft_generic和fft_generic

rft_generic(Image : ImageFFT : Direction, Norm, ResultType, Width)
fft_generic(Image : ImageFFT : Direction, Exponent, Norm, Mode, ResultType)
这两个算子的不同点:

1.简单理解,rft_generic算子只计算和存储了复数图像的左半部分(右边是共轭的),而fft_generic算子计算和存储的是复数图像,前者大大提升了运算速率;
2.fft_generic算子可以通过参数Mode设置原点的位置:如果设置的是’dc_edge’,那么原点在左上角(即左上角是低频成分);如果设置的是’dc_center’,那么就会将原点平移到中心位置(中心是低频成分,四角是高频)。fft_generic算子一般会设置为’dc_center’。对于rft_generic算子,因为没有设置项,所以默认原点位置为左上角。

相同点:

1.Direction,分别是’to_freq’ 和’from_freq’
2.Norm,‘none’, ‘sqrt’ and ‘n’,这里其实决定了傅里叶变换公式中前面的系数c,默认值:‘sqrt’(开根号,c=sqrt(MN),转到频域数值最小);也可设置为 ‘n’(图像宽图像高,c=M*N,频域数值中间),‘none’(不使用,c=1,此时频域数值最大)。当正向变换时,一般选择’sqrt’,反向变换时,一般选择’n’(halcon例程)
3.Exponent:对应公式中指数符号,前向变换用-1,一般搭配’to_freq’ 使用,后向变换用1,搭配’from_freq’。
4.ResultType,如果是’to_freq’,那么ResultType一般选择’complex’;如果是’from_freq’,ResultType一般选择’real’(小数图像,需自己按比例转换为灰度)。如果为’byte’,则有可能不准确,全白或全黑。

一维信号时域频域分析 python_频域_83

gen_gauss_filter( : ImageGauss : Sigma1, Sigma2, Phi, Norm, Mode, Width, Height : )

在频率域创建一个高斯滤波器。
Sigma1:主方向的sigma值,越小越平缓,范围越大
Sigma2:垂直主方向的sigma值,这里两个参数相当于高斯滤波中的x方向和y方向分别计算,原理如该公式

一维信号时域频域分析 python_人工智能_84


传统卷积框如下(核大小为3),计算时复杂度为rows

cols

ksize*ksize。


一维信号时域频域分析 python_图像处理_85


而分开计算核如下只有一维:


一维信号时域频域分析 python_时域_86

这样先行计算,再列计算,效果是一样的(因为都要归一化,所有前面是有系数的,未分离的系数是1/16,分离的系数是1/4,此时对一个全1的区域进行卷积,两个结果都是1.)。这两个sigma可以是不同的,也就是说x方向和y方向可以不同的卷积计算。sigma越大,高斯图像越平缓,越矮,滤波效果越差。
Phi:在空间域中主轴的方向
Norm:是否归一化。“n”是不进行归一化,和后面的rft_generic参数Norm类似
Mode:“dc_center”, “dc_edge”, “rft”,dc_center是0频在中间(即低频在中间),dc_edge低频在四角,rft是半张图片,低频在左上和左下。
例如:

gen_gauss_filter (ImageGauss2, 2, 2, 0, 'none', 'rft', Width, Height)
* 注意左上角为1,周边逐渐递减

一维信号时域频域分析 python_频域_87

gen_gauss_filter (ImageGauss1, 10, 10, 0, 'none', 'rft', Width, Height)

一维信号时域频域分析 python_时域_88

convol_fft(ImageFFT, ImageFilter : ImageConvol : : )

进行卷积,实际是复数图像ImageFFT的像素乘以滤波器ImageFilter的相应像素,因此滤波器中黑色的部分对应到频率图中相应位置的数据被清除。

数字图像的傅里叶变换

       通过前面的博文已经知道傅里叶变换是得到信号在频域的分布,数字图像也是一种信号,对它进行傅里叶变换得到的也是它的频谱数据。对于数字图像这种离散的信号,频率大小表示信号变化的剧烈程度或者说是信号变化的快慢。频率越大,变化越剧烈,频率越小,信号越平缓,对应到图像中,高频信号往往是图像中的边缘信号和噪声信号,而低频信号包含图像变化频繁的图像轮廓及背景等信号。

      需要说明的是,傅里叶变换得到的频谱图上的点与原图像上的点之间不存在一一对应的关系。

频域数据的应用

1.  图像去噪

      根据上面说到的关系,我们可以根据需要获得在频域对图像进行处理,比如在需要除去图像中的噪声时,我们可以设计一个低通滤波器,去掉图像中的高频噪声,但是往往也会抑制图像的边缘信号,这就是造成图像模糊的原因。以均值滤波为例,用均值模板与图像做卷积,大家都知道,在空间域做卷积,相当于在频域做乘积,而均值模板在频域是没有高频信号的,只有一个常量的分量,所以均值模板是对图像局部做低通滤波。除此之外,常见的高斯滤波也是一种低通滤波器,因为高斯函数经过傅里叶变换后,在频域的分布依然服从高斯分布,如下图所示。所以它对高频信号有很好的滤除效果。

一维信号时域频域分析 python_人工智能_89

                                                                                 高斯函数在频域的分布图像

2.  图像增强及锐化

      图像增强需要增强图像的细节,而图像的细节往往就是图像中高频的部分,所以增强图像中的高频信号能够达到图像增强的目的。  

      同样的图像锐化的目的是使模糊的图像变得更加清晰,其主要方式是增强图像的边缘部分,其实就是增强图像中灰度变化剧烈的部分,所以通过增强图像中的高频信号能够增强图像边缘,从而达到图像锐化的目的。从这里可以看出,可以通过提取图像中的高频信号来得到图像的边缘和纹理信息。

3. 其他基于频谱和相位谱的操作等

      下面我们通过代码来看一下是否真如我们想想的一样。

运行结果

一维信号时域频域分析 python_频域_90

一维信号时域频域分析 python_时域_91

一维信号时域频域分析 python_频域_92

      如果在图像中加入噪声,结果会如何呢?

一维信号时域频域分析 python_一维信号时域频域分析 python_93

结果分析

       从上面的结果可以看出,低通滤波会让图像变得模糊,可以对图像进行模糊处理,滤除图像的噪声,高通滤波获得了图像的边缘和纹理信息。此外,通过增强图像的高频信号,可以增强图像的对比度,因为图像中的高频信号主要是出现在边缘及噪声这样的灰度出现跃变处的区域。

      从频谱图上可以看出,当将频谱移频到原点以后,图像中心比较亮。在频谱图中,一个点的亮暗主要与包含这个频率的数目有关,也就是说在空间域中包含这种频率的点越多,频谱图中对应的频率的位置越亮。而经过频移后,频率为0的部分,也就是傅里叶变换所得到的常量分量在图像中心,由内往外扩散,点所代表的频率越来越高。可以从上面的结果中看出,只取核心的小范围内的低频信号再将其转换回到时域空间,已经能够在一定程度是看到图像的基本轮廓信息,这说明了图像中的“能量”主要集中在低频部分。

      实际上,为了方便理解,可以把图像的二维傅里叶变换得到的频谱图看作图像的梯度分布图(两幅图像中的点并不是一一对应),频谱图中的某一个点所表征的是空间域中某一个点与周围点的灰度差异性,灰度差异越大,则频率越大。当然时域中灰度变化剧烈的区域也包含了低频信号,因为低频信号是构成图像信息的基础。