opencv c++ 图像梯度、边缘、锐化

news2024/11/28 4:52:18

图像梯度的目的:

获取图像上沿着某一方向或多个方向上,像素值的突变图像。

即:

对满足x_{1},x_{2},...,x_{n}之间相互独立的函数,f\left ( x_{1},...,x_{n} \right )

f'(x_{1})+...+f'(x_{n})

1、预备知识

1.1、常见的梯度计算算子

 1.2、梯度计算方法

L2法:

 L1法:

 1.3如何获取梯度图像

分别使用x、y方向的算子来获取Gx,Gy,然后选用梯度计算方法来获取对应像素点的梯度值。

2、代码示例

2.1robot算子

void self_conv(Mat& image)
{
	//robot 梯度计算
	Mat robot_x = (Mat_<int>(2, 2) << 1, 0, 0, -1);//自定义Mat核
	Mat robot_y = (Mat_<int>(2, 2) << 0, 1, -1, 0);
	Mat grad_x,grad_y;
	filter2D(image, grad_x, CV_32F, robot_x, Point(-1, -1), 0, BORDER_DEFAULT);
	filter2D(image, grad_y, CV_32F, robot_y, Point(-1, -1), 0, BORDER_DEFAULT);
	convertScaleAbs(grad_x, grad_x);//该API将图像格式转为CV_8U格式,并将所有像素值置为正。
	convertScaleAbs(grad_y, grad_y);
	Mat result;
	add(grad_x, grad_y, result);
	namedWindow("robot img", WINDOW_FREERATIO);
	imshow("robot img", result);
}

2.2sobel算子

注:也可仿照robot算子示例输入3×3的卷积核,并赋予对应的sobel值进行梯度图像获取 。

opencvAPI调用示例:

void self_conv(Mat& image)
{
	
	Mat grad_x,grad_y;
	Sobel(image, grad_x, CV_32F, 1, 0);
	Sobel(image, grad_y, CV_32F, 0, 1);
	convertScaleAbs(grad_x, grad_x);//该API将图像格式转为CV_8U格式,并将所有像素值置为正。
	convertScaleAbs(grad_y, grad_y);
	Mat result2;
	//add(grad_x, grad_y, result2);
	addWeighted(grad_x, 0.5, grad_y, 0.5, 0, result2);
	namedWindow("sobel img", WINDOW_FREERATIO);
	imshow("sobel img", result2);
}

2.3Scharr算子

void self_conv(Mat& image)
{
	
	Mat grad_x,grad_y;
	Scharr(image, grad_x, CV_32F, 1, 0);
	Scharr(image, grad_y, CV_32F, 0, 1);
	convertScaleAbs(grad_x, grad_x);//该API将图像格式转为CV_8U格式,并将所有像素值置为正。
	convertScaleAbs(grad_y, grad_y);
	Mat result3;
	//add(grad_x, grad_y, result2);
	addWeighted(grad_x, 0.5, grad_y, 0.5, 0, result3);
	namedWindow("Scharr img", WINDOW_FREERATIO);
	imshow("Scharr img", result3);
}

结果:

3、拉普拉斯算子进行边缘获取、锐化

即二阶导数的图像应用。

3.1、拉普拉斯算子与锐化算子

拉普拉斯算子:

分别为: 四邻域算子、八邻域算子、变种算子。

拉普拉斯算子缺点:当图像细节较多时,难以去除这些细节的影响,需要与图像阈值化进行搭配使用。

锐化算子:原图加上拉普拉斯算子的结果,本质为图像增强。

 3.2、代码示例

拉普拉斯:

void Laplacian_demo(Mat& image)
{
	Mat dst;
	Laplacian(image, dst, -1, 3, 1.0, 0, BORDER_DEFAULT);
	namedWindow("Laplacian", WINDOW_FREERATIO);
	imshow("Laplacian", dst);
}

 锐化:

由于没有现有的API,下列代码由filter2D加上自定义Mat方法实现。

void QuickDemo::image_descent(Mat& image)
{
	//定义锐化算子
	Mat sharp = (Mat_<int>(3, 3) << 0, -1, 0,
									-1, 5, -1,
									0, -1, 0);
	Mat result;
	filter2D(image, result, -1, sharp, Point(-1, -1), 0, BORDER_DEFAULT);
	convertScaleAbs(result, result);
	namedWindow("sharp img", WINDOW_FREERATIO);
	imshow("sharp img", result);
}

4、USM(unsharp mask)锐化

权重化减法锐化公式:

 sharp_img = α×blur - β×laplacian

优点:忽视细小细节着重对有用部分边缘进行锐化。

void usm_sharp(Mat& image)
{
	Mat blur_img, lap_img;
	GaussianBlur(image, blur_img, Size(3, 3), 0, 0, BORDER_DEFAULT);
	Laplacian(image, lap_img, -1, 1, 1.0, 0, BORDER_DEFAULT);
	Mat usm_img;
	addWeighted(blur_img, 1, lap_img, -0.7, 0, usm_img, -1);
	namedWindow("usm_sharp img", WINDOW_FREERATIO);
	imshow("usm_sharp img", usm_img);

}

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

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

相关文章

Packet Tracer - 比较 2960 和 3560

目标 第 1 部分&#xff1a;比较第 2 层和第 3 层交换机 第 2 部分&#xff1a;比较第 3 层交换机和路由器 拓扑图 背景信息 在本练习中&#xff0c;您将使用各种命令检查三种不同的交换拓扑&#xff0c;并且比较 2960 和 3560 交换机之间的异同。 您还将比较 1941 路由器和…

章鱼应用链|UniqueOne 构建一体化的 NFT 和元宇宙的体验

全长1325字&#xff0c;预计阅读 6 分钟 作者&#xff1a;MiX 章鱼网络生态候选应用链 UniqueOne 已经通过投票&#xff0c;近期将启动主网。 UniqueOne 正在构建「NFT市场-元宇宙-DeFi」结构的多层价值生态&#xff0c;UoNo NFT Marketplace 将无缝连接元宇宙 UniqueOne.Wo…

七个研究生必备高效科研网站

文章目录一、Papers With Code二、Connected papers三、Semantic Scholar四、Researcher五、Academic Phrasebank六、EndNote七、DeepL翻译一、Papers With Code Reddit用户rstoj做了一个网站&#xff0c;将ArXiv上的最新机器学习论文与GitHub上的代码&#xff08;TensorFlow/…

RK3399 Android10 移除应用权限(包含USB)申请弹框

Android板外接了USB设备&#xff0c;每次开机后第一次启动我们的APP&#xff0c;都会弹出申请USB的弹框&#xff0c;客户使用起来很不方便&#xff0c;翻了一些文章和代码后通过修改UsbPermissionActivity.java实现。 我们看到此Activity是一个AlertActivity&#xff0c;也就是…

Zookeeper 实现分布式锁 -- 基于Curator

Zookeeper的四种节点类型 1、持久化节点 &#xff1a;所谓持久节点&#xff0c;是指在节点创建后&#xff0c;就一直存在&#xff0c;直到有删除操作来主动清除这个节点——不会因为创建该节点的客户端会话失效而消失。 2、持久化顺序节点&#xff1a;这类节点的基本特性和上…

postgres源码解析38 表创建执行全流程梳理--3

本文结合实例讲解表创建执行流程 [CREATE TABLE wp_shy(id int primary key, name carchar(20))],相关知识回顾见&#xff1a; postgres源码解析38 表创建执行全流程梳理–1 postgres源码解析38 表创建执行全流程梳理–2 执行流程图 transformCreateStmt函数是表创建真正的入口…

第十四届蓝桥杯模拟赛(第二场)题解·2022年·C/C++

前言 本场比赛是校内赛&#xff0c;总体感觉是DP规划比赛和简单数据结构比赛&#xff0c;但是要细心一点就可以了。 因为不知道答案&#xff0c;所以本题解只有一点参考意义&#xff0c;欢迎评论区和小熊同学讨论。 **不保证答案一定就是对的&#xff01;&#xff01;&#x…

退役了,总结的ACM近年区域赛的所有题型

之前写了个退役文章记录想记录下&#xff0c;但是没有内容&#xff0c;还是给删了&#xff0c;所以前面的是退役小记&#xff0c;后面是我个人写近2年所有区域赛场次记录的题型 目录 退役小记&#xff08;没兴趣可以不看&#xff09; 这里简单记下我的acm生涯 省赛和三场区…

Miniconda:在pycharm的terminal中无法使用Conda命令

在pycharm的terminal中无法使用Conda命令 问题&#xff1a; 在本地下载好conda系列后&#xff0c;在pycharm的terminal中无法使用conda命令 问题分析&#xff1a; 说的很清楚了&#xff0c;是因为当前支持的shells没有初始化conda 所以我们只需要把Shell 路径改成激活cond…

腾讯云架构师整理总结的MySQL性能优化和高可用架构实践文档

前言 有人调侃我们说&#xff1a; 程序员不如送外卖。送外卖是搬运食物&#xff0c;自己是搬运代码&#xff0c;都不产出新的东西……透支体力&#xff0c;又消耗健康&#xff0c;可替代性极强&#xff0c;30岁之后就要面临被优化的危险……想跳槽&#xff0c;但是更高的平台…

wordpress改成https网址方法

我们建议搭建wordpress使用宝塔更为方便&#xff0c;另外也可以选择WDCP或者phpstudy也不错。本次教程适用于宝塔。 老样子买一台云服务器&#xff0c;建议找一些主流云服务器提供商&#xff0c;然后买一台Linux系统的然后安装好宝塔控制面板&#xff0c;创建一个站点&#xf…

【T+】畅捷通T+服务管理中,异步任务服务(TPlusPopAsyncTaskService1700)无法启动

【问题描述】 畅捷通T产品&#xff0c; 服务管理中的【异步任务服务&#xff08;TPlusPopAsyncTaskService1700&#xff09;】一直处于停止状态&#xff0c;且点击启动没有任何反应。 【解决方法】 【排查过程】 首先&#xff1a;检查数据库配置&#xff0c;以及网站端口配置…

可以写进简历的软件测试电商项目,不进来get一下?

前言 说实话&#xff0c;在找项目的过程中&#xff0c;我下载过&#xff08;甚至付费下载过&#xff09;N多个项目、联系过很多项目的作者&#xff0c;但是绝大部分项目&#xff0c;在我看来&#xff0c;并不适合你拿来练习&#xff0c;它们或多或少都存在着“问题”&#xff…

Linux C中对json格式数组数据的生成与解析

在网络通信中&#xff0c;数据经常被做成json格式的来进行传输。那么我们怎么在linux系统中去做json格式的数据呢&#xff1f;怎么将接收到的json格式的数据解析出来呢&#xff1f; 1、linux json库的安装 &#xff08;1&#xff09;下载json-c源码包 &#xff08;2&#xff09…

Redis 内存淘汰和过期删除策略

提起使用Redis的优点&#xff0c;大家可以列举出许多&#xff0c;比如&#xff1a;数据存储在内存&#xff0c;读写速度快&#xff0c;性能优异。比如数据持久化&#xff0c;便于数据备份及恢复等等。 分布式服务系统平台发展至今&#xff0c;Redis活跃在平台的各个领域&#…

如何写单元测试

单元测试理论知识 什么是单元测试&#xff1f; 单元测试&#xff08;unit testing&#xff09;&#xff0c;是指对软件中的最小可测试单元进行检查和验证。通常而言&#xff0c;一个单元可能是单个程序、类、对象、方法等。 为什么需要单元测试 为什么要做单元测试&#xf…

Linux学习-63-源码包服务管理方法

14.5 源码包服务管理&#xff08;启动与自启动&#xff09; 14.5.1 源码包服务的启动管理 源码包服务中所有的文件都会安装到指定目录当中&#xff0c;并且没有任何垃圾文件产生&#xff08;Linux 的特性&#xff09;&#xff0c;所以服务的管理脚本程序也会安装到指定目录中…

[东华杯2021] ezgadget

复现环境配置&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1t5-fV7SUETDEI5-qbZZQrw 提取码&#xff1a;8do5运行 java -jar ezgadget.jar访问127.0.0.1:8888就可以了 分析&#xff1a; ToStringBean.java package com.ezgame.ctf.tools;import java.io.Seriali…

Nevrona Rave Reports基于报表库

Nevrona Rave Reports基于报表库 Rave Reports被描述为一套复杂的Delphi和CBuilder组件&#xff0c;它能够实现强大的进化过程&#xff0c;并为用户和开发人员提供灵活的数据库覆盖。Rave可视报表设计器基本上是一个基于组件的系统&#xff0c;它是专门为覆盖范围而编写的。与传…

Discourse 为什不建议使用 Gmail 的 SMTP

最开始我们也用了 Gmail 的 SMTP 服务。 这里有个问题是 Gmail 的日发送邮件限制&#xff0c;很多人可能认为 Gmail 是没有日常发送邮件限制的&#xff0c;通常不是这样的&#xff0c;因为如果你是手工回复和发送邮件的话&#xff0c;这个限制还是很难达到的。 如果是计算机或…