opencv_c++学习(十七)

news2024/11/19 10:41:03

一、边缘检测

在这里插入图片描述
左侧上面的曲线表示的是像素从左到右的变化,下面的曲线是上面曲线求导而得。
Sobel边缘检测算子:

Sobel(InputArray src, outputArray dst,int ddepth, int dx, int dy,
int ksize = 3, double scale = 1, double delta = 0, int borderType = BORDER_DEFAULT)

在这里插入图片描述
src:输入图像。
dst:输出图像,与输入图像具有相同的尺寸和通道数。
ddepth:输出图像的数据类型(深度),根据输入图像的数据类型不同拥有不同的取值范围(这里不推荐8U, 建议使用16S)。
dx:求导次数。
dy:求导次数。
ksize:算子尺寸大小。
scale:缩放系数,通过系数来调节梯度的大小。
delta:偏移量。
在Sobel边缘检测过程中,通常采用先行后列的边缘检测方式。

Schar边缘检测算子:

Scharr(lnputArray src, OutputArray dst,int ddepth, int dx, int dy, double scale = 1, double delta = 0, int borderType = BORDER_DEFAULT)

在这里插入图片描述
与Sobel算子不同,Schar算子的边缘提取相应更强,其余与Sobel相同。

生成边缘检测算子:

getDerivKernels(OutputArray kx, OutputArray ky, int dx, int dy, int ksize, normalize =,  bool false, int ktype = cV_32F)

kx:行滤波器系数的输出矩阵,尺寸为ksize1。
ky:列滤波器系数的输出矩阵,尺寸为ksize
1。
dx: X方向导数的阶次。
dy: Y方向导数的阶次。
ksize:滤波器的大小,可以选择的参数为FILTER_SCHARR,1,3,5或7。
normalize:是否对滤波器系数进行归一化的标志,默认值为false,表示不进行系数归一化。
ktype:滤波器系数类型,可以选择CV_32F或CV_64F,默认参数为CV_32F。
检测算子的应用案例:

int main() {

	//读取图片
	Mat src = imread("1.png", IMREAD_ANYCOLOR);
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	Mat result_X, result_Y, result_XY;

	//Sobel边缘检测的测试
	//X方向的一阶段边缘检测,这个算子最小的核大小为3,当设置为1时会自动调整为3
	Sobel(src, result_X, CV_16S, 1, 0, 1);
	//从边缘检测算子我们可以看出,边缘检测算子求取数值可能为负值,因此我们需要求取其绝对值
	convertScaleAbs(result_X, result_X);

	//Y方向的一阶段边缘检测
	Sobel(src, result_Y, CV_16S, 0, 1, 3);
	convertScaleAbs(result_Y, result_Y);

	//整合两个阶段的图像
	result_XY = result_X + result_Y;

	imshow("边缘检测", result_XY);


	//Scalar边缘检测的测试
	//X方向的一阶段边缘检测,这个算子最小的核大小为3,当设置为1时会自动调整为3
	Scharr(src, result_X, CV_16S, 1, 0);
	//从边缘检测算子我们可以看出,边缘检测算子求取数值可能为负值,因此我们需要求取其绝对值
	convertScaleAbs(result_X, result_X);

	//Y方向的一阶段边缘检测
	Scharr(src, result_Y, CV_16S, 0, 1);
	convertScaleAbs(result_Y, result_Y);

	//整合两个阶段的图像
	result_XY = result_X + result_Y;

	imshow("边缘检测1", result_XY);

	waitKey(0);
	return 0;
}

Laplacian算子:
前面介绍边缘检测算法存在的问题:
分别计算两个方向边缘;
边缘与方向相关性较大;
在这里插入图片描述

Laplacian(lnputArray src, outputArray dst,int ddepth, int ksize = 1, double scale = 1, double delta = 0, int borderType = BORDER_DEFAULT)

src:输入原图像,可以是灰度图像和彩色图像。
dst:输出图像,与输入图像src具有相同的尺寸和通道数。
ddepth:输出图像的数据类型(深度),根据输入图像的数据类型不同拥有不同的取值范围。
ksize:滤波器的大小,必须为正奇数。
scale:对导数计算结果进行缩放的缩放因子,默认系数为1,不进行缩放。delta:偏值,在计算结果中加上偏值。
borderType:像素外推法选择标志。

Canny算子:
在这里插入图片描述

Canny(lnputArray image,  OutputArray edges,double threshold1,  double threshold2, int apertureSize = 3, bool L2gradient = false

image:输入图像,必须是CV_8U单通道或者三通道图像。
edges:输出图像,与输入图像具有相同尺寸的单通道图像,且数据类型为CV_8U。
threshold1:第一个滞后阈值。
threshold2:第二个滞后阈值。
apertureSize: Sobel算子的直径。
L2gradient:计算图像梯度幅值的标志。
两种边缘检测算子的案例:

int main() {

	//读取图片
	Mat src = imread("1.png", IMREAD_ANYCOLOR);
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	Mat result, result_g, result_G;

	//不滤波提取边缘
	Laplacian(src, result, CV_16S, 3, 1, 0);
	//取绝对值
	convertScaleAbs(result, result);

	//先滤波,再提取边缘
	GaussianBlur(src, result_g, Size(3, 3), 5, 0);
	Laplacian(result_g, result_G, CV_16S, 3, 1, 0);
	convertScaleAbs(result_G, result_G);

	imshow("result", result);
	imshow("result_G", result_G);

	Mat resultHigh, result_low, resultG;

	//大阈值图像边缘检测
	Canny(src, resultHigh, 100, 200, 3);

	//小阈值图像边缘检测
	Canny(src, result_low, 20,40, 3);

	//先滤波,再提取边缘
	GaussianBlur(src, result_g, Size(3, 3), 5, 0);
	Canny(src, resultG, 100, 200, 3);

	imshow("result", resultHigh);
	imshow("result_low", result_low);
	imshow("resultG", resultG);

	waitKey(0);
	return 0;
}

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

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

相关文章

AI 图像编辑技术 DragGAN 问世,用户可以通过拖拽改变汽车大小或人物表情等

🚀 AI 图像编辑技术 DragGAN 问世,用户可以通过拖拽改变汽车大小或人物表情等 近日,马克斯・普朗克计算机科学研究所研究者们推出了一种控制GAN的新方法DragGAN,用户可以通过拖拽改变汽车大小或人物表情等。 DragGAN类似于Photo…

顶层策划打开互联网市场大门

大家好!我是小鱼。随着市面上越来越多的中小企业老板进入互联网市场,对软件开发的技术和要求也逐渐高了起来。单纯做一个商城已经远远不满足客户的需求了。那么客户他到底需要什么? 小编总结了一下,第一客户需要一个完整的系统体系&#xff…

类和对象 - 下(C++)

目录 构造函数补充 构造函数体赋值 初始化列表 explicit关键字 Static成员 概念 特性 友元 友元函数 友元类 内部类 匿名对象 编译器对拷贝对象的优化 理解类和对象 构造函数补充 构造函数体赋值 构造函数: 我们知道 构造函数本质就是在对象创建的同时对其进行初始…

【Android】配置不同的开发和生产环境

目录 前言 配置build.gradle(Module级别) 创建对应环境的目录 切换不同环境 ​编辑选择打包的环境 前言 在web开发中不同的环境对应的配置不一样,比如开发环境的url是这样,测试环境的url是那样的,在app中也会涉…

双轮平衡车实现自平衡功能

1. 功能说明 在双轮小车上安装一个六轴陀螺仪传感器,本文示例将实现双轮小车自主平衡功能。 2. 电子硬件 在这个示例中,我们采用了以下硬件,请大家参考: 主控板 Basra主控板(兼容Arduino Uno) 扩展板 Big…

基于网络的思维导图WiseMapping

在退烧了一天半之后,老苏的抗原终于变两道杠了。之前还总怀疑自己是无症状,大意了,被新冠给查缺补漏了 😂 什么是 WiseMapping ? WiseMapping 是一款基于网络的免费思维导图产品。该项目的目标是提供可由企业、教育和学…

Java面试知识点(全)-分布式和微服务-dubbo面试知识点

Dubbo是什么? Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵化项目。 面试官问你如果这个都不清楚,那下面的就没必要问了。 官网:http://dubbo.apache.org 为什么要用Dubbo&#xff1f…

内存泄漏之DispatcherTimer

https://www.jianshu.com/p/7e9ecb383bd0 我们经常会在程序中使用DispatcherTimer&#xff0c;但是如果一不小心就会发生内存泄漏&#xff0c;请看下面的Demo&#xff1a; 内存泄漏代码 我创建了一个简单的窗口Example1.xaml&#xff1a; <Window x:Class"MemoryLea…

Keep your Eyes on the Lane Real-time Attention-guided Lane Detection 论文精读

关注车道&#xff1a;实时注意力引导车道线检测 摘要 现代车道线检测方法在复杂的现实世界场景中取得了显著的性能&#xff0c;但许多方法在保持实时效率方面存在问题&#xff0c;这对自动驾驶汽车很重要。在这项工作中&#xff0c;我们提出了LaneATT&#xff1a;一种基于锚点…

【降维打击】T分布随机近邻嵌入(T-SNE)Python实践

近几天看到论文里面有T分布随机近邻嵌入&#xff08;T-distributed stochastic neighbor embedding, T-SNE&#xff09;这种可视化方法&#xff0c;以前好像也看到过&#xff0c;但没有系统了解过&#xff0c;现有时间正好实践记录一下。 1. T-SNE简介 T-SNE是一种降维方法&am…

搭建监控日志系统

在微服务或者集群架构中&#xff0c;一次请求的调用会跨多个服务&#xff08;web&#xff0c;mysql&#xff0c;feign等&#xff09;、多个模块&#xff08;用户模块&#xff0c;商品模块等&#xff09;、多个容器&#xff08;用户模块可能有多个实例&#xff09;&#xff0c;这…

【科普】干货!带你从0了解移动机器人(二)—— 移动机器人硬件组成

移动机器人是一个多功能于一体的综合系统&#xff0c;内容涵盖了传感器技术、自动化技术、信息处理、电子工程等&#xff0c;它集环境感知、动态决策与规划于一体&#xff0c;是目前科学技术发展最活跃的领域之一。移动机器人的各种组件之间需要协同工作才能实现机器人的自主移…

【源码解析】RuoYi-Vue-Plus翻译功能 Translation 源码分析

类说明功能Translation通用翻译注解标注需要翻译的字段&#xff0c;用于实体类字段上TranslationType翻译类型注解标注翻译字段的实现类型&#xff0c;用于实现类上标注TransConstant翻译常量TranslationType 类型常量TranslationConfig翻译模块配置类配置初始化&#xff0c;设…

深度学习基础入门篇[9.2]:卷积之1*1 卷积(残差网络)、2D/3D卷积、转置卷积数学推导、应用实例

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

一文了解customRef 自定义ref使用

概念 按照文档中的说明&#xff1a;customRef 可以用来创建一个自定义的 ref&#xff0c;并对其依赖项跟踪和更新触发进行显式控制。它需要一个工厂函数&#xff0c;该函数接收 track 和trigger函数作为参数&#xff0c;并且应该返回一个带有 get 和 set 的对象。 其实大致意思…

公有云——阿里云ECS服务器入门精通(IaaS)(2)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 一.ECS 实例规格族介绍 1.实例的架构类型、规格分类&#xff0c;详细信息 2.企业…

网络互联与互联网 - IP 子网划分详解

文章目录 1 概述1.1 划分目的1.2 划分原则1.3 子网掩码 2 IP 子网划分示例3 网工软考真题3.1 判断网络号和主机号3.2 计算可容纳的主机数3.3 子网划分 1 概述 IP 子网划分&#xff1a;实际上就是设计 子网掩码 的过程。原因&#xff1a;由于在五类的IP地址中&#xff0c;网络号…

【SpringBoot】数据校验API

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 数据校验API SpringBoot数据校验数据校验API的…

智能电动「唱主角」,哪些供应商在「领跑」智驾域控制器赛道

新势力&#xff0c;从哪里突围&#xff1f; 造车新势力在过去几年的成绩&#xff0c;已经代表了未来趋势&#xff1a;新能源汽车&#xff0c;尤其是纯电动。而对于智能化软硬件供应商&#xff0c;尤其是新势力供应商来说&#xff0c;亦是如此。 高工智能汽车研究院监测数据显…

深度学习框架-Tensorflow2:特点、架构、应用和未来发展趋势

引言 深度学习是一种新兴的技术&#xff0c;已经在许多领域中得到广泛的应用&#xff0c;如计算机视觉、自然语言处理、语音识别等。在深度学习中&#xff0c;深度学习框架扮演着重要的角色。Tensorflow是一种广泛使用的深度学习框架&#xff0c;已经成为深度学习的事实标准。…