opencv实现快速傅立叶变换和逆变换
原文: http://www.tuicool.com/articles/VB3UNjf
说实话觉得网上很多人转载的文章的挺坑的,全部是opencv文档程序的翻译,看来看去都是那一
篇,真的没啥意思。 文档的地址。
本来opencv实现dft就是一个函数的事情,但是很少有关于逆变换使用的资料。我这几天在翻译
matlab版本的L0Smooth到opencv上面,就碰到这样一件很坑爹的事情。
首先,很少有人说清楚这个函数的使用方法。还有,根据教程,dft之前最好扩充原矩阵到合适的尺
寸(2,3,5的倍数),再调用dft会加快速度。那么,idft的时候了?如何恢复原有的尺寸?
在我的L0Smooth代码里,就碰到这样的事情了。如果,图片尺寸是2,3,5的倍数,那么能够得到
正确结果。否则得到是全黑的图片。如果,我不扩张矩阵,那么就能正确处理。
所以,到这里,我不推荐调用dft之前先扩充矩阵了。因为,我找了很久也没找到解决办法。
我数学水平有限,也分析不出原因,也没有时间去系统的学习这些了。
这里提供两个例子,说明dft和idft的使用。
例子一:类似于opencv官方文档的例子
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>#ifdef _DEBUG
#pragma comment(lib, "opencv_core247d.lib")
#pragma comment(lib, "opencv_imgproc247d.lib")
#pragma comment(lib, "opencv_highgui247d.lib")
#else
#pragma comment(lib, "opencv_core247.lib")
#pragma comment(lib, "opencv_imgproc247.lib")
#pragma comment(lib, "opencv_highgui247.lib")
#endif // DEBUGint main()
{// Read image from file// Make sure that the image is in grayscalecv::Mat img = cv::imread("lena.JPG",0);cv::Mat planes[] = {cv::Mat_<float>(img), cv::Mat::zeros(img.size(), CV_32F)};cv::Mat complexI; //Complex plane to contain the DFT coefficients {[0]-Real,[1]-Img}cv::merge(planes, 2, complexI);cv::dft(complexI, complexI); // Applying DFT//这里可以对复数矩阵comlexI进行处理// Reconstructing original imae from the DFT coefficientscv::Mat invDFT, invDFTcvt;cv::idft(complexI, invDFT, cv::DFT_SCALE | cv::DFT_REAL_OUTPUT ); // Applying IDFTcv::invDFT.convertTo(invDFTcvt, CV_8U); cv::imshow("Output", invDFTcvt);//show the imagecv::imshow("Original Image", img);// Wait until user press some keycv::waitKey(0);return 0;
}
代码意思很简单,dft之后再idft,注意参数额,必须有DFT_SCALE。代码中,先merge了个
复数矩阵,在例子2中可以看到,其实这一步可以去掉。
例子2:
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>#ifdef _DEBUG
#pragma comment(lib, "opencv_core247d.lib")
#pragma comment(lib, "opencv_imgproc247d.lib")
#pragma comment(lib, "opencv_highgui247d.lib")
#else
#pragma comment(lib, "opencv_core247.lib")
#pragma comment(lib, "opencv_imgproc247.lib")
#pragma comment(lib, "opencv_highgui247.lib")
#endif // DEBUGint main()
{// Read image from file// Make sure that the image is in grayscalecv:;Mat img = cv::imread("lena.JPG",0);cv::Mat dftInput1, dftImage1, inverseDFT, inverseDFTconverted;cv::img.convertTo(dftInput1, CV_32F);cv::dft(dftInput1, dftImage1, cv::DFT_COMPLEX_OUTPUT); // Applying DFT// Reconstructing original imae from the DFT coefficientscv::idft(dftImage1, inverseDFT, cv::DFT_SCALE | cv::DFT_REAL_OUTPUT ); // Applying IDFTcv::inverseDFT.convertTo(inverseDFTconverted, CV_8U);cv::imshow("Output", inverseDFTconverted);//show the imagecv::imshow("Original Image", img);// Wait until user press some keywaitKey(0);return 0;
}
从代码中可以看到,dft时候添加参数DFT_COMPLEX_OUTPUT,就可以自动得到复数矩阵了,代码更加简洁。注意,必须先将图片对应的uchar矩阵转换为float矩阵,再进行dft,idft,最后再转换回来。
opencv实现快速傅立叶变换和逆变换相关推荐
- opencv 傅立叶变换及其逆变换实例及其理解1
傅立叶变换是把图像从空间域转化到频率域的变换. 空间域 一般的情况下,空间域的图像是f(x,y)=灰度级(0-255),形象一点就是一个二维矩阵,每个坐标对应一个颜色值. 频率域 先介绍几个概念 频率 ...
- 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换?
https://www.douban.com/note/164400821/ 写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在此向多位原创作者致敬!!! ...
- 【转】为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换?...
写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在此向多位原创作者致敬!!!一.傅立叶变换的由来关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶 ...
- 神经网络中快速傅立叶变换(FFT)的梯度传递
最近需要在神经网络中构造复数酉矩阵做权重系数,使用了快速傅立叶变换和反变换. 但是FFT不是theano的现成操作模块(有人写过对应的代码,所以应该会很快加进去了),所以想自己去写梯度传递来彻底搞清楚 ...
- 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换
[纯技术帖]为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换来源: 陈诚--WECN的日志 写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,内容 ...
- 傅立叶变换的原理、意义以及如何用Matlab实现快速傅立叶变换
本帖最后由 xiaoliu 于 2011-7-28 21:00 编辑 一.傅立叶变换的由来 关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶变换的描述,但是大都是些故弄玄虚的文章,太过抽象 ...
- 为什么要进行傅立叶变换?如何用Matlab实现快速傅立叶变换?
http://blog.sina.com.cn/s/blog_9015f32301014jbp.html 写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在 ...
- 快速傅立叶变换的C语言实现方法
转自:http://www.beamsky.com/fft-c-language/ 傅立叶变换的重要性不用我说,想必大家也很清楚,有了傅立叶变换,我们就可以从信号的频域特征去分析信号.尤其在无线通信系 ...
- 线性代数28——复矩阵和快速傅立叶变换
原文 | https://mp.weixin.qq.com/s/YzPoPnRb-gEm_EiV9et0TA 实矩阵也可能碰到复特征值,因此无可避免地在矩阵运算中碰到复数. 矩阵当然也有可能包含复数, ...
最新文章
- 【校招面试 之 C/C++】第16题 C++ new和delete的实现原理
- 数据结构练习 00-自测1. 打印沙漏(20)
- MYSQL基础----集合函数(count,sun,avg,max,min)
- java json修改_java – 如何编辑,修改嵌套的JSONObject
- 不抓包,如何学得了 TCP
- c语言实参和形参占用存储单元_必须知道的C语言知识细节:函数形参和实参的区别...
- 127.0.0.1 myz.php,XXE漏洞总结 · MYZ’s Blog
- 144显示器只有60_你知道显示器60Hz和144Hz的刷新率差别有多大吗?你没有用过吗?...
- 支付宝APP支付(基于Java实现支付宝APP支付)
- 力扣347. 前 K 个高频元素(JavaScript,堆)
- 智能优化算法:黏菌优化算法 - 附代码
- HAL层三类函数及其作用
- 判断一个数是否为素数(质数) c语言
- 程序读取凡人修仙传热度数据
- 软考高项 : (04)论项目沟通管理
- 解决QFontDatabase: Cannot find font directory XXX/lib/fonts
- SpringBoot实现发送电子邮件
- 决策树与XGBOOST
- 专访趋势科技:全面解析APT攻击过程
- 什么是SPOOLing技术?
热门文章
- 怎么在Linux中telnet服务器,怎么利用Telnet连接Linux服务器
- android vlc eclipse,在Eclipse下导入vlc-android并编译
- 如何以sys用户登录oracle,在Oracle 10g 中如何以sys的身份登录isqlplus页面
- 程序员多数性功能不行_从面试官角度观察到的程序员技能瓶颈,同时给出突破瓶颈的建议...
- 新冠疫苗厂商科兴成立房地产公司?网友:准备打疫苗送房子了?
- 一做就是一天,这一天天的谁受得了
- 为取消大小周而欢呼?字节员工可不那么想...
- 应用监控指标采集器 Prometheus 核心介绍
- 顶级项目管理工具 Top 10
- 从面试官的角度谈谈大数据面试