网站首页 > 技术教程 正文
目标
本小节将寻求以下问题的答案:
- 什么是傅立叶变换,为什么要使用傅立叶变换?
- 如何在OpenCV中使用傅立叶变换?
- copyMakeBorder() , merge() , dft() , getOptimalDFTSize() , log() 和 normalize() 等函数的使用方法。
源代码
C ++ Java Python
可以在这里下载源代码库,或者到samples/cpp/tutorial_code/core/discrete_fourier_transform/discrete_fourier_transform.cpp目录下查看OpenCV的源代码库。
下面是DFT()的应用示例程序:
代码详解
C ++ Java Python
傅立叶变换将图像分解成正弦和余弦分量。也就是说,它将图像从空间域变换到频率域,其主要思想为:任何函数均可以用无限多个正弦和余弦函数之和来近似。傅立叶变换正是这一想法的实现。从数学的角度来看,二维图像的傅里叶变换如下:
这里,f是图像在空间域的像素值, F是图像在频率域的像素值,转换后的结果为复数。可以通过显示复数的实部和虚部来显示傅里叶变换的结果,也可以通过幅度和相位来显示傅里叶变换的结果。然而,图像处理算法仅关注图像的幅度,因为幅度信息中包含了图像几何结构中的所有信息。不过,如果需要对图像做一些修改的话,需要对它进行傅里叶变换逆变换,并需要分别保留频率域和空间域中的两种数值。
在此示例中,将介绍如何计算和显示图像经过傅立叶变换后的幅值。数字图像的傅里叶变换是离散的傅里叶变换,这意味着,给定域的像素值是离散的。例如,灰度图像的像素值通常在0到255之间,傅立叶变换的结果也是离散型的。可以根据图像的几何视角来确定图像的结构。下面是离散型的傅里叶变换(DFT )的实现步骤(输入图像为灰度图像I):
将图像展开到最佳尺寸
DFT的性能取决于图像的大小,当图像的尺寸为2,3,5 的倍数时,离散傅里叶变换(DFT )的速度最快。因此,为获得最优的性能,往往将图像的边界值调整到适合的大小,利用getOptimalDFTSize()函数将图像展开到最佳尺寸,使用copyMakeBorder()函数扩展的图像(将增加的像素值初始化为零)的边界:
为复数的实步和虚部开辟存储空间
傅立叶变换的结果是复数,这意味着,每个图像的像素值对应的结果是两个像素值(实部和虚部各一个分量)。此外,频率域范围比其对应的空间域范围要大得多,所以至少要用浮点(float format)的格式来存储傅里叶变换的结果。为此,需要将输入的图像数据类型转换成浮点类型,并扩展出另一个通道来保存复数值:
离散傅立叶变换
做如下计算(输入相同的输入):
将复数的实部和虚部转换成幅度值
复数包含实部(Re)和虚部( Im) 两部分。DFT的结果为复数,这个复数的幅度为:
转换成OpenCV的代码如下:
切换到对数刻度
由于傅里叶系数的动态范围过大,无法在屏幕上显示,为了便于观察,利用对数变换将这些较大的系数值变小。经过对数变换之后,较高的数值会变成白点,而较小的数值变为黑点。为了将灰度值可视化,将线性刻度变换成对数刻度:
转换成OpenCV代码如下:
剪裁和重排
在上述第一步中,对图像的尺寸进行了扩展,在这里需要抛弃由于图像扩展而新引进的像素值。为了方便可视化,对结果值得象限重新排列,使得原点(零,零)对应图像中心。
归一化
归一化的目的也是为了便于可视化。经过运算之后,获得了幅度值,这一幅度值仍然超出了图像的显示范围(从零到一),为此,利用cv::normalize()函数对幅度值归一化,以确保像素值在零到一的范围之内。
结果
应用傅里叶变换的主要目的是要确定图像的几何方向。例如,可以看出文本是水平还是垂直的?对于某些文字来说,文本行的排序形式是水平线,而字母则形成某种垂直线。通过傅里叶变换,可以看出文本的两个主要部件的不同片段。下面,从 水平和旋转两个维度看文本图像。
水平文本图像:
旋转本图像:
从上图中可以看出,在频域中影响最大的分量(幅度图像上最亮的点)会随着图像的几何位置旋转,可以根据这一点计算出偏移量,通过旋转图像来对位置进行纠正。
- 上一篇: 傅里叶变换的相位来源
- 下一篇: OpenCV(31)——傅里叶变换原理
猜你喜欢
- 2024-11-26 连续与离散信号的傅里叶级数和傅里叶变换比较
- 2024-11-26 傅里叶变换、拉普拉斯变换、Z 变换的联系是什么?为什么要进行这些变换?
- 2024-11-26 连续与离散时间域各种傅里叶变换的联系与区别
- 2024-11-26 一文读懂傅立叶变换处理图像的原理
- 2024-11-26 傅里叶变换(DFT)是酉变换的证明
- 2024-11-26 正弦函数傅里叶变换的意义及频谱泄露原因的理论分析
- 2024-11-26 在离散时间域对于傅里叶变换的深度理解
- 2024-11-26 OpenCV(31)——傅里叶变换原理
- 2024-11-26 傅里叶变换的相位来源
- 2024-11-26 第一讲:直观的阐述傅里叶变换中隐含的基础原理
你 发表评论:
欢迎- 04-27spring框架怎么实现依赖注入?
- 04-27卸载 Mac 应用程序的 4 种基础方法
- 04-27用户界面框架jQuery EasyUI示例大全之Application
- 04-27win7 64位 server.CreateObject("excel.application")
- 04-27SpringCloud的配置文件bootstrap和application的区别
- 04-27Excel VBA小技巧:用Application.Version判断用户Excel版本
- 04-27JSA宏教程——应用程序(Application)对象事件
- 04-27详解flink 1.11中的新部署模式-Application模式
- 最近发表
-
- spring框架怎么实现依赖注入?
- 卸载 Mac 应用程序的 4 种基础方法
- 用户界面框架jQuery EasyUI示例大全之Application
- win7 64位 server.CreateObject("excel.application")
- SpringCloud的配置文件bootstrap和application的区别
- Excel VBA小技巧:用Application.Version判断用户Excel版本
- JSA宏教程——应用程序(Application)对象事件
- 详解flink 1.11中的新部署模式-Application模式
- 为什么CEO念“C~E~O”,而APP却不能念A~P~P?
- 汇川技术|Inoproshop软件中Application简介及常用功能
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)