
幅度谱
-
2023年3月18日发(作者:网页媒体)OPenCV:傅⾥叶变换、时域和频域、频谱和相位谱、傅⾥叶
级数、离散傅⾥叶变换(DFT)、。。。
快速了解傅⽴叶变换(播放PPT即能动态地显⽰gif图)
有⼀种运算,把微积分变成加减乘除,它叫傅⽴叶变换。
傅⾥叶变换将信号分解为⼀组余弦函数的过程。
那傅⽴叶变化到底怎么解决问题的呢?
其实,傅⽴叶变换(的三⾓函数形式)的基本原理是:多个正余弦波叠加(红⾊)可以⽤来近似任何⼀个原始的周期函数(蓝⾊)。
其实,当我们去买菜的时候,各种蔬菜都不⼀样,但都能转换成“n个1⽄砝码+m个1两砝码”的组合。
此时,那我们把上图末尾处蓝⾊的竖线就想象成3个1号波+5个2号波的组合等等。
⼀下⼦计算就简单许多了,使得积分,微分,成了最简易的计算:加减乘除。在处理上有多⽅便就不⽤说了。
因此,傅⽴叶变换在数学⾥⾯,这本⾝就是⼀种解微分⽅程的⽅法。
也正因为傅⽴叶变换有趣的简化⽅式,使得傅⽴叶变换成为⼯程和物理领域⾥最重要的数学公式之⼀。
3.7图像变换-傅⾥叶变换
学习⽬标
理解傅⾥叶变换
知道傅⾥叶变换的相关概念
知道傅⾥叶变换的分类
知道怎么在图像中进⾏傅⾥叶变换
了解傅⾥叶变换在图像应⽤中的意义
知道在OPenCV中怎么实现傅⾥叶变换
了解频域滤波的分类
1傅⾥叶变换的理解
傅⾥叶变换是由法国的⼀位数学家JosephFourier在18世纪提出来的,他认为:任何连续周期的信号都可以由⼀组适当的正弦曲线组合⽽
成。
傅⾥叶变换是描述信号的需要,它能够反映信号的特征,并可以使⽤特征值进⾏量化,⽐如正弦波可以使⽤幅值和频率进⾏描述。下⾯这幅
图是变压器空载电流的输⼊波形:
它看起来和正弦波很相近,但很难定量的描述其特征,采⽤傅⾥叶变换后,得到下述的频谱图(幅值):
从该频谱图中可以清楚的看到,主要包括3,5,7,9次谐波,我们就可以对原信号进⾏描述。
傅⾥叶变换是⼀种信号分析⽅法,它使我们能够对信号的构成和特点进⾏深⼊和定量的研究,把信号通过频谱的⽅式进⾏准确的、定量的描
述。
那我们为什么要把信号分解为正弦波的组合,⽽不是其他波形呢?
傅⾥叶变换是信号的分析⽅法,⽬的就是要简化问题,⽽不是将其变复杂,傅⾥叶选择了正弦波,⽽没有选择其他波形,是因为正弦波有任
何其他波形不具有的特点:正弦波输⼊⾄任何线性系统中,不会产⽣新的频率成分,输出的仍是正弦波,改变的仅仅是幅值和相位。⽤单位
幅值的不同频率的正弦波输⼊⾄某线性系统,记录其输出正弦波的幅值和频率的关系,就得到该系统的幅频特性,记录输出正弦波的相位和
频率的关系,就得到该系统的相频特性。线性系统是⾃动控制研究的主要对象,我们只要研究系统对正弦波的输⼊输出关系,就可以知道该
系统对任意输⼊信号的响应。这是傅⾥叶变换的最主要的意义。
2傅⾥叶变换中相关概念
2.1时域和频域
傅⾥叶变换是将难以处理的时域信号转换成易于分析的频域信号,那频域和时域到底是什么呢?
时域:时域是真实的世界,是唯⼀存在的域。从我们出⽣开始,所接触的这个世界就是随着时间在变化的,如花开花落,四季变换,⽣⽼病
死等。以时间作为参照来分析动态世界的⽅法我们称其为时域分析。
⽐如说⼀段⾳乐,就是⼀个随时间变化的震动,这就是时域的表⽰,如下图:
频域:频域它不是真实的,⽽是⼀个数学构造。频域是⼀个遵循特定规则的数学范畴,也被⼀些学者称为上帝视⾓。结合上⾯对时域的理
解,如果时域是运动永不停⽌的,那么频域就是静⽌的。正弦波是频域中唯⼀存在的波形,这是频域中最重要的规则,即正弦波是对频域
的描述,因为频域中的任何波形都可⽤正弦波合成。
在看上⾯那段⾳乐,我们可以将其表⽰成频域形式,就是⼀个永恒的⾳符。
⽽对于信号来说,信号强度随时间的变化规律就是时域特性,信号是由哪些单⼀频率的信号合成的就是频域特性,傅⾥叶变换实质就是是频域
函数和时域函数的转换。
那频域与时域之间的关系是什么样的呢?利⽤正弦函数的叠加成⼀个矩形,不仅仅是矩形,你能想到的任何波形都是可以如此⽅法⽤正余弦
波叠加起来的。如下图所⽰,时域是永远随着时间的变化⽽变化的,⽽频域就是装着装着正余弦波的空间。
从时域来看,我们会看到⼀个近似为矩形的波,⽽我们知道这个矩形的波可以拆分为⼀些正弦波的叠加。⽽从频域⽅向来看,我们就看到了
每⼀个正余弦波的幅值,每两个正弦波之间都还有⼀条直线,那并不是分割线,⽽是振幅为0的正弦波!也就是说,为了组成特殊的曲
线,有些正弦波成分是不需要的。随着叠加的递增,所有正弦波中上升的部分逐渐让原本缓慢增加的曲线不断变陡,⽽所有正弦波中下降的
部分⼜抵消了上升到最⾼处时继续上升的部分使其变为⽔平线。⼀个矩形就这么叠加⽽成了。
我们看下⾯的动图理解,如下所⽰:
2.2频谱和相位谱
在傅⾥叶变换中怎么描述变换后的结果呢?有两个概念:频谱和相位谱。
频谱:将信号分解为若⼲不同频率的正弦波,那么每⼀个正弦波的幅度,就叫做频谱,也叫做幅度谱。
相位谱:频谱只代表了⼀个正弦函数的幅值,⽽要准确描述⼀个正弦函数,我们不仅需要幅值,还需要相位,不同相位决定了波的位置,所
以对于频域分析,仅仅有频谱(振幅谱)是不够的,我们还需要⼀个相位谱
如上图所⽰:投影点我们⽤粉⾊点来表⽰,红⾊的点表⽰离正弦函数频率轴最近的⼀个峰值,⽽相位差就是粉⾊点和红⾊点⽔平距离。将相
位差画到⼀个坐标轴上就形成了相位谱
3傅⾥叶变换
根据原信号的属性,我们可以将傅⾥叶变换分为以下⼏种:
在实际应⽤较多的是傅⾥叶变换、傅⾥叶级数离散傅⾥叶变换,我们对其进⾏分别介绍。
任意波形都可以通过正弦波的叠加来表⽰,正弦波可以通过欧拉公式写成指数的形式,欧拉公式如下:
所以以下内容都是以指数形式进⾏展⽰。
3.1傅⾥叶级数
任意的周期连续信号都可以使⽤正弦波叠加⽽成,这叫做傅⾥叶级数,写成指数形式如下所⽰:
3.2傅⾥叶变换
对于⾮周期的连续信号,也可以使⽤正弦信号来逼近,这时我们将⾮周期信号看做周期⽆限⼤的周期信号,则有:
3.3离散傅⾥叶变换(DFT)
由于数字信号处理是希望在计算机上实现各种运算和变换,其所涉及的变量和运算都是离散的,因此对于数字信号处理,应该找到在时域和
频域都是离散的傅⾥叶变换,即离散傅⾥叶变换。
对于⾮周期的离散信号进⾏傅⾥叶变换就是离散傅⾥叶变换,其计算⽅法如下所⽰:
4傅⾥叶变换在图像中的应⽤
4.1图像中的傅⾥叶变换
图像是⼆维的离散信号,所以我们在对图像进⾏⼆维傅⾥叶变换。对于M*N的⼀幅图像的离散⼆维傅⾥叶变换,公式如下:
4.2图像傅⾥叶变换的物理意义
图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平⾯空间上的梯度。如:⼤⾯积的沙漠在图像中是⼀⽚灰度变化缓慢的区域,
对应的频率值很低;⽽对于地表属性变换剧烈的边缘区域在图像中是⼀⽚灰度变化剧烈的区域,对应的频率值较⾼。傅⾥叶变换在实际中有
⾮常明显的物理意义,从物理效果看,傅⾥叶变换是将图像从空间域转换到频率域,其逆变换是将图像从频率域转换到空间域。换句话说,
傅⾥叶变换的物理意义是将图像的灰度分布函数变换为图像的频率分布函数。
傅⾥叶逆变换是将图像的频率分布函数变换为灰度分布函数。
我们在做DFT时是将图像的空域和频域沿x和y⽅向进⾏⽆限周期拓展的,如下图所⽰:
4.3在opencv中实现图像的傅⾥叶变换
在OPenCV中实现图像的傅⾥叶变换,使⽤的是:
正变换:
dft=(src,dst=None)
参数:
src:输⼊图像,要转换成32格式
dst:参数是可选的,决定输出数组的⼤⼩。默认输出数组的⼤⼩和输⼊图像⼤⼩⼀样。如果输出结果⽐输⼊图像⼤,输⼊图像就需要在
进⾏变换前补0。如果输出结果⽐输⼊图像⼩的话,输⼊图像就会被切割。
返回:
dft:傅⾥叶变换后的结果,有两个通道,第⼀个通道是结果的实数部分,第⼆个通道是结果的虚数部分。我们需要在此基础上计算傅⾥
叶变换的频谱和相位。
逆变换:
img=(dft)
参数:
dft:图像的频域表⽰
返回:
img:图像的空域表⽰
实现:
importnumpyasnp
importcv2ascv
frommatplotlibimportpyplotasplt
#1读取图像
img=('./image/',0)
#2傅⾥叶变换
#2.1正变换
dft=(32(img),flags=_COMPLEX_OUTPUT)
#2.2频谱中⼼化
dft_shift=ft(dft)
#2.3计算频谱和相位谱
mag,angle=Polar(dft_shift[:,:,0],dft_shift[:,:,1],angleInDegrees=True)
mag=20*(mag)
#3傅⾥叶逆变换
#3.1反变换
img_back=(dft)
#3.2计算灰度值
img_back=ude(img_back[:,:,0],img_back[:,:,1])
#4图像显⽰
(figsize=(10,8))
t(221),(img,cmap='gray')
('输⼊图像'),([]),([])
t(222),(mag,cmap='gray')
('频谱'),([]),([])
t(223),(angle,cmap='gray')
('相位谱'),([]),([])
t(224),(img_back,cmap='gray')
('逆变换结果'),([]),([])
()
结果展⽰:
4.4频域滤波
图像变换到频域后,就可以进⾏频域滤波,主要包括:⾼通滤波,低通滤波,带通滤波和带阻滤波。
1⾼通和低通滤波器
我们知道,图像在经过傅⾥叶变换后,经频谱中⼼化后,从中间到外⾯,频率上依次是从低频到⾼频的。那么我们假设把中间规定⼀⼩部分
去掉,是不是相对于把低频信号去掉了呢?这也就是相当于进⾏了⾼通滤波。
这个滤波模板如下图所⽰:
其中⿊⾊部分为0,⽩⾊部分为1,我们将这个模板与图像的傅⾥叶变换相与就实现了⾼通滤波。如下所⽰:
importnumpyasnp
importcv2ascv
frommatplotlibimportpyplotasplt
#1读取图像
img=('./image/',0)
#2设计⾼通滤波器(傅⾥叶变换结果中有两个通道,所以⾼通滤波中也有两个通道)
rows,cols=
mask=((rows,cols,2),8)
mask[int(rows/2)-30:int(rows/2)+30,int(cols/2)-30:int(cols/2)+30,:]=0
#3傅⾥叶变换
#3.1正变换
dft=(32(img),flags=_COMPLEX_OUTPUT)
#3.2频谱中⼼化
dft_shift=ft(dft)
#3.3滤波
dft_shift=dft_shift*mask
#3.4频谱去中⼼化
dft_shift=ft(dft_shift)
#3傅⾥叶逆变换
#3.1反变换
img_back=(dft_shift)
#3.2计算灰度值
img_back=ude(img_back[:,:,0],img_back[:,:,1])
t(121),(img,cmap='gray')
('输⼊图像'),([]),([])
t(122),(img_back,cmap='gray')
('⾼通滤波结果'),([]),([])
()
从结果中可以看出,⾼通滤波器有利于提取图像的轮廓,图像的轮廓或者边缘或者⼀些噪声处,灰度变化剧烈,那么在把它们经过傅⾥叶变
换后。就会变成⾼频信号(⾼频是捕捉细节的),所以在把图像低频信号滤掉以后剩下的⾃然就是轮廓了。
现在我们看下低通滤波的效果,构造⼀个低通滤波器很简单,只要把上述模板中的1改为0,0改为1即可。把设计⾼通滤波器部分的代码改
成如下所⽰:
rows,cols=
mask=((rows,cols,2),8)
mask[int(rows/2)-30:int(rows/2)+30,int(cols/2)-30:int(cols/2)+30,:]=1
低通滤波的效果如下图所⽰:
从结果中可看到低通滤波后图像轮廓变模糊了,图像的⼤部分信息基本上都保持了。图像的主要信息都集中在低频上,所以低通滤波器的效
果是这样也是能够理解的。上述的⾼通、低通滤波器的构造有0,1构成的理想滤波器,也是最简单的滤波器,另⼀些其它的滤波器。⽐⽅说
⾼斯滤波器,butterworth滤波器等等,如下图所⽰:
2带通和带阻滤波器
我们把⾼通和低通的⼀部分结合在模板中就形成了带通滤波器,它容许⼀定频率范围信号通过,但减弱(或减少)频率低于於下限截⽌频率和
⾼于上限截⽌频率的信号的通过,如下图所⽰:
还是以理想的带通滤波器演⽰如下,将构建的滤波的代码修改如下:
rows,cols=
mask1=((rows,cols,2),8)
mask1[int(rows/2)-8:int(rows/2)+8,int(cols/2)-8:int(cols/2)+8]=0
mask2=((rows,cols,2),8)
mask2[int(rows/2)-80:int(rows/2)+80,int(cols/2)-80:int(cols/2)+80]=1
mask=mask1*mask2
结果如下所⽰:
这就是带通的效果,它既能保留⼀部分低频,也能保留⼀部分⾼频。⾄于保留多少,根据需求选择就可以了。
带阻滤波器减弱(或减少)⼀定频率范围信号,但容许频率低于於下限截⽌频率和⾼于上限截⽌频率的信号的通过,如下⽰:
在代码中将设计滤波器部分改为如下所⽰:
mask=((rows,cols,2),8)
mask[int(rows/2)+80:int(rows/2)+150,int(cols/2)-150:int(cols/2)+150]=0
mask[int(rows/2)-150:int(rows/2)-80,int(cols/2)-150:int(cols/2)+150]=0
mask[int(rows/2)-150:int(rows/2)+150,int(cols/2)+80:int(cols/2)+150]=0
mask[int(rows/2)-150:int(rows/2)+150,int(cols/2)-150:int(cols/2)-80]=0
(mask[:,:,1],cmap=)
结果如下所⽰:
从结果中可看到带阻滤波器保持了原图像的⼤部分信息,图像的主要信息都集中在低频上,⽽边缘轮廓信息都在⾼频位置。带阻滤波器滤除
了中频信息,保留了低频和⾼频信息,所以对图像的信息破坏是⽐较⼩的。:
总结:
1.傅⾥叶变换的理解
任何连续周期的信号都可以由⼀组适当的正弦曲线组合⽽成
2.相关概念:
时域:以时间作为参照来分析动态世界的⽅法
频域:频域它不是真实的,⽽是⼀个数学构造
幅度谱:将信号分解为若⼲不同频率的正弦波,那么每⼀个正弦波的幅度,就叫做频谱,也叫做幅度谱
相位谱:每⼀个正弦波的相位,就叫做相位谱
3.傅⾥叶变换分类
傅⾥叶级数:任意的周期连续信号的傅⾥叶变换
傅⾥叶变换:⾮周期连续信号
离散傅⾥叶变换:⾮周期离散信号
4.图像中的应⽤
1.⼆维傅⾥叶变换
2.意义:将图像的灰度分布函数变换为图像的频率分布函数。
:
()
()
4.滤波:⾼通,低通,带通,带阻
In[1]:
importnumpyasnp
importcv2ascv
asplt
In[2]:
img=('./image/',0)
In[3]:
(img,"gray")
Out[3]:
In[4]:
dft=(32(img),flags=_COMPLEX_OUTPUT)
In[5]:
dft_shift=ft(dft)
In[6]:
mag,angle=Polar(dft_shift[:,:,0],dft_shift[:,:,1])
In[7]:
mag=20*(mag)
In[8]:
(mag,'gray')
Out[8]:
In[9]:
(angle,'gray')
Out[9]:
In[10]:
img_back=(dft)
In[11]:
img_back=ude(img_back[:,:,0],img_back[:,:,1])
In[12]:
(img_back,"gray")
Out[12]:
⾼通滤波器
In[13]:
rows,cols=
In[14]:
highmask=((rows,cols,2),8)
In[15]:
highmask[int(rows/2)-30:int(rows/2)+30,int(cols/2)-30:int(cols/2)+30]=0
In[16]:
highdft=dft_shift*highmask
In[17]:
highdft=ft(highdft)
In[18]:
highimg=(highdft)
In[19]:
highimg=ude(highimg[:,:,0],highimg[:,:,1])
In[20]:
(highimg,"gray")
Out[20]:
低通滤波
In[21]:
lowmask=((rows,cols,2),8)
In[22]:
lowmask[int(rows/2)-30:int(rows/2)+30,int(cols/2)-30:int(cols/2)+30]=1
In[23]:
lowdft=dft_shift*lowmask
In[24]:
lowdft=ft(lowdft)
In[25]:
lowimg=(lowdft)
In[26]:
lowimg=ude(lowimg[:,:,0],lowimg[:,:,1])
In[27]:
(lowimg,"gray")
Out[27]: