【opencv】示例-dft.cpp 该程序演示了离散傅立叶变换 (dft) 的使用,获取图像的 dft 并显示其功率谱...

3bd0e5ff7d570d6724cb3ca60016b239.png

8ce1ef00f9c6c1245b313c5f25a82604.png

ccc63512b80425fb3b01fadbef119fe3.png

#include "opencv2/core.hpp" // 包含OpenCV核心功能头文件
#include "opencv2/core/utility.hpp" // 包含OpenCV实用程序头文件
#include "opencv2/imgproc.hpp" // 包含OpenCV图像处理头文件
#include "opencv2/imgcodecs.hpp" // 包含OpenCV图像编解码头文件
#include "opencv2/highgui.hpp" // 包含OpenCV高层GUI(图形用户界面)头文件#include <stdio.h> // 包含标准输入输出头文件using namespace cv; // 使用OpenCV命名空间
using namespace std; // 使用标准库命名空间// 帮助信息函数定义
static void help(const char ** argv)
{printf("\nThis program demonstrated the use of the discrete Fourier transform (dft)\n""The dft of an image is taken and its power spectrum is displayed.\n""Usage:\n %s [image_name -- default lena.jpg]\n",argv[0]);
}// 命令行参数的键定义
const char* keys =
{"{help h||}{@image|lena.jpg|input image file}"
};// 主函数入口
int main(int argc, const char ** argv)
{help(argv); // 显示帮助信息CommandLineParser parser(argc, argv, keys); // 创建命令行参数解析器if (parser.has("help")) // 如果有"help"参数{help(argv); // 显示帮助信息return 0; // 正常退出程序}string filename = parser.get<string>(0); // 从命令行获取文件名Mat img = imread(samples::findFile(filename), IMREAD_GRAYSCALE); // 读取图片文件,转换为灰度图if( img.empty() ) // 如果图片为空{help(argv); // 显示帮助信息printf("Cannot read image file: %s\n", filename.c_str()); // 输出错误信息return -1; // 异常退出程序}int M = getOptimalDFTSize( img.rows ); // 获取最优的DFT(离散傅里叶变换)尺寸int N = getOptimalDFTSize( img.cols ); // 获取最优的DFT尺寸Mat padded; // 声明一个新的矩阵用于扩展图像边界// 使用边界拷贝方式将图像扩展到最优DFT尺寸copyMakeBorder(img, padded, 0, M - img.rows, 0, N - img.cols, BORDER_CONSTANT, Scalar::all(0));// 将扩展后的图像分成两个通道,Real和ImaginaryMat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)};Mat complexImg; // 声明一个复数图像矩阵merge(planes, 2, complexImg); // 合并通道dft(complexImg, complexImg); // 对复数图像进行DFT变换// 计算幅度谱的对数表示,用于显示split(complexImg, planes); // 分离通道magnitude(planes[0], planes[1], planes[0]); // 计算幅度Mat mag = planes[0]; // 获取幅度矩阵mag += Scalar::all(1); // 为了避免对数为负无穷做的偏移log(mag, mag); // 计算对数// 如果幅度谱的行或列数是奇数,则裁剪mag = mag(Rect(0, 0, mag.cols & -2, mag.rows & -2));// 重新排列傅里叶图像的象限,使原点位于图像中心int cx = mag.cols/2;int cy = mag.rows/2;Mat tmp; // 临时矩阵// 定义象限矩阵Mat q0(mag, Rect(0, 0, cx, cy));Mat q1(mag, Rect(cx, 0, cx, cy));Mat q2(mag, Rect(0, cy, cx, cy));Mat q3(mag, Rect(cx, cy, cx, cy));// 交换象限(左上与右下互换)q0.copyTo(tmp);q3.copyTo(q0);tmp.copyTo(q3);// 交换象限(右上与左下互换)q1.copyTo(tmp);q2.copyTo(q1);tmp.copyTo(q2);// 对数幅度谱进行归一化到0到1normalize(mag, mag, 0, 1, NORM_MINMAX);// 显示图像幅度谱imshow("spectrum magnitude", mag);waitKey(); // 等待用户按键return 0; // 正常退出程序
}

这段代码是用于演示如何使用离散傅里叶变换(DFT)并显示图像的功率谱。首先,程序定义了简单的帮助信息,解析命令行参数,并尝试加载指定的图像文件。如果加载成功,程序将计算最优的DFT尺寸,对图像进行边缘填补,以满足DFT的最优尺寸要求。之后,程序创建一个复数图像,将其通道合并,并对其执行DFT变换。接下来对变换结果的幅度进行对数转换,以便于显示,并且将幅度矩阵中心移到图像的中心。最后,程序通过imshow显示转换后的图像幅度谱,并通过waitKey等待用户的按键操作。

如何利用图像的功率谱对图像进行增强或减弱?

256700fa69d8435164cd979ee66e1a63.png

有哪些常见的滤波器可以用于图像增强?

d31518d568455b264d393ebac24530e6.png

mag = mag(Rect(0, 0, mag.cols & -2, mag.rows & -2));

e273a7a34d32965ddeba128b819f74d8.png

copyMakeBorder(img, padded, 0, M - img.rows, 0, N - img.cols, BORDER_CONSTANT, Scalar::all(0));

2e1eb507fb490d1ef229beeddfe5010c.png

magnitude(planes[0], planes[1], planes[0]);

cc3590879e1eac1c3267d2c86153980e.png

6c08c078179a64ca4d15ef79d9455537.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/799240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS 学习笔记 总结

CSS 布局方式 • 表格布局 • 元素定位 • 浮动布局&#xff08;注意浮动的负效应&#xff09; • flex布局 • grid布局&#xff08;感兴趣的可以看下菜鸟教程&#xff09; 居中设置 元素水平居中 • 设置宽度后&#xff0c;margin设置为auto • 父容器设置text-alig…

积木报表Excel数据量大导出慢导不出问题、大量数据导不出问题优化方案和分析解决思路(优化前一万多导出失败,优化后支持百万级跨库表导出)

文章目录 积木报表Excel数据量大导出慢导不出问题、大量数据导不出问题优化方案和分析解决思路&#xff08;优化前一万多导出失败&#xff0c;优化后支持百万级跨库表导出&#xff09;优化结果需求背景和解决方案的思考解决方案流程描述&#xff1a;关键代码引入easy excel新建…

Linux云计算之Linux基础3——Linux系统基础2

1、终端 终端(terminal)&#xff1a;人和系统交互的必要设备&#xff0c;人机交互最后一个界面&#xff08;包含独立的输入输出设备&#xff09; 物理终端(console)&#xff1a;直接接入本机器的键盘设备和显示器虚拟终端(tty)&#xff1a;通过软件方式虚拟实现的终端。它可以…

Docker 引擎离线安装包采集脚本

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

基于SSM的宠物管理系统

点击以下链接获取源码: https://download.csdn.net/download/qq_64505944/89076676?spm=1001.2014.3001.5503 技术:SSM(Spring+SpringMVC+MyBatis)+LayUI+Echarts技术栈,分页采用pagehelper插件,EasyExcel进行Excel文件的导入导出。 宠物管理系统 1 CHINER-宠物管理系…

【MYSQL之进阶篇】视图、存储过程、存储函数以及触发器

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 1.视图 1.1 定义 视图是MySQL数据库中的虚拟表&#xff0c;它基于一个或多个实际表的查询结果。视图提供了一种简单的 方法来封装和重用复杂的查询&#xff0c;同时…

MySQL的基本查询

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;MySQL &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容介绍了mysql的基本查询部分的知识&#xff0c;包括Crea…

YOLOv9改进 | 一文带你了解全新的SOTA模型YOLOv9(论文阅读笔记,效果完爆YOLOv8)

官方论文地址&#xff1a; 官方论文地址点击即可跳转 官方代码地址&#xff1a; 官方代码地址点击即可跳转 图1. 在MS COCO数据集上实时对象检测器的比较。基于GELAN和PGI的对象检测方法在对象检测性能方面超越了所有以前的从头开始训练的方法。在准确性方面&#xff0c;新方法…

Go语言实现Redis分布式锁2

项目地址: https://github.com/liwook/Redislock 1.支持阻塞式等待获取锁 之前的是只尝试获取一次锁&#xff0c;要是获取失败就不再尝试了。现在修改为支持阻塞式等待获取锁。 添加LockOptions结构体 添加option.go文件。 在LockOptions中 isBlock表示是否是阻塞模式blo…

配置vscode用于STM32编译,Debug,github上传拉取

配置环境参考&#xff1a; Docs 用cubemx配置工程文件&#xff0c;用VScode打开工程文件。 编译的时候会有如下报错&#xff1a; vscode出现process_begin :CreateProcess failed 系统找不到指定文件 解决方案&#xff1a;在你的makefile中加上SHELLcmd.exe就可以了 参考…

java发送请求-cookie有关代码

在初始化后添加cookie的代码 用这个httpclients类调custom方法&#xff0c;进行代码定制化 找和cookie有关的方法&#xff0c;设置默认的cookie存储信息 入参是接口 将入参粘贴后找方法&#xff0c;用new实现这个接口 这个方法是无参空构造&#xff0c;可以使用 设置了cookie …

【C++】RapidJSON 设置支持 std::string,防止编译报错

问题 rapidjson 创建 json 数据&#xff0c;使用 std::string 字符串进行赋值&#xff0c;编译时&#xff0c;抱一堆错误 .... rapidjson/include/rapidjson/document.h:690:5: note: candidate expects 0 arguments, 1 provided [build] make[2]: *** [main/CMakeFiles/ma…

Betaflight 4.5RC3 AT32F435遇到的一些“怪”现象

Betaflight 4.5RC3 AT32F435遇到的一些“怪”现象 1. 源由2. “怪”现象2.1 电机#4没有RPM转速2.2 遥控器通道10接收机测试失败2.3 OSD 异常2.4 磁力计数据无法获取 3. 参考资料 1. 源由 升级下固件&#xff0c;追下“时髦”&#xff0c;赶下“潮流”&#xff0c;本着“活着就…

MySQL学习路线一条龙

引言 在当前的IT行业&#xff0c;无论是校园招聘还是社会招聘&#xff0c;MySQL的重要性不言而喻。 面试过程中&#xff0c;MySQL相关的问题经常出现&#xff0c;这不仅因为它是最流行的关系型数据库之一&#xff0c;而且在日常的软件开发中&#xff0c;MySQL的应用广泛&#…

蚁剑修改特征性信息

前言 我们首先得知道蚁剑的流量特征&#xff1a; 编码器和解码器的特征&#xff1a;蚁剑自带的编码器和解码器具有明显的特点&#xff0c;可以通过更改配置文件来达到流量加密的目的1。例如&#xff0c;蚁剑支持多种编码方式&#xff0c;如base64、chr、rot13等&#xff0c;这…

LLM 构建Data Multi-Agents 赋能数据分析平台的实践之②:数据治理之二(自动处理)

前述 在前文的multi Agents for Data Analysis的设计说起&#xff0c;本文将继续探索和测试借助llm实现基于私有知识库的数据治理全自动化及智能化。整体设计如下&#xff1a; 整个体系设计了3个Agent以及一个Planer&Execute Agent&#xff0c;第一个Agent用于从企业数据…

【Linux系列】“dev-node1“ 运行的操作系统分析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Vue3与TypeScript中动态加载图片资源的解决之道

在前端开发中&#xff0c;Vue.js已成为一个备受欢迎的框架&#xff0c;尤其是在构建单页面应用时。Vue3的发布更是带来了许多性能优化和新特性&#xff0c;而TypeScript的加入则进一步提升了代码的可维护性和健壮性。然而&#xff0c;在实际的项目开发中&#xff0c;我们有时会…

牛客NC93 设计LRU缓存结构【hard 链表,Map Java】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/5dfded165916435d9defb053c63f1e84 思路 双向链表map最新的数据放头结点&#xff0c;尾节点放最老的数据&#xff0c;没次移除尾巴节点本地考察链表的新增&#xff0c;删除&#xff0c;移动节点参考答案Java im…

第六篇: 3.5 性能效果 (Performance)- IAB/MRC及《增强现实广告效果测量指南1.0》

​​​​​​​ 翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇 广告效果测量定义和其他矩阵之- 3.1 广告印象&#xff08;AD Impression&#xff09;第三篇 广告效果测量定义和其他矩阵之- 3.2 可见性 &#xff08;Viewability…