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() 可以对信号进行频率转换 ...
随机推荐
- 实现num1、num2交换,无中间变量
num1=num1+num2; num2=num1-num2; num1=num1-num2;
- mybatis分享
Mybatis入门 一.Mybatis环境搭建及简单实例 pom.xml mybatis-config.xml <?xml version="1.0" encoding=&q ...
- 在windows上搭建redis集群
一 所需软件 Redis.Ruby语言运行环境.Redis的Ruby驱动redis-xxxx.gem.创建Redis集群的工具redis-trib.rb 二 安装配置redis redis下载地址 ...
- StringBuilder String string.Concat 字符串拼接速度
首先看测试代码: public class StringSpeedTest { "; public string StringAdd(int count) { string str = st ...
- Canvas:橡皮筋线条绘制
Canvas:橡皮筋线条绘制 效果演示 实现要点 事件监听 [说明]: 在Canvas中检测鼠标事件是非常简单的,可以在canvas中添加一个事件监听器,当事件发生时,浏览器就会调用这个监听器. 我们 ...
- 144. Binary Tree Preorder Traversal (二叉树前序遍历)
Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...
- netty1---传统IO和NIO的区别
传统IO: package OIO; import java.io.IOException; import java.io.InputStream; import java.net.ServerSoc ...
- Sybase数据库:两个特别注意的地方
Sybase数据库:两个特别注意的地方 一.字段别名 字段别名不能为查询条件中的列名,会导致查询出来的数据不准确:最好字段别名为非列名: 二.更新的表名的大小写 update a set .... s ...
- Mysql 慢查询日志配置
查询日志 1.主配置文件下对添加参数.重启生效. vim /etc/my.cnf 注:主要用于查看开发程序执行时间. 注:log_slow_queries = /tmp/mysql.slow # ...
- CSS3圆盘时钟
在线演示 本地下载