傅立叶变换是把图像从空间域转化到频率域的变换。

空间域

一般的情况下,空间域的图像是f(x,y)=灰度级(0-255),形象一点就是一个二维矩阵,每个坐标对应一个颜色值。

频率域

先介绍几个概念

频率:对于图像来说可以指图像颜色值的梯度,即灰度级的变化速度

幅度:可以简单的理解为是频率的权,即该频率所占的比例

能量=幅度(可能不太准确)

变换结果为F(u,v)

F代表幅度值,u代表x方向的频率,v代表y方向的频率

一般会对变换结果进行一定的处理,以便以图片的形式展现,结果就是幅度值被当作灰度级,亮的地方表示能量高

图像的主要部分集中在低频部分,边界和噪声主要集中在高频部分

由于图像变换的结果原点在边缘部分,不容易显示,所以会将原点移动到中心部分。

那么结果便是中间一个亮点朝着周围发散开来,越远离中心位置的能量越低(越暗)。

接下来展示一下代码

  1. #include<opencv2/opencv.hpp>
  2. #include<iostream>
  3. using namespace std;
  4. using namespace cv;
  5. int main(int a,char **p)
  6. {
  7. Mat input=imread(p[1],CV_LOAD_IMAGE_GRAYSCALE);//以灰度图像的方式读入图片
  8. //如果不知到怎么传入p[1]。可以改为
  9. //Mat input=imread(“image.jpg”,CV_LOAD_IMAGE_GRAYSCALE); 
  10. imshow(“input”,input);//显示原图
  11. int w=getOptimalDFTSize(input.cols);
  12. int h=getOptimalDFTSize(input.rows);//获取最佳尺寸,快速傅立叶变换要求尺寸为2的n次方
  13. Mat padded;
  14. copyMakeBorder(input,padded,0,h-input.rows,0,w-input.cols,BORDER_CONSTANT,Scalar::all(0));//填充图像保存到padded中
  15. Mat plane[]={Mat_<float>(padded),Mat::zeros(padded.size(),CV_32F)};//创建通道
  16. Mat complexIm;
  17. merge(plane,2,complexIm);//合并通道
  18. dft(complexIm,complexIm);//进行傅立叶变换,结果保存在自身
  19. split(complexIm,plane);//分离通道
  20. magnitude(plane[0],plane[1],plane[0]);//获取幅度图像,0通道为实数通道,1为虚数,因为二维傅立叶变换结果是复数
  21. int cx=padded.cols/2;int cy=padded.rows/2;//一下的操作是移动图像,左上与右下交换位置,右上与左下交换位置
  22. Mat temp;
  23. Mat part1(plane[0],Rect(0,0,cx,cy));
  24. Mat part2(plane[0],Rect(cx,0,cx,cy));
  25. Mat part3(plane[0],Rect(0,cy,cx,cy));
  26. Mat part4(plane[0],Rect(cx,cy,cx,cy));
  27. part1.copyTo(temp);
  28. part4.copyTo(part1);
  29. temp.copyTo(part4);
  30. part2.copyTo(temp);
  31. part3.copyTo(part2);
  32. temp.copyTo(part3);
  33. //*******************************************************************
  34. //Mat _complexim(complexIm,Rect(padded.cols/4,padded.rows/4,padded.cols/2,padded.rows/2));
  35. //opyMakeBorder(_complexim,_complexim,padded.rows/4,padded.rows/4,padded.cols/4,padded.cols/4,BORDER_CONSTANT,Scalar::all(0.75));
  36. Mat _complexim;
  37. complexIm.copyTo(_complexim);//把变换结果复制一份,进行逆变换,也就是恢复原图
  38. Mat iDft[]={Mat::zeros(plane[0].size(),CV_32F),Mat::zeros(plane[0].size(),CV_32F)};//创建两个通道,类型为float,大小为填充后的尺寸
  39. idft(_complexim,_complexim);//傅立叶逆变换
  40. split(_complexim,iDft);//结果貌似也是复数
  41. magnitude(iDft[0],iDft[1],iDft[0]);//分离通道,主要获取0通道
  42. normalize(iDft[0],iDft[0],1,0,CV_MINMAX);//归一化处理,float类型的显示范围为0-1,大于1为白色,小于0为黑色
  43. imshow(“idft”,iDft[0]);//显示逆变换
  44. //*******************************************************************
  45. plane[0]+=Scalar::all(1);//傅立叶变换后的图片不好分析,进行对数处理,结果比较好看
  46. log(plane[0],plane[0]);
  47. normalize(plane[0],plane[0],1,0,CV_MINMAX);
  48. imshow(“dft”,plane[0]);
  49. waitKey(100086110);
  50. return 0;
  51. }

运行结果

接下来介绍一下运行结果

左边到右边,第一副图像是原图,第二图是幅值图,第三副图是逆变换后的结果

幅值图,结果和预料的一样

逆变换的结果显示,多了一圈黑边,这是因为填充后的结果

            </div>

opencv 傅立叶变换及其逆变换实例及其理解1相关推荐

  1. OpenCV离散傅立叶变换DFT的实例(附完整代码)

    OpenCV离散傅立叶变换DFT的实例 OpenCV离散傅立叶变换DFT的实例 OpenCV离散傅立叶变换DFT的实例 #include "opencv2/core.hpp" #i ...

  2. 用Matlab编程实现图像的傅立叶变换和逆变换并显示出来

    用Matlab编程实现图像的傅立叶变换和逆变换并显示出来 % 用Matlab编程实现图像的傅立叶变换并显示出来 % 可进行傅立叶变换和逆变换恢复 clear all close all clc I=i ...

  3. 离散傅立叶变换与逆变换

    一.怎样为一副图像增加一个通道 Mat A=(Mat_<double>(3,3)<<1,2,3,4,5,6,7,8,9);Mat B=Mat::zeros(A.size(),A ...

  4. OpenCV傅立叶变换

    对图像进行傅立叶变换 首先按列(或者按行)进行傅立叶变换,得到一个变换的矩阵,然后再对变换的矩阵按行(或者按列)进行傅立叶变换,从而每个像素点可以得到一个复数相对应. 具体的代码流程: 第一步将读入的 ...

  5. opencv实现快速傅立叶变换和逆变换

    原文: http://www.tuicool.com/articles/VB3UNjf 说实话觉得网上很多人转载的文章的挺坑的,全部是opencv文档程序的翻译,看来看去都是那一 篇,真的没啥意思. ...

  6. 数字信号处理FFT快速傅立叶变换MATLAB实现——实例

    今天做作业的时候发现要对一个信号进行FFT变换,在网上找了半天也没找到个能看懂的(因为我太菜了),后来自己研究了一下,感觉一知半解的 起因是这道作业题 例题-满足奈奎斯特 我画了两个图,一个是原信号经 ...

  7. 傅立叶变换(Fourier Transform)分析理解

    引言 关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶变换的描述,但是大都是些故弄玄虚的文章,太过抽象,尽是一些让人看了就望而生畏的公式的罗列,让人很难能够从感性上得到理解,最近,我偶尔从 ...

  8. 理解离散傅立叶变换(一)——傅立叶变换的由来

    理解离散傅立叶变换(一) --傅立叶变换的由来 关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶变换的描述,但是大都是些故弄玄虚的文章,太过抽象,尽是一些让人看了就望而生畏的公式的罗列,让 ...

  9. 理解离散傅立叶变换(一)

    理解离散傅立叶变换(一) ------傅立叶变换的由来 关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶变换的描述,但是大都是些故弄玄虚的 文章,太过抽象,尽是一些让人看了就望而生畏的公式 ...

最新文章

  1. CTO怒了:“如果中台不省钱,我建个屁中台啊!”
  2. 主题模型(topic models)总结
  3. 全国大学生智能汽车竞赛浙江赛区选拔赛疫情防控工作预案
  4. 台式计算机l小时耗电,电脑一天的耗电量是多少?不算不知道 一算吓一跳!
  5. cento7.6安装kubernetes1.14.1
  6. Kubernetes Nginx Ingress教程
  7. strconv---用来基本类型之间的转换
  8. python画画用哪库好_数据可视化哪款工具更好用?对比7款Python 数据图表工具的性能...
  9. 专科学数控还是计算机,盘点适合专科男生学的专业 哪些专业好就业
  10. 安装更新Lenovo Solution Center更新失败!具体问题看内容!要是等官方技术人员解决,估计要等上好一段时间!...
  11. python爬取热门新闻每日排行_用python查看百度搜索中今日热点事件排行榜
  12. 教你用JAVA写个小游戏
  13. 不想从零开始做分析?Smartbi Eagle应用商店,一招帮你搞定!
  14. DigitalFilmTools Rays 2.1.2汉化版|丁达尔光束耶稣光滤镜插件
  15. C++ WinHTTP实现文件下载
  16. 基于HPC场景的集群管理系统(slurm系统初相识)
  17. 如何将代码写的更加优雅?
  18. python之父:一个合格的python程序员,应该从这三本书入手!
  19. 如何写互联网产品分析报告
  20. tableau能导出HTML吗,将视图从 Tableau Desktop 导出到另一个应用程序

热门文章

  1. 【科普】通过西方人的姓名判断血统国籍
  2. 数据结构的逻辑结构和物理结构的基本概念
  3. 人力hr管理软件的主要模块有哪些?
  4. 有什么英语翻译器好用?
  5. 除权除息的形成、作用和影响
  6. Android的OnResume()方法
  7. 【180928】WPF扫雷游戏源码
  8. 橘子平台origin安装闪退?
  9. 800个电子竞技设计大赛毕业设计产品开发资料
  10. 【Python 爬虫】简单的网页爬虫