图像傅立叶变换
转自:http://hi.baidu.com/microsko/blog/item/cd5a5b7ae3e46de02e73b3c4.html
图像的傅立叶变换,原始图像由N行N列构成,N必须是基2的,把这个N*N个包含图像的点称为实部,另外还需要N*N个点称为虚部,因为FFT是基于复数的,如下图所示:

计算图像傅立叶变换的过程很简单:首先对每一行做一维FFT,然后对每一列做一维FFT。具体来说,先对第0行的N个点做FFT(实部有值,虚部为0),将FFT输出的实部放回原来第0行的实部,FFT输出的虚部放回第0行的虚部,这样计算完全部行之后,图像的实部和虚部包含的是中间数据,然后用相同的办法进行列方向上的FFT变换,这样N*N的图像经过FFT得到一个N*N的频谱。
下面展示了一副图像的二维FFT变换:

频域中可以包含负值,图像中灰色表示0,黑色表示负值,白色表示正值。可以看到4个角上的黑色更黑,白色更白,表示其幅度更大,其实4个角上的系数表示的是图像的低频组成部分,而中心则是图像的高频组成部分。除此以外,FFT的系数显得杂乱无章,基本看不出什么。

将上述直角坐标转换为极坐标的形式,稍微比较容易理解一点,幅度中4个角上白色的区域表示幅度较大,而相位中高频和低频基本看不出什么区别来。

上述以一种不同的方法展示了图像频谱,它将低频部分平移到了频谱的中心。这个其实很好理解,因为经2D-FFT的信号是离散图像,其2D-FFT的输出就是周期信号,也就是将前面一张图周期性平铺,取了一张以低频为中心的图。将原点放在中心有很多好处,比如更加直观更符合周期性的原理,但在这节中还是以未平移之前的图来解释。
行N/2和列N/2将频域分成四块。对实部和幅度来说,右上角和左下角成镜像关系,左上角和右下角也是镜像关系;对虚部和相位来说,也是类似的,只是符号要取反,这种对称性和1维傅立叶变换是类似的,你可以往前看看。

为简单起见,先考虑4*4的像素,右边是其灰度值,对这些灰度值进行2维fft变换。
h和k的范围在-N/2到N/2-1之间。
通常I(n,m)是实数,F(0,0)总是实数,并且F(h,k)具有对偶性。
如果写成指数形式,即:
--------------------------------
图像傅立叶变换的物理意义

如果只保留靠近中心的幅度,则图像的细节丢失,但是不同区域还是有着不同灰度。

如果保留的是远离中心的幅度,则图像的细节可以看得出,但是不同区域的灰度都一样了。

考虑一个黑色矩形的傅立叶变换,这个黑色矩形的背景为白色。

如果对频域中垂直方向高频分量进行截断,则图像中黑白将不那么分明了,表现为振荡。

可以得出结论:
傅立叶变换系数靠近中心的描述的是图像中慢变化的特性,或者说灰度变换比较缓慢的特性(频率比较慢的部分);
傅立叶变换系数远离中心的描述的是图像中快变化的特性,或者说灰度变换比较剧烈的特性(频率比较快的部分)。
--------------------------------
傅立叶变换相位所含的信息
有两幅图像,如果用第一幅图像傅立叶变换的幅度和第二幅图像傅立叶变换的相位做反变换得到的图像是什么样子的?如果反过来,将第一幅图像的相位和第二幅图像的幅度做反变换得到的图像又是什么样子的?

这里再用1维傅立叶变换解释一下:

在1维傅立叶变换中,可以看到相位包含了边沿何时出现的信息!在图像的傅立叶变换中也一样,相位决定了图像的边沿,所以决定了图像中你看到物体的样子!
关于相位所含的信息,你可以这样理解:
边沿的形成是当很多正弦波上升沿都发生在同一时刻,也就是这些正弦波的相位是相同的时刻,所以相位所含的信息决定了边沿所发生的位置,而正是边沿决定了图像的样子。
这个就是图像信号和声音信号的一个区别,声音信号的信息多数都包含在其傅立叶变换的幅度中,即不同频率幅度的大小,就是说你听到什么声音取决于你听到什么样的频率的信号,而对于这些信号时什么时候发生的并不十分重要。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗