【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.hqwc.cn/news/599718.html

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

相关文章

深入Linux设备模型:开发者指南

Linux的设备模型是操作系统管理硬件设备的一种高级抽象&#xff0c;它不仅涉及到设备驱动程序的加载和卸载&#xff0c;还包括设备之间的关系、设备的状态管理以及与用户空间通信的机制。理解Linux的设备模型对于应用开发人员来说至关重要&#xff0c;它有助于开发出更加稳定、…

身份证实名认证接口的价格一般是多少呢?基于PHP身份核验接口

身份证实名认证接口分为身份证二要素、三要素、三要素人像核验接口&#xff0c;被广泛的应用于婚恋、交友、电商等等一系列行业领域&#xff0c;身份证实名认证需要实时数据&#xff0c;对于数据源来说也需要可靠&#xff0c;那么&#xff0c;身份证实名认证的价格是不是很贵呢…

故障诊断 | 一文解决,GCN图卷积神经网络模型的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,GCN图卷积神经网络模型的故障诊断(Matlab) 模型描述 GCN(Graph Convolutional Network)是一种基于图结构数据进行卷积操作的神经网络模型。它在处理图数据上展现了很好的性能,特别适用于节点分类、图分类和图生成等任务。 GCN模…

MySQL - MySQL数据库的事务(一)

1. 回顾一下MySQL运行时多个事务同时执行是什么场景 平时我们执行增删改的时候,无非就是从磁盘加载数据页到buffer pool的缓存页里去,对缓存页进行更新,同时记录下来undo log回滚日志和redo log重做日志,应该的是事务提交之后MySQL挂了恢复数据的场景,以及事务回滚的场景…

基于Springboot4S店车辆管理系统

采用技术 基于Springboot4S店车辆管理系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 管理员功能 首页 销售员管理 维修员管理 客户管理 供应…

Golang学习笔记

Golang学习笔记 安装Golang 来源&#xff1a;linux 安装 golang - 知乎 (zhihu.com) 由于我用的是linux系统&#xff0c;所以本文采用linux的安装方式介绍&#xff0c;如果你使用的是Windows/Mac 也可以看下该文章&#xff0c;或者自己去下列地址进行操作。 Download and in…

蓝牙学习十(扫描)

一、简介 从之前的文章中我们知道&#xff0c;蓝牙GAP层定义了四种角色&#xff0c;广播者&#xff08;Broadcaster&#xff09;、观察者&#xff08;Observer&#xff09;、外围设备&#xff08;Peripheral&#xff09;、中央设备&#xff08;Central&#xff09;。 之前的学习…

蓝桥杯 历届真题 双向排序【第十二届】【省赛】【C组】

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 改了半天只有60分&#xff0c;还是超时&#xff0c;还不知道怎么写&#xff0c;后面再看吧┭┮﹏┭┮ #include<bits/stdc.h> …

目标跟踪——行人检测数据集

一、重要性及意义 目标跟踪和行人检测是计算机视觉领域的两个重要任务&#xff0c;它们在许多实际应用中发挥着关键作用。为了推动这两个领域的进步&#xff0c;行人检测数据集扮演着至关重要的角色。以下是行人检测数据集的重要性及意义的详细分析&#xff1a; 行人检测数据…

24.4.7周报

星期一&#xff1a; 再学kmp&#xff0c;学的最明白的一次 贴道kmp的题 洛谷传送门 思路&#xff1a;答案为n-ne【n】&#xff0c;把字符串画两遍理解一下 思路&#xff1a;最长周期&#xff0c;复制一遍过后要求覆盖原字符串&#xff0c;及字符串中…

《价值》-张磊-高瓴资本-5-投资是一场修行;坚持第一性原理;避开陷阱;信誉就是生命

第五章&#xff1a;价值投资者的自我修养 价值投资不是投资者之间的零和游戏&#xff0c;而是共同把蛋糕做大的正和游戏。 从事投资的过程中&#xff0c;我渐渐发觉&#xff0c;投资 一方面是对真理的探寻&#xff0c;探索外部世界&#xff1b;另一方面是谋求心灵的宁静&#x…

Mysql的物理文件

1.Windows下面的配置文件是&#xff1a;my.ini [mysql] default-character-setutf8[mysqld] port3306 default_authentication_pluginmysql_native_password basedirE:/phpStudy/phpstudy_pro/Extensions/MySQL8.0.12/ datadirE:/phpStudy/phpstudy_pro/Extensions/MySQL8.0.1…