opencv:傅里叶变换
示例代码:
#include <opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
// 1. 以灰度模式读取原始图并显示
Mat srcImage = imread("005.jpg", );
if (!srcImage.data){ printf("input image error ! \n"); return false; }
imshow("原始图", srcImage);
// 2. 将输入图像延展到最佳的尺寸,边界有0填充;
int m = getOptimalDFTSize(srcImage.rows);
int n = getOptimalDFTSize(srcImage.cols); // 以上两个是获得src图像的最佳DFT尺寸
// 将添加的像素初始化为0;
Mat padded;
copyMakeBorder(srcImage, padded, , m - srcImage.rows, , n - srcImage.cols, BORDER_CONSTANT, Scalar::all());
// 3. 为傅里叶变化的结果(实部和虚部)分配储存空间
// 将planes数组组合合并成一个多通道的数组complexI
Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F) };
Mat complexI;
merge(planes, , complexI);
// 4. 进行就地离散傅里叶变换
dft(complexI, complexI);
// 5. 将复数转换为幅值,即log (1+sqrt(Re(DFT(I)^2+IM(DFT(I)^2))
split(complexI, planes); // 多通道分离成几个单通道数组 [0] =Re.. [1] = Im..
magnitude(planes[], planes[], planes[]);
Mat magnitudeImage = planes[];
// 6. 进行尺度log 缩放
magnitudeImage += Scalar::all();
log(magnitudeImage, magnitudeImage); // 求自然对数
// 7. 剪切和重分布幅度象限
// 若有奇数行或者列,进行频谱裁剪
magnitudeImage = magnitudeImage(Rect(, , magnitudeImage.cols&-, magnitudeImage.rows&-));
// 重新排列傅里叶图像中的象限,使得原点位于图像中心
int cx = magnitudeImage.cols / ;
int cy = magnitudeImage.rows / ;
Mat q0(magnitudeImage, Rect(, , cx, cy));
Mat q1(magnitudeImage, Rect(cx, , cx, cy));
Mat q2(magnitudeImage, Rect(, cy, cx, cy));
Mat q3(magnitudeImage, Rect(cx, cy, cx, cy));
//交换象限(左上和右下交换)
Mat tmp;
q0.copyTo(tmp);
q3.copyTo(q0);
tmp.copyTo(q3);
//交换象限(右上和左下)
q1.copyTo(tmp);
q2.copyTo(q1);
tmp.copyTo(q2);
// 8. 归一化 用0到1之间的浮点值将矩阵变换为可是的图像格式
normalize(magnitudeImage, magnitudeImage, , , NORM_MINMAX);
// 9. 显示效果
imshow("频谱幅值", magnitudeImage);
waitKey(); return ;
}
opencv:傅里叶变换的更多相关文章
- C++ Opencv 傅里叶变换的代码实现及关键函数详解
一.前言 最近几天接触了图像的傅里叶变换,数学原理依旧不是很懂,因此不敢在这里妄言.下午用Opencv代码实现了这一变换,有一些经验心得,愿与大家分享. 二.关键函数解析 2.1copyMakeBor ...
- lll
//// whywhy unsigned int T = 1; ~T = 4294967294; T = 2;~T= 4294967293 ;T = 0;~T=4294967295; int T = ...
- OpenCV基于傅里叶变换进行文本的旋转校正
傅里叶变换可以用于将图像从时域转换到频域,对于分行的文本,其频率谱上一定会有一定的特征,当图像旋转时,其频谱也会同步旋转,因此找出这个特征的倾角,就可以将图像旋转校正回去. 先来对原始图像进行一下傅里 ...
- Opencv 实现图像的离散傅里叶变换(DFT)、卷积运算(相关滤波)
我是做Tracking 的,对于速度要求非常高.发现傅里叶变换能够使用. 于是学习之. 核心: 最根本的一点就是将时域内的信号转移到频域里面.这样时域里的卷积能够转换为频域内的乘积! 在分析图像信号的 ...
- Python下opencv使用笔记(十)(图像频域滤波与傅里叶变换)
前面以前介绍过空间域滤波,空间域滤波就是用各种模板直接与图像进行卷积运算,实现对图像的处理,这个方案直接对图像空间操作,操作简单.所以也是空间域滤波. 频域滤波说究竟终于可能是和空间域滤波实现相同的功 ...
- opencv 3 core组件进阶(3 离散傅里叶变换;输入输出XML和YAML文件)
离散傅里叶变换 #include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" ...
- OpenCV.Net基于傅里叶变换进行文本的旋转校正
本文描述一种利用OpenCV及傅里叶变换识别图片中文本旋转角度并自动校正的方法,由于对C#比较熟,因此本文将使用OpenCVSharp. 文章参考了http://johnhany.net/2013/1 ...
- Python下opencv使用笔记(图像频域滤波与傅里叶变换)
Python下opencv使用笔记(图像频域滤波与傅里叶变换) 转载一只程序喵 最后发布于2018-04-06 19:07:26 阅读数 1654 收藏 展开 本文转载自 https://blog ...
- Opencv笔记(二十一)——傅里叶变换
参考 Numpy 中的傅里叶变换 首先我们看看如何使用 Numpy 进行傅里叶变换.Numpy 中的 FFT 包可以帮助我们实现快速傅里叶变换.函数 np.fft.fft2() 可以对信号进行频率转换 ...
随机推荐
- 【我的Android进阶之旅】解决strings.xml格式化占位符错误: Multiple substitutions specified in non-positional format
今天有一个Android新手使用strings.xml进行格式化的时候报了占位符错误, Multiple substitutions specified in non-positional forma ...
- Linux(2)- linux目录结构、shell基本命令
一.Linux之文档与目录结构 1.Linux文件系统结构 Linux目录结构的组织形式和Windows有很大的不同.Linux没有“盘(如C盘.D盘.E盘)”的概念,而是建立一个根"/&q ...
- Acheron一期SVN地址
svn://10.0.0.100/project/Acheron/2.0/SourceCode tailf 命令 http://web2py.com/books/default/chapter/29/ ...
- 用Kotlin开发Android的Hello Kotlin!!
1 创建新项目 android studio 新建一个项目 只有一个空MainActivity 2 安装kotlin file-seeting-plugins-install jetbrains pl ...
- nginx限制连接
limit_conn_zone $binary_remote_addr zone=addr:10m; locaton /download { limit_rate_after 128k; #是对每个连 ...
- go——接口(二)
多态是指代码可以根据类型的具体实现采取不同行为的能力. 如果一个类型实现了某个接口,所有使用这个接口的地方,都可以支持这种类型的值. 标准库里有很好的例子,如io包里实现的流式处理接口. io包提供了 ...
- oracle 建立新的表空间
创建数据表空间 注意粗斜体部分 create tablespace 表空间名称logging datafile 'D:\app\Administrator\oradata\orcl\XXXX.dbf' ...
- jsp验证正则表达式
jsp验证正则表达式 下面都是我收集的一些比较常用的正则表达式,因为平常可能在表单验证的时候,用到的比较多.特发出来,让各位朋友共同使用.呵呵. 匹配中文字符的正则表达式: [u4e00-u9fa5] ...
- hibernate 关联关系
<hibernate-mapping package="com.srts.system.domain"> <class name="Sys_UserRo ...
- linux命令详解之(at)
在Linux下,有两个命令可以用来作为计划任务而执行,at:一次性定时任务计划执行crontab :每天定时任务计划执行 以下仅说一下一次性任务计划执行(at)要使用一次性任务计划,linux必须要有 ...