OpenCV示例学习(七):离散傅里变换(DFT)算子:getOptimalDFTSize(),copyMakeBorder(),magnitude(),log(),normalize()
OpenCV示例学习(七):离散傅里变换(DFT)算子:getOptimalDFTSize(),copyMakeBorder(),magnitude(),log(),normalize()
#include <opencv2/opencv.hpp>using namespace cv;int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);//【1】以灰度模式读取原始图像并显示Mat srcImage = imread("F:/C++/2. OPENCV 3.1.0/TEST/2.jpg", 0);if (!srcImage.data) { printf("读取图片错误,请确定目录下是否有imread函数指定图片存在~! \n"); return false; }imshow("原始图像", srcImage);//【2】将输入图像延扩到最佳的尺寸,填充边界(用0)// 返回给定向量尺寸的傅里叶最有尺寸大小 m,nint m = getOptimalDFTSize(srcImage.rows);int n = getOptimalDFTSize(srcImage.cols);//将添加的像素初始化为0.// 扩充图像边界://top +=0;button+=(m - srcImage.rows)//left +=0;right +=(n - srcImage.cols)Mat padded;copyMakeBorder(srcImage, padded, 0, m - srcImage.rows, 0, n - srcImage.cols, BORDER_CONSTANT, Scalar::all(0));//imshow("src",srcImage);//【3】为傅立叶变换的结果(实部和虚部)分配存储空间。// 傅里叶变换的结果是复数,对于每个原图像值,结果会有两个图像值。// 此外,频域范围远远超过空间值范围,因此要将频域储存在 float 格式中。// 多加额外通道储存复数部分。Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F) };Mat complexI;//将planes数组组合合并成一个多通道的数组complexImerge(planes, 2, complexI);//【4】进行就地离散傅里叶变换(输入输出均为同一图像)// 此图像有两个通道,分辨储存dft(complexI, complexI);//【5】将复数转换为幅值M,即// =>M=sqrt(Re(DFT(I))^2 + Im(DFT(I))^2)// 将多通道数组complexI分离成几个单通道数组,// planes[0] = Re(DFT(I), planes[1] = Im(DFT(I))split(complexI, planes);magnitude(planes[0], planes[1], planes[0]);// planes[0] = magnitude//【6】进行对数尺度(logarithmic scale)缩放:// 傅里叶变换幅度值范围大到不适合于屏幕显示(高值白点,低值黑点)// 为了凸显高低值变化的连续性,我们用对数尺度替换线性尺度,即// =>M1=log(1 +M)Mat magnitudeImage = planes[0];magnitudeImage += Scalar::all(1);log(magnitudeImage, magnitudeImage);//求自然对数//【7】剪切和重分布幅度图象限//若有奇数行或奇数列,进行频谱裁剪magnitudeImage = magnitudeImage(Rect(0, 0, magnitudeImage.cols & -2, magnitudeImage.rows & -2));//重新排列傅立叶图像中的象限,使得原点位于图像中心int cx = magnitudeImage.cols / 2;int cy = magnitudeImage.rows / 2;Mat q0(magnitudeImage, Rect(0, 0, cx, cy)); // ROI区域的左上Mat q1(magnitudeImage, Rect(cx, 0, cx, cy)); // ROI区域的右上Mat q2(magnitudeImage, Rect(0, cy, cx, cy)); // ROI区域的左下Mat q3(magnitudeImage, Rect(cx, cy, cx, cy)); // ROI区域的右下//交换象限(左上与右下进行交换)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, 0, 1, NORM_MINMAX);//【9】显示效果图imshow("频谱幅值", magnitudeImage);waitKey();return a.exec();
}
OpenCV示例学习(七):离散傅里变换(DFT)算子:getOptimalDFTSize(),copyMakeBorder(),magnitude(),log(),normalize()相关推荐
- OpenCV示例学习(二): 基本图形绘制算子:line(),circle(),fillPoly(), ellipse()
OpenCV示例学习(二): 基本图形绘制算子:line(),circle(),fillPoly(), ellipse() #include <opencv2/opencv.hpp>usi ...
- OpenCV与图像处理学习七——传统图像分割之阈值法(固定阈值、自适应阈值、大津阈值)
OpenCV与图像处理学习七--传统图像分割之阈值法(固定阈值.自适应阈值.大津阈值) 一.固定阈值图像分割 1.1 直方图双峰法 1.2 OpenCV中的固定阈值分割 二.自动阈值图像分割 2.1 ...
- OpenCV 【十七】离散傅立叶变换
目录 1 key 2 原理 3 实例 3代码 4运行结果 5应用举例 1 key 什么是傅立叶变换及其应用? 如何使用OpenCV提供的傅立叶变换? 相关函数的使用,如: copyMakeBorder ...
- OpenCV离散傅立叶变换DFT的实例(附完整代码)
OpenCV离散傅立叶变换DFT的实例 OpenCV离散傅立叶变换DFT的实例 OpenCV离散傅立叶变换DFT的实例 #include "opencv2/core.hpp" #i ...
- 离散哈特莱变换(DHT)及快速哈特莱变换(FHT)学习
离散哈特莱变换(DHT)及快速哈特莱变换(FHT)学习 说在前边 最近复习\(DSP\)的时候,发现了一个号称专门针对离散实序列的变换,经分析总运算量为普通\(FFT\)的几乎一半,而且完全没有复数. ...
- 数字信号处理学习笔记[0] 连续信号的频谱和傅氏变换
文章目录 绪论 1 连续信号的频谱和傅氏变换 1.1 有限区间上连续信号的傅氏级数和离散频谱 1.2 傅氏变换,连续信号与频谱 1.2.3 频谱的基本性质 实际应用举例 习题 绪论 Q: 举例说明&q ...
- opencv 图像去噪学习总结
OpenCV图像处理篇之图像平滑 图像平滑算法 程序分析及结果 图像平滑算法 图像平滑与图像模糊是同一概念,主要用于图像的去噪.平滑要使用滤波器,为不改变图像的相位信息, 一般使用线性滤波器,其统一形 ...
- OpenCV 图像处理学习手册:1~5
原文:Learning Image Processing with OpenCV 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 计算机视觉 译文集],采用译后编辑(MT ...
- opencv进阶学习笔记13:图像形态学操作大全(膨胀,腐蚀,开闭,黑帽,顶帽,梯度)python版
基础版学习笔记: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 基础版形态学: opencv学 ...
最新文章
- C#中转义字符[转]
- 编程面试题:编写一个会造成数据库死锁的应用
- 关于SpringCloud、SpringBoot 希望这是说得最详细的
- junit junit_JUnit理论简介
- 王小云:连破两套美国顶级密码,获得711万奖励,美国不淡定了
- height:calc(100% - 10px)的用法(垂直居中) - 布局篇
- c# winform 点击按钮切换tabcontrol标签
- 滴滴顺风车回归倒计时!
- Java Platform SE 8(Java概念图的描述)中文文档
- Linux下的tar命令
- 软件测试--移动应用主要针对软测比赛(教程)
- opencv4下使用SVM进行简单颜色分类
- 如何查看自己的外网 IP 地址
- 【Python】PDF转图片
- Java 读取Word文本框中的文本/图片/表格
- java项目大鱼吃小鱼
- Windows10与Ubuntu双系统安装记录
- 华为手机如何简单、快捷地投屏到电视机上?
- 解决谷歌浏览器:Flash插件初始化失败,请更新您的FlashPlayer版本之后重试!
- (c++)五分制成绩(函数实现)