原文: 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实现快速傅立叶变换和逆变换相关推荐

  1. opencv 傅立叶变换及其逆变换实例及其理解1

    傅立叶变换是把图像从空间域转化到频率域的变换. 空间域 一般的情况下,空间域的图像是f(x,y)=灰度级(0-255),形象一点就是一个二维矩阵,每个坐标对应一个颜色值. 频率域 先介绍几个概念 频率 ...

  2. 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换?

    https://www.douban.com/note/164400821/ 写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在此向多位原创作者致敬!!! ...

  3. 【转】为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换?...

    写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在此向多位原创作者致敬!!!一.傅立叶变换的由来关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶 ...

  4. 神经网络中快速傅立叶变换(FFT)的梯度传递

    最近需要在神经网络中构造复数酉矩阵做权重系数,使用了快速傅立叶变换和反变换. 但是FFT不是theano的现成操作模块(有人写过对应的代码,所以应该会很快加进去了),所以想自己去写梯度传递来彻底搞清楚 ...

  5. 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换

    [纯技术帖]为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换来源: 陈诚--WECN的日志 写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,内容 ...

  6. 傅立叶变换的原理、意义以及如何用Matlab实现快速傅立叶变换

    本帖最后由 xiaoliu 于 2011-7-28 21:00 编辑 一.傅立叶变换的由来 关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶变换的描述,但是大都是些故弄玄虚的文章,太过抽象 ...

  7. 为什么要进行傅立叶变换?如何用Matlab实现快速傅立叶变换?

    http://blog.sina.com.cn/s/blog_9015f32301014jbp.html 写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在 ...

  8. 快速傅立叶变换的C语言实现方法

    转自:http://www.beamsky.com/fft-c-language/ 傅立叶变换的重要性不用我说,想必大家也很清楚,有了傅立叶变换,我们就可以从信号的频域特征去分析信号.尤其在无线通信系 ...

  9. 线性代数28——复矩阵和快速傅立叶变换

    原文 | https://mp.weixin.qq.com/s/YzPoPnRb-gEm_EiV9et0TA 实矩阵也可能碰到复特征值,因此无可避免地在矩阵运算中碰到复数. 矩阵当然也有可能包含复数, ...

最新文章

  1. 【校招面试 之 C/C++】第16题 C++ new和delete的实现原理
  2. 数据结构练习 00-自测1. 打印沙漏(20)
  3. MYSQL基础----集合函数(count,sun,avg,max,min)
  4. java json修改_java – 如何编辑,修改嵌套的JSONObject
  5. 不抓包,如何学得了 TCP
  6. c语言实参和形参占用存储单元_必须知道的C语言知识细节:函数形参和实参的区别...
  7. 127.0.0.1 myz.php,XXE漏洞总结 · MYZ’s Blog
  8. 144显示器只有60_你知道显示器60Hz和144Hz的刷新率差别有多大吗?你没有用过吗?...
  9. 支付宝APP支付(基于Java实现支付宝APP支付)
  10. 力扣347. 前 K 个高频元素(JavaScript,堆)
  11. 智能优化算法:黏菌优化算法 - 附代码
  12. HAL层三类函数及其作用
  13. 判断一个数是否为素数(质数) c语言
  14. 程序读取凡人修仙传热度数据
  15. 软考高项 : (04)论项目沟通管理
  16. 解决QFontDatabase: Cannot find font directory XXX/lib/fonts
  17. SpringBoot实现发送电子邮件
  18. 决策树与XGBOOST
  19. 专访趋势科技:全面解析APT攻击过程
  20. 什么是SPOOLing技术?

热门文章

  1. 怎么在Linux中telnet服务器,怎么利用Telnet连接Linux服务器
  2. android vlc eclipse,在Eclipse下导入vlc-android并编译
  3. 如何以sys用户登录oracle,在Oracle 10g 中如何以sys的身份登录isqlplus页面
  4. 程序员多数性功能不行_从面试官角度观察到的程序员技能瓶颈,同时给出突破瓶颈的建议...
  5. 新冠疫苗厂商科兴成立房地产公司?网友:准备打疫苗送房子了?
  6. 一做就是一天,这一天天的谁受得了
  7. 为取消大小周而欢呼?字节员工可不那么想...
  8. 应用监控指标采集器 Prometheus 核心介绍
  9. 顶级项目管理工具 Top 10
  10. 从面试官的角度谈谈大数据面试