【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-宠物管理系…

opencv直方图

在OpenCV中&#xff0c;直方图是一个重要的图像分析工具&#xff0c;它可以提供关于图像亮度分布的详细信息。OpenCV提供了多种方法来计算和操作图像的直方图。 基本概念 直方图是一个离散函数&#xff0c;它将图像中的像素值映射到一个连续的区间上&#xff0c;并计算每个区…

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

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

如何在Windows环境设置pip镜像地址?

在Windows上&#xff0c;你可以通过以下步骤设置pip的镜像&#xff1a; 在你的用户目录下创建一个名为pip的文件夹。你可以在命令行中输入以下命令来完成这个步骤&#xff1a; mkdir %USERPROFILE%\pip在pip文件夹中创建一个名为pip.ini的文件。你可以在命令行中输入以下命令来…

MySQL的基本查询

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

mysql知识点

MySQL 中有哪几种锁 表级锁&#xff1a;开销小&#xff0c;加锁快&#xff1b;不会出现死锁&#xff1b;锁定粒度大&#xff0c;发生锁冲突的概率最高&#xff0c;并发度最低。行级锁&#xff1a;开销大&#xff0c;加锁慢&#xff1b;会出现死锁&#xff1b;锁定粒度最小&…

挑战30天C++基本入门(DAY12--深搜搜索树)(代码模板)

#前面我们已经把深度优先搜索给传授给了各位&#xff0c;接下来我们进行深搜搜索树的学习啦 加入有这样一道题&#xff1a;现在有n个数&#xff0c;我们从中选取k个数字&#xff0c;要求所选择k个数字之和为S。 我们这样思考&#xff0c;我们对于一个数字只有两种可能&#x…

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

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

【leetcode面试经典150题】17.罗马数字转整数(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

Go语言实现Redis分布式锁2

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

从mp4、flv、ts文件中提取出AVC(h264)

分别从封装格式为mp4、flv、ts文件中提取出AVC(h264)并写入文件 /*****************************************************************//*** \file WriteAVC.cpp* \brief 提取视频中的视频流&#xff0c;写入为AVC(h264)文件* * \author 13648* \date April 2024*******…

【深度学习】Progressive Distillation for Fast Sampling of Diffusion Models

论文&#xff1a;https://arxiv.org/abs/2202.00512v2 这篇论文提出了一种"渐进式蒸馏"(Progressive Distillation)的方法,来大幅降低用于生成对抗网络(GAN)的扩散模型(Diffusion Model)在推理阶段的采样步数,从而提高其推理效率。主要贡献有: 提出了一种新的扩散模…

配置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…

C语言:输入输出专题

本专题使用C环境代码均为Linux系统下的ubuntu&#xff0c;所有测试结果仅供参考。 标准IO&#xff0c;文件IO专题 sanf函数 #include <stdio.h> #include <stdlib.h> #define STRSIZE 3 /* 输入函数int scanf(const char *format,...); 地址表返回输出成功的个数…