离散傅里叶变换
离散傅里叶变换是指傅里叶变换在时域和频域上都呈现出离散的形式,将时域信号的采样变换成为在离散时间傅里叶变换频域的采样。
简单来说,对一张图像使用傅里叶变换就是将它分解成正弦和余弦两部分,也就是将图像从空间域转换到频域。在频域里,高频部分代表了图像的细节、纹理信息,而低频部分代表了图像的轮廓信息。
傅里叶变换在图像处理中的应用:图像的增强与图像去噪、图像分割之边缘检测、图像特征提取、图像压缩
下面来列出本节要学习的函数清单
1.dft()傅里叶变换
2.getOptimalDFTSize()返回DFT的最佳尺寸
3.copyMakeBorder()扩充图像边界
4.Magnitude()计算二维矢量的幅值
5.Log()计算自然对数
6.Normalize()矩阵归一化
1.void
第一个参数:输入图像
第二个参数:输出图像,前两个参数我们已经很熟悉了
第三个参数:转换的标识符,默认值为0,此时默认的应该是正向变换,还有很多其他的标识符,比如DFT_INVERSE(用一维或者二维逆变换代替默认的正向变换)
第四个参数:默认值为0,如果此参数设为非0时(最好是取值为想要处理的那一行的值,比如C.rows),函数可以进行更高效的处理,节省时间开销。
2.Int
此函数唯一的一个参数表示的是向量尺寸,为了提高离散傅里叶变换的运行速度,需要扩充图像,而具体扩充多少,由这个函数来计算得到
3.Void
第一个参数:输入图像
第二个参数:输出图像
第3-6个参数:分别表示在源图像的上下左右四个方向上扩充多少个像素
第七个参数:边界类型,常取值为BORDER_CONSTANT
第八个参数:扩充部分的像素值
4.Void
第一个参数:表示矢量的浮点型X的坐标值,也就是实部
第二个参数:表示矢量的浮点型Y的坐标值,也就是虚部
第三个参数:输出的幅值,和第一个参数X有着同样的尺寸和类型
5.Void
第一个参数为输入的源图像
第二个参数为输出的对数值
6.Void
第一个参数:输入图像
第二个参数:输出图像
第三个参数:归一化后的最大值,默认为1
第四个参数:归一化后的最小值,默认为0
第五个参数:归一化类型,默认NORM_L2
第六个参数:默认值-1,当此参数取负值时,输出矩阵和src有同样的类型,否则,它和src有同样的通道数,且此时图像深度为CV_MAT_DEPTH
第七个参数:可选的操作掩膜,有默认值noArray()
程序代码
//离散傅里叶变换的程序
#include"stdafx.h"
#include
using
using
int
{
//读入图像
Mat
imshow("原图",
//扩展图像的像素
int
int
Mat
copyMakeBorder(image,
//为虚数部分分配空间,image2是一个二维的向量,一个内容是image1的复制,一个内容全为0
Mat
Mat
//进行就地傅里叶运算
dft(complex1,complex1);
//进行幅度运算
split(complex1,
magnitude(image2[0],image2[1],image2[0]);
Mat
//进行对数运算
magnitudeimage
log(magnitudeimage,
//进行剪切和重分部,对于重分部,是让四个顶点集中到中心这一点上,形成四个象限
magnitudeimage
int
int
Mat
Mat
Mat
Mat
Mat
q0.copyTo(temp);
q3.copyTo(q0);
temp.copyTo(q3);
q1.copyTo(temp);
q2.copyTo(q1);
temp.copyTo(q2);
//归一化
normalize(magnitudeimage,magnitudeimage,1,0,CV_MINMAX);
imshow("频谱图",
waitKey();
return
}
结果截图
![opencv学习笔记(十二)离散傅里叶变换 opencv学习笔记(十二)离散傅里叶变换](https://i-blog.csdnimg.cn/blog_migrate/2d0a551cad0181926d170711b6841f40.jpeg)