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() 可以对信号进行频率转换 ...
随机推荐
- Python时间获取详解,Django获取时间详解,模板中获取时间详解(navie时间和aware时间)
1.Python获取到的时间 import pytz from datetime import datetime now = datetime.now() # 这个时间为navie时间(自己不知道自己 ...
- JSONObject和JSONArray 以及Mybatis传入Map类型参数
import org.json.JSONArray;import org.json.JSONObject; 将字符串转化为JSONArray JSONArray jsonArray = new ...
- mysql内置数据库
1 mysql本地连接数据库 >mysql -h localhost -u root -proot 注意-p后面没有空格,是直接跟上密码 或者 >mysql -h localhost ...
- Centos学习笔记2-网络部分
一:修改IP地址:vi /etc/sysconfig/network-scripts/ifcfg-eth0 IPADDR=192.168.80.100 NETMASK=255.255.255.0 GA ...
- DP专题·二
1.hdu 1260 Tickets 题意:有k个人,售票员可以选择一个人卖,或者同时卖给相邻的两个人.问最少的售票时间. 思路:dp[i] = min(dp[i - 1] + singlep[i], ...
- Getting Started with Rails (1)
按照官网http://guides.rubyonrails.org/getting_started.html上学习了一下例子.在过程中有很多刚开始没理解的地方,写下来. 首先,建立了一个resourc ...
- mfc学习---文档视图架构
MFC的AppWizard可以生成三种类型的应用程序:基于对话框的应用.单文档应用(SDI)和多文档应用(MDI). 一般情况下,采用文档/视结构的应用程序至少应由以下对象组成: 1. ...
- Django CRM 数据库增删改查
原文链接 http://www.cnblogs.com/yangmv/p/5327477.html
- json字符串转化为json对象and 对象转化为 json字符串
第一种方法: var data =evel('('+jsonstr+')') 解析: 这种方法是常用的方法, 即动态执行 javascript代码 在堆中存放数据. 存在安全问题. 第二种方法: ...
- QT5.6.0 鼠标支持
QT5用QPA换了QWS之后,USB鼠标就不知道怎么支持,网上搜啊搜,各种尝试,终于可以了. export TSLIB_ROOT=/mnt/sdcard/tslib export TSLIB_PLUG ...