Opencv | 边缘提取

news2024/12/23 14:12:07

目录

  • 一. 边缘检测
    • 1. 边缘的定义
    • 2. Sobel算子 边缘提取
    • 3. Scharr算子 边缘提取
    • 4. Laplacian算子 边缘提取
    • 5. Canny 边缘检测算法
      • 5.1 计算梯度的强度及方向
      • 5.2 非极大值抑制
      • 5.3 双阈值检测
      • 5.4 抑制孤立弱边缘
  • 二. 轮廓信息
    • 1. 获取轮廓信息
    • 2. 画轮廓

一. 边缘检测

1. 边缘的定义

在这里插入图片描述

	边缘:像素值快速变化的区域,也就是像素值函数一阶导数的极值区域
	边缘信息:像素值明显变化的区域, 具有非常丰富的语义信息,常用于物体识别等领域

2. Sobel算子 边缘提取

	Sobel滤波作用:相当于先高斯去燥,再使用一阶导数获取极值
				  导数对噪声非常敏感
	设计方式:[-a, 0 ,a]
	
	语法
	方法1:
		cv2.Sobel(src, ddepth, dx, dy[, ksize[, scale[, delta[, borderType]]]])
	参数:
		src:表示输入图像,即待处理的原始图像
		ddepth:表示输出图像的深度,当其值为负时(通常取-1),输出图像与输入图像有相同的深度
		dx:表示x方向上的求导阶数,若想计算水平方向的边缘,则设置为1
		dy:表示y方向上的求导阶数,若想计算垂直方向的边缘,则设置为1
		ksize:Sobel核的大小,默认为3,即3x3的矩阵
			   如果该值为-1,则会使用Scharr算子进行运算
		scale:计算导数值时所采用的缩放因子,默认情况下该值是1,即无缩放
		delta:在结果中加入的一个可选的常数项,用于调节输出图像的亮度
		borderType:像素外推法选择项,用于处理图像边缘的像素
	作用:计算图像的一阶导数,通常用于边缘检测
	
	方法2:
		cv.filter2D()函数

在这里插入图片描述
d d x ( f ∗ g ) = f ∗ d d x g \frac{d}{d x}(f * g)=f * \frac{d}{d x} g dxd(fg)=fdxdg

  • SobelX:水平梯度/垂直边缘,提取垂直的边缘信息
    在这里插入图片描述
    经过SobelX提取的边缘信息为:
    在这里插入图片描述

  • SobelY:垂直梯度/水平边缘,提取水平的边缘信息
    在这里插入图片描述
    经过SobelY提取的边缘信息为:
    在这里插入图片描述

3. Scharr算子 边缘提取

	Scharr是Sobel算子的改进版,具有更好的性能和更高的精度

4. Laplacian算子 边缘提取

Δ s r c = ∂ 2 s r c ∂ x 2 + ∂ 2 s r c ∂ y 2 \Delta s r c=\frac{\partial^{2} s r c}{\partial x^{2}}+\frac{\partial^{2} s r c}{\partial y^{2}} Δsrc=x22src+y22src

	设计方式:[a, -2a, a]
	
	cv2.Laplacian(src, ddepth, ksize, scale=1, delta=0, borderType=BORDER_DEFAULT)
	参数:
		src:表示原始输入图像
		ddepth:表示目标图像的深度
		ksize:
			用于计算二阶导数的核(kernel)尺寸大小
				必须是正的奇数
				如果该参数未指定,则默认使用3x3的核
		scale:表示计算Laplacian值的缩放比例因子,该参数是可选的
			   默认情况下,该值为1,表示不进行缩放
		delta:表示加到目标图像上的可选值,默认为0
		borderType:表示像素外推法选择项,用于处理图像边界
	作用:Laplacian滤波器在图像处理中常用于边缘检测和增强
	效果:
		块团检测:周边高于或者低于中心点的区域 
		边缘检测:像素值快速变化的区域

	特点:二阶微分算子作为梯度值
	不同点:与Sobel和Scharr滤波器不同,Laplacian滤波器对图像中的突变(即边缘)更加敏感,因为它使用的是二阶导数

5. Canny 边缘检测算法

Canny边缘检测算法是从不同视觉对象中提取有用的结构信息,是传统计算机视觉中非常广泛应用的一种边缘提取算法

	语法:
		cv2.Canny(image, threshold1, threshold2[, apertureSize[, L2gradient]])
		参数:
			image:表示要进行边缘检测的输入图像
			threshold1:第一个阈值,用于边缘连接,较小的值会导致更多边缘被检测到
			threshold2:第二个阈值,用于检测强边缘,较大的值将导致仅检测到强边缘
			apertureSize:可选参数,表示Sobel算子的孔径大小,默认值为3
			L2gradient:可选参数,表示是否使用L2范数计算梯度幅值,默认值为False
	Canny边缘检测算法通过以下步骤实现:
		使用高斯滤波平滑图像,减少图像中的噪声
		计算图像的梯度幅值和方向
		对梯度幅值应用非最大抑制,以得到细化的边缘
		使用两个阈值(threshold1和threshold2)来确定潜在的边缘
		通过抑制孤立的弱边缘,最终得到边缘检测结果。
	作用:	
		Canny算法能够有效地识别图像中的弱边缘和强边缘,并结合它们的位置关系,给出图像整体的边缘信息
		由于其优越的性能,Canny算法是目前最常用的边缘检测算法之一

5.1 计算梯度的强度及方向

强度: G = G x 2 + G y 2 强度:G=\sqrt{G_{x}^{2}+G_{y}^{2}} 强度:G=Gx2+Gy2
方向: θ = arctan ⁡ ( G y / G x ) 方向:\theta=\arctan \left(G_{y} / G_{x}\right) 方向:θ=arctan(Gy/Gx)

其中,Sobel算子为:
S x = [ − 1 0 1 − 2 0 2 − 1 0 1 ] S y = [ 1 2 1 0 0 0 − 1 − 2 − 1 ] S_{x}=\left[\begin{array}{ccc} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{array}\right] S_{y}=\left[\begin{array}{ccc} 1 & 2 & 1 \\ 0 & 0 & 0 \\ -1 & -2 & -1 \end{array}\right] Sx= 121000121 Sy= 101202101

因此:
G x = S x ∗ A = [ − 1 0 1 − 2 0 2 − 1 0 1 ] ∗ [ a b c d e f g h i ] = sum ⁡ ( [ − a 0 c − 2 d 0 2 f − g 0 i ] ) G_{x}=S_{x} * A=\left[\begin{array}{ccc} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{array}\right] *\left[\begin{array}{lll} a & b & c \\ d & e & f \\ g & h & i \end{array}\right]=\operatorname{sum}\left(\left[\begin{array}{ccc} -a & 0 & c \\ -2 d & 0 & 2 f \\ -g & 0 & i \end{array}\right]\right) Gx=SxA= 121000121 adgbehcfi =sum a2dg000c2fi

G y = S y ∗ A = [ 1 2 1 0 0 0 − 1 − 2 − 1 ] ∗ [ a b c d e f g h i ] = sum ⁡ ( [ a 2 b c 0 0 0 − g − 2 h − i ] ) G_{y}=S_{y} * A=\left[\begin{array}{ccc} 1 & 2 & 1 \\ 0 & 0 & 0 \\ -1 & -2 & -1 \end{array}\right] *\left[\begin{array}{lll} a & b & c \\ d & e & f \\ g & h & i \end{array}\right]=\operatorname{sum}\left(\left[\begin{array}{ccc} a & 2 b & c \\ 0 & 0 & 0 \\ -g & -2 h & -i \end{array}\right]\right) Gy=SyA= 101202101 adgbehcfi =sum a0g2b02hc0i

5.2 非极大值抑制

	属于一种边缘稀疏技术
	作用:主要作用就是构建“瘦”边 
	效果:非极大值抑制可以将局部最大值之外的所有梯度值抑制为0
	
	其构建过程:
		将当前像素的梯度强度与沿着正负梯度方向上的两个像素进行比较
			如果当前像素的梯度强度 > 另外两个像素,则该像素点保留为边缘点
			否则该像素点被抑制为0 

5.3 双阈值检测

在进行非极大值抑制后,剩余的像素可以更准确地表示图像中的实际边缘,但是有可能还是存在一些噪音数据形成的边缘像素,所以需要使用弱梯度值来过滤这些非实际的边缘像素,并保留高梯度的实际边缘值

	像素边缘的梯度值 > 高阈值,该像素为边缘,且为强边缘
	高阈值 > 像素边缘的梯度值 > 低阈值,该像素可能为边缘,且弱边缘
	像素边缘的梯度值 < 低阈值,则会将其抑制
	
	注意:对于可能为边缘的像素
		  	当该像素与强边缘相连,则保留为边缘
		  	当该像素未与强边缘相连,则直接丢弃
	即抑制孤立弱边缘

在这里插入图片描述

5.4 抑制孤立弱边缘

查看弱边缘像素及其周边的八个邻域像素:

	只要其中有一个为强边缘像素/真实边缘像素,则该弱边缘点被保留为真实边缘/强边缘像素

算法原理:真实的弱边缘像素一定是连接强边缘像素点的

二. 轮廓信息

轮廓信息可以简单的理解为从图像中获取图像曲线的连接点信息,在目标检测、目标识别等业务场景中,具有一定的效果

轮廓信息就是从图像中获取图像边缘信息,简单说就是,一张图片内有许多边缘信息,当我们需要获取某个形状的边缘信息时,可以通过轮廓信息进行查找

1. 获取轮廓信息

	contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
	参数:
		image:
			输入的单通道图像矩阵
			通常是经过边缘检测算子处理的二值图像
		contours:
			双重向量
				其中每个元素包含由连续的Point点构成的点的集合,代表一个轮廓
				有多少轮廓,这个向量就有多少元素
			hierarchy:
				包含4个整型的向量,定义了图像中各个轮廓之间的等级关系
			mode:
				定义轮廓的检索模式
					CV_RETR_EXTERNAL:只检测最外围轮廓,内围轮廓被忽略
					CV_RETR_LIST:检测所有轮廓,包括内围和外围轮廓,但检测到的轮廓不建立等级关系,彼此之间独立
					CV_RETR_CCOMP:检测所有轮廓,并建立两个等级的轮廓层次关系;顶层是外部轮廓,底层是内部轮廓
					CV_RETR_TREE:检测所有轮廓,并建立完整的等级树状结构,每个轮廓都有相应的父轮廓或子轮廓
			method:
				定义轮廓的近似方法
					CV_CHAIN_APPROX_NONE:存储所有轮廓点,即不进行任何近似
					CV_CHAIN_APPROX_SIMPLE:仅存储轮廓的拐点信息,即对于一条直线上的点而言,仅仅保留端点信息
					CV_CHAIN_APPROX_TC89_L1:使用Teh-Chin链逼近算法,将轮廓近似为一条折线
					CV_CHAIN_APPROX_TC89_KCOS:使用Teh-Chin链逼近算法,将轮廓近似为一条曲线
			offset:是可选参数,表示轮廓点相对于原始图像的偏移量
	返回值:
		contours:每个轮廓的坐标点信息
		hierarchy:轮廓之间的关系
	操作:
		先对图像进行预处理:转为灰度图像,阈值分割或边缘检测算法来获取二值图像
		随后使用该函数进行检测和提取图像中的轮廓,为后续的图像分析、目标识别或形状匹配等任务提供基础

2. 画轮廓

	cv.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])
	参数:
		image:输入单通道图像矩阵,通常是经过边缘检测算子处理的二值图像
		contours:双重向量
		contourIdx:
			要绘制的轮廓的索引
			如果为负数,则绘制所有轮廓
		color:表示绘制轮廓的颜色
		thickness:
			绘制轮廓的线条粗细
			如果为负数,则填充轮廓内部
		lineType:	表示绘制轮廓的线条类型,如:实线、虚线等
		hierarchy:包含4个整型的向量,定义了图像中各个轮廓之间的等级关系
		maxLevel:
			绘制轮廓的最大层级
				如果为0,则只绘制指定索引的轮廓
				如果大于0,则绘制指定索引及其子轮廓
		offset:可选参数,表示轮廓点相对于原始图像的偏移量
	作用:在图像中直观地显示轮廓信息

感谢阅读🌼
如果喜欢这篇文章,记得点赞👍和转发🔄哦!
有任何想法或问题,欢迎留言交流💬,我们下次见!
本文相关代码存放位置
    【Opencv 图像变换代码实现

祝愉快🌟!


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

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

相关文章

智慧图书管理|基于SSM+vue的网上服装商城系统(源码+数据库+文档)

智慧图书管理目录 基于SSMvue的网上服装商城系统 一、前言 二、系统设计 三、系统功能设计 1.1 服装列表 1.2 公告信息管理 1.3 公告类型管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1…

webpack 入口和出口的最佳实践

入口和出口的最佳实践 {ignore} 具体情况具体分析 下面是一些经典场景 一个页面一个JS 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 源码结构 |—— src|—— pageA 页面A的代码目录|—— index.js 页面A的启动模块|—— ...|—— pageB 页面…

分享一些常用的内外网文件传输工具

内外网隔离后的文件传输是网络安全领域中一个常见而又重要的问题。随着信息技术的快速发展&#xff0c;网络安全问题日益凸显&#xff0c;内外网隔离成为了许多企业和组织保护内部信息安全的重要手段。然而&#xff0c;内外网隔离后如何有效地进行文件传输&#xff0c;成为了摆…

【sgSearch_v2】自定义组件:常用搜索栏筛选框组件(展开后更多搜索内容悬浮于其他组件之上,不影响整体布局高度)。

sgSearch_v2源码 <template><div:class"$options.name":expand"expandSearch":showCollapseBtn"showCollapseBtn"keyup.enter"(expandSearch true), $emit(keyupEnter, {})"><ul class"search-list">&l…

第一阶段--Day1--什么是网络安全?网络安全常用术语

目录 1. 什么是网络安全&#xff1f; 信息系统&#xff08;Information System&#xff09; 信息系统安全三要素&#xff08;CIA&#xff09; 网络空间安全管理流程 网络安全管理 2. 网络安全的常用术语 3. 网络安全形势 4. 中国网络安全产业现状 1. 什么是网络安全&am…

Leetcode—1256. 加密数字【中等】Plus(bitset、find_first_not_of、erase)

2024每日刷题&#xff08;120&#xff09; Leetcode—1256. 加密数字 实现代码 class Solution { public:string encode(int num) {string ans;num 1;while(num ! 0) {ans to_string(num & 1);num num >> 1;}if(ans.empty()) {return "";} else {stri…

解决VMware启动异常

问题1&#xff1a;该虚拟机似乎正在使用中。如果该虚拟机未在使用&#xff0c;请按“获取所有权(T)”按钮获 取它的所有权。否则&#xff0c;请按“取消(C)”按钮以防损坏。 解决步骤&#xff1a; 按弹框提示的配置文件目录下删除后缀为lck的文件&#xff08;lock&#xff09;。…

上位机图像处理和嵌入式模块部署(树莓派4b之远程vnc桌面访问)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于很多嵌入式开发比较精通的同学来说&#xff0c;使用命令行和开发板之间进行沟通是他们完全能够接受的一种开发方式。但是对于更多的朋友来说&a…

Linux系统编程--信号与管道

1、信号与管道是什么&#xff1f; 首先了解信号与管道的意义&#xff0c;我们需要了解Linux系统中进程之间是如何通信的。Linux操作系统下&#xff0c;以进程为单位来分配或者管理资源&#xff0c;进程之间不能直接访问资源&#xff0c;因此&#xff0c;要求进程间的资源和信息…

windows服务启动提示‘服务没有响应控制功能’(mysql启动报错)

在安装mysql的时候&#xff0c;在windows服务项启动 或 使用命令net start mysql 时启动是报错&#xff0c;提示 服务没有响应控制功能 发生原因&#xff1a; Windows10 x64 或 更高的操作系统&#xff0c;有些系统缺少一些组件 解决办法&#xff1a; 1、下载最新的 Microsoft …

软文伪原创工具有哪些,推荐3款强大的软文伪原创工具

软文作为一种重要的营销和传播手段&#xff0c;受到了越来越多的关注。而随着科技的不断发展&#xff0c;各种软文生产的工具相续出现&#xff0c;如&#xff1a;软文伪原创工具&#xff0c;它能为人们提供便捷、高效的文章生产方式&#xff0c;也及可以节省文章写作的时间与精…

JAVA基础面试题(第十篇)下! 集合与数据结构

JAVA集合和数据结构也是面试常考的点&#xff0c;内容也是比较多。 在看之前希望各位如果方便可以点赞收藏&#xff0c;给我点个关注&#xff0c;创作不易&#xff01; JAVA集合 21. ConcurrentHashMap 的并发度是多少&#xff1f; 在JDK1.7中&#xff0c;并发度默认是16&a…

云渲染一张图多少钱

使用云渲染渲染一张效果图的价格没法确定多少钱一张&#xff0c;云渲染一张图的价格会受到多个因素的影响&#xff0c;如云渲染平台的定价策略、所选的渲染配置、优惠政策以及你提交的场景任务等。因此&#xff0c;无法给出确切的单一价格。 不同的云渲染平台会有不同的定价模…

HackMyVM-Slackware

目录 信息收集 arp-scan nmap nikto whatweb WEB web信息收集 gobuster wfuzz hydra ssh连接 提权 系统信息收集 get root 信息收集 arp-scan ┌──(root㉿0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 08:00:27:9d:6d:7b, IPv4…

PDF高效编辑器,一键转换将PDF文件转换成HTML文件,开启文件处理新篇章!

文件格式的转换与处理已成为我们日常工作中不可或缺的一部分。为了满足广大用户对高效、便捷文件处理的需求&#xff0c;我们荣幸地推出了全新的PDF高效编辑器——PDF到HTML一键转换工具&#xff01;这款工具将为您带来前所未有的文件处理体验&#xff0c;让您轻松驾驭文件格式…

vite+vue3配置less

在Vite项目中配置LESS&#xff0c;你需要安装相关的插件&#xff0c;并在Vite配置文件中进行配置。以下是步骤和示例代码&#xff1a; 安装LESS和LESS插件&#xff1a; npm install less --save-dev npm install less-loader --save-dev 在Vite配置文件中&#xff08;通常是v…

本地生活服务平台有哪些?哪个靠谱?

随着多家互联网大厂的本地生活服务布局日益展开&#xff0c;不少人都看到了其中的巨大市场缺口和广阔前景&#xff0c;想要入驻本地生活服务平台&#xff0c;瓜分这块巨大的蛋糕。而在当下这个选择大于努力的时代&#xff0c;能否分到蛋糕以及分到多少蛋糕的关键&#xff0c;就…

【Java数据结构】深入解析ArrayList与顺序表

【Java数据结构】深入解析ArrayList与顺序表 1.前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 2.ArrayList的介绍 3.使用ArrayList 3.1 ArrayList的构造方法 3.11 第一个构造方法 3.12第二个构造方法 3.13第三个构造方法 3.2ArrayList中的tostring方…

vue2[黑马笔记]

vue基础 是什么—javascript框架 构建用户界面的前端框架 1.构建用户界面用vue往html页面中填充数据 2.框架现成的解决方案&#xff0c;遵守框架的规范去实现自己的业务功能学习vue 就是学习vue框架中规定的用法vue的指令组件&#xff08;对ul结构的复用&#xff09;&#x…

STM32G431RBT6之LCD与LED配置

首先,配置时钟树,时钟树的配置在我的另外一篇博客里,这里不再赘述. LCD与LED具有共同的IO口,同时创建工程较好. 打开原理图,发现LED的IO口是PC8~PC15,还有一个容易看漏的PD2.LCD的IO口是PC0到PC15. 当然,看产品手册也可以知道,但是还是推荐大家看原理图. 打开cubumx,给PC0~PC…