【OpenCV4】图像的傅里叶变换 cv::dft() 和逆变换 cv::idft() 解析(c++)
图像傅里叶变换的作用:
- 频谱分析,获取图像中高频低频的分布情况
- 快速卷积,两个矩阵的傅里叶变换结果相乘
案例代码:
cv::Mat TestOpencvDft()
{cv::Mat lena = cv::imread("lena.jpg", 0);cv::resize(lena, lena, cv::Size(501, 501));// 确定适合做傅里叶变换的图像最佳尺寸int rows = cv::getOptimalDFTSize(lena.rows);int cols = cv::getOptimalDFTSize(lena.cols);// 扩展图像cv::Mat lena_pad;int up = (rows - lena.rows) / 2;int down = rows - lena.rows - up;int left = (cols - lena.cols) / 2;int right = cols - lena.cols - left;cv::copyMakeBorder(lena, lena_pad, up, down, left, right, cv::BORDER_CONSTANT);// 构建输入cv::Mat channels[2], complex;channels[0] = cv::Mat_<float>(lena_pad); // 构建实数部分channels[1] = cv::Mat::zeros(lena_pad.size(), CV_32FC1); // 构建虚数部分cv::merge(channels, 2, complex); // 构建复数矩阵// 离散傅里叶变换cv::Mat lena_dft;cv::dft(complex, lena_dft);// 拆分实数部分和虚数部分,将复数转化为幅值cv::Mat result_channels[2];cv::split(lena_dft, result_channels);cv::Mat amplitude;cv::magnitude(result_channels[0], result_channels[1], amplitude);// 将幅值进行对数缩小,公式: amp = log(amp+1),这里 +1 是为了防止有小于 1 的值转换后形成负数amplitude += 1;log(amplitude, amplitude);// 截取和原图对应的区域amplitude = amplitude(cv::Rect(up, left, lena.cols, lena.rows));cv::normalize(amplitude, amplitude, 0, 1, cv::NORM_MINMAX);// 最值中心化int center_x = amplitude.cols / 2;int center_y = amplitude.rows / 2;// 分解成 4 个象限cv::Mat up_left = amplitude(cv::Rect(0, 0, center_x, center_y));cv::Mat up_right = amplitude(cv::Rect(center_x, 0, center_x, center_y));cv::Mat down_left = amplitude(cv::Rect(0, center_y, center_x, center_y));cv::Mat down_right = amplitude(cv::Rect(center_x, center_y, center_x, center_y));// 对角区域调换cv::Mat temp;temp = up_left.clone();down_right.copyTo(up_left);temp.copyTo(down_right);temp = up_right.clone();down_left.copyTo(up_right);temp.copyTo(down_left);// 傅里叶逆变换cv::Mat re;cv::idft(lena_dft, re, cv::DFT_SCALE);cv::Mat re_channels[2];cv::split(re, re_channels);cv::Mat result;re_channels[0].convertTo(result, CV_8UC1);return result;
}
输入图片:
读取灰度图:
修改宽高
按照最优的宽高扩展图像
傅里叶变换结果
转换成幅值图:
- 四个角是低频部分,中心是高频部分
最值中心化: - 将低频部分移动到中心
傅里叶逆变换结果
【OpenCV4】图像的傅里叶变换 cv::dft() 和逆变换 cv::idft() 解析(c++)相关推荐
- opencv4 图像特征匹配_概述 | 全景图像拼接技术全解析
点击上方蓝字关注我们 微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识 前言 图像/视频拼接的主要目的是为了解决相机视野(FOV-Field Of View)限制,生成更宽的FOV图 ...
- python的图像傅里叶变换 np.fft.fft2 cv.dft 函数
码字不易,如果对您有所帮助,记着点赞哦! 一. 图像傅里叶变换原理: 原理简介请参考:https://www.cnblogs.com/wojianxin/p/12529809.html 对二维图像进行 ...
- 图像的傅里叶变换和逆变换C++版
目录 头文件:包含OpenCV和标准库输出调试 读入并显示原图 进行离散傅里叶变换和逆变换 显示傅里叶变换图 完整代码: 参考文献: 首先把整体程序分段,每段都是单独的功能.最后再把完整代码给出: 头 ...
- 【图像处理】——傅里叶变换、DFT以及在图像上的应用
目录 1.傅里叶变换 2.DFT 1)一维离散傅里叶变换: 离散傅里叶变换例子 2)二维离散傅里叶变换: 注:连续变换和离散变化学习心得 3.DFT在图像上的应用 注意:二维和一维的区别 4.DFT在 ...
- CV:计算机视觉技术之图像基础知识(一)—以python的cv2库来了解计算机视觉图像基础(傅里叶变换-频域-时域/各种滤波器-线性-非线性-均值-中值-高斯-双边)
CV:计算机视觉技术之图像基础知识(一)-以python的cv2库来了解计算机视觉图像基础(傅里叶变换-频域-时域/各种滤波器-线性-非线性-均值-中值-高斯-双边) 目录 一.图像中的傅里叶变换 1 ...
- 【 MATLAB 】离散傅里叶变换(DFT)以及逆变换(IDFT)的MATLAB实现
刚刚写过一篇用MATLAB实现离散傅里叶级数的博文,如下: [ MATLAB ]离散傅里叶级数(DFS)及 IDFS 的 MATLAB 实现 离散傅里叶变换不是一种神奇的东西,它和离散傅里叶级数关系很 ...
- 利用python对图像进行傅里叶变换_python用opencv 图像傅里叶变换
傅里叶变换 dft = cv.dft(np.float32(img),flags = cv.DFT_COMPLEX_OUTPUT) 傅里叶逆变换 img_back = cv.idft(f_ishift ...
- 使用OpenCV实现离散傅里叶变换(DFT)
使用OpenCV实现离散傅里叶变换(DFT) 傅里叶变换,妈呀这个东东好高级啊!真的高级吗?理解起来还真是有点困难,需要一些高等数学的基础.有了OpenCV,你不理解也没问题,会用就OK!就好比你会用 ...
- 利用python对图像进行傅里叶变换_(九)OpenCV-Python学习—图像傅里叶变换
对于二维图片,可以对其进行傅里叶变换,获取图片的频谱信息.频谱有很多应用,包括显著性检测,卷积定理,频率域滤波等,下面是图片傅里叶变换的一些基本概念: 1. 图像傅里叶变换 对于M行N列的图像矩阵f( ...
最新文章
- 中国人工智能AI框架自主研发
- Xamarin.android Activity动画切换效果实现
- iOS混淆 -- 生成define 替换名
- 服务器集群后产生那些问题
- 【Python3爬虫】破解时光网登录加密参数并实现模拟登录
- 泥塑课c语言,【C】泥塑课(From http://www.jisuanke.com/)
- 一个人如果不学习,30岁就死了,活着的只是重复和应付
- 一个进程(Process)最多可以生成多少个线程(Thread)
- 【Java_Spring】控制反转IOC(Inversion of Control)
- 真没想到!时隔3年,被废掉武功的快播,依然是最受欢迎的播放器
- BP神经网络python代码实现
- 【教程】鼠标右键新建添加RTF文档
- git 清除 commit 记录
- linux安装包apr安装说明,Linux下安装Apr及其Apr-util的基本步骤
- 【CTA】CTA认证要求打开日历时提示联系人权限确认
- RM-MEDA的理解与分析
- 包装类的使用:自动装箱与自动拆箱
- 如何学习一门新的编程语言
- 【转】面向程序员的数据库访问性能优化法则
- 《MATLAB语音信号分析与合成(第二版)》:第10章 语音信号的合成算法