【Opencv入门到项目实战】(七):图像轮廓检测

news2024/9/28 13:25:34

所有订阅专栏的同学可以私信博主获取源码文件

文章目录

  • 引言
  • 1.​轮廓检测
  • 2.轮廓特征
  • 3.轮廓近似
  • 4.外接矩形
  • 总结

引言

这一篇文章我们来讨论图像轮廓相关的知识点,什么叫做轮廓,从定义上来说它是指图像中连续的曲线或边界,表示了图像中目标的形状和外观特征。我们之前已经介绍了一些图像边缘检测相关的内容,我们有一些零零散散的一些线段也可以当做是一个边缘,但是这些不能看做是图像轮廓,因为轮廓首先得是一个整体,是连在一块的,这就是轮廓和边缘之间的区别。我们只要记住:

边缘:零零散散的

轮廓:它是一个整体

1.​轮廓检测

接下来我们首先要看的的就是轮廓检测,我们调用OpenCV的 cv2.findContours() 函数来查找图像中的轮廓。这个函数需要输入一个二值化的图像(通常是经过边缘检测后的结果),并返回一组轮廓。可以选择不同的检索模式和轮廓逼近方法来控制轮廓的提取方式。语法如下:

cv2.findContours(image,mode,method)
  • image:输入图像,为了提高准确率,使用二值图像。

  • mode:定义轮廓检索模式,有四种可选模式:

    • cv2.RETR_EXTERNAL:只检索最外面的轮廓;
    • cv2.RETR_LIST:检索所有轮廓,并将其保存在列表中。
    • cv2.RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
    • cv2.RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次,我们常用这个
  • method:定义轮廓逼近方法,我们这里主要使用下列两种方法

    • cv2.CHAIN_APPROX_NONE:存储所有的边界点。

    • cv2.CHAIN_APPROX_SIMPLE:仅存储水平、垂直和对角线方向的端点。

下面我们来看一下具体的代码部分:

将原始图片转换为二值图像

这里为了方便演示,使用了一个非常规则的图片,包含几种基础的集合图形

import cv2
def cv_show(img,name):
    cv2.imshow(name,img)

    
# 第一步:转换为二值图
img = cv2.imread('my_contour.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
cv_show(thresh,'contours')

image-20230802160345522

轮廓检测

调用cv2.findContours()函数

binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
  • binary:返回的就是二值图像
  • contours:返回的是我们的轮廓信息
  • hierarchy:返回的是层级结构

绘制轮廓

使用 cv2.drawContours() 函数可以将提取到的轮廓绘制在图像上,这样就可以可视化检测到的目标的形状和位置。主要包含下列几个参数

  • draw_img:要在其上绘制轮廓的图像。
  • contours:要绘制的轮廓列表。
  • contourIdx:指定要绘制的轮廓的索引。使用 -1 表示绘制所有的轮廓。
  • color:绘制轮廓的颜色,格式为 (B, G, R),其中 B、G 和 R 分别表示蓝色、绿色和红色的强度。例如 (255, 0, 0) 表示纯蓝色。
  • thickness:轮廓线的粗细,默认值为 1
# 传入绘制图像,轮廓,轮廓索引,颜色模式,线条厚度

draw_img = img.copy() #创建一个图像副本保存
res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2) #绘制所有轮廓
cv_show(res,'res')

image-20230802160401181

上述我们绘制了所有的轮廓,有的时候我们只想得到其中的某一个轮廓,我们可以指定相应的轮廓索引,例如

draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, 0, (255, 0, 0), 2)#绘制索引为0的轮廓
cv_show(res,'res')

image-20230802160413629

2.轮廓特征

在我们得到轮廓之后,如何利用这些信息呢,像其他图像特征一样,图像轮廓提供了许多与目标形状相关的特征信息,可以用于形状分析、目标检测和图像识别等任务。以下是一些常见的轮廓特征以及计算:

  1. 面积(Area):轮廓所包围的区域的面积。
    • 可以使用 cv2.contourArea(contour) 函数计算轮廓的面积。
  2. 周长(Perimeter):轮廓的周长,即轮廓的闭合曲线的长度。
    • 可以使用 cv2.arcLength(contour, closed) 函数计算轮廓的周长,其中 closed 参数指定轮廓是否为闭合曲线。
  3. 边界框(Bounding Box):将轮廓包围在一个矩形框中。
    • 可以使用 cv2.boundingRect(contour) 函数获取包围轮廓的最小矩形框的位置和大小。
  4. 最小外接圆(Minimum Enclosing Circle):包围轮廓的最小半径的圆。
    • 可以使用 cv2.minEnclosingCircle(contour) 函数获取包围轮廓的最小外接圆的圆心和半径。
  5. 最小外接矩形(Minimum Enclosing Rectangle):包围轮廓的最小面积的矩形。
    • 可以使用 cv2.minAreaRect(contour) 函数获取包围轮廓的最小外接矩形的位置、大小和旋转角度。
  6. 凸包(Convex Hull):能够完全包围轮廓的凸多边形。
    • 可以使用 cv2.convexHull(points) 函数获取轮廓的凸包。
  7. 近似多边形(Approximation Polygon):用直线段逼近轮廓的多边形。
    • 可以使用 cv2.approxPolyDP(curve, epsilon, closed) 函数对轮廓进行近似,其中 epsilon 是逼近精度参数。
  8. 形心(Centroid):轮廓所包围区域的重心或平均位置。
    • 可以使用 cv2.moments(contour) 函数计算轮廓的矩,然后通过计算质心来获取重心。

这里我们以前两个为例演示如何使用,其他的特征计算都是直接调用相应的函数即可。
在上面我们已经得到了轮廓的信息contours,但是我们不能直接将其进行特征计算,因为它包含了所有的轮廓信息,因此我们要指定相应的索引再进行特征计算

cnt = contours[0] #指定索引为0的轮廓
#面积
print(cv2.contourArea(cnt))

#周长,True表示闭合的
print(cv2.arcLength(cnt,True))
24578.0
586.4995617866516

3.轮廓近似

轮廓近似是指用直线段或曲线段逼近实际轮廓的过程,从而减少轮廓中的点数并简化轮廓的表示。这可以帮助我们更有效地处理和分析轮廓。

在 OpenCV 中,可以使用 cv2.approxPolyDP(curve, epsilon, closed) 函数来进行轮廓的近似。参数说明如下:

  • curve:输入的轮廓。
  • epsilon:表示近似精度的参数。较小的值会产生更准确的逼近,但会保留更多的细节和点。较大的值会导致更粗糙的逼近,但会减少点的数量。
  • closed:一个布尔值,指示是否闭合轮廓。

下面我们来看一个具体例子

img = cv2.imread('contours2.png')

# 获取轮廓特征
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cnt = contours[0]
# 原始轮廓
draw_img = img.copy()
original = cv2.drawContours(draw_img, [cnt], -1, (0, 0, 255), 2)

# 近似轮廓
epsilon = 0.1*cv2.arcLength(cnt,True) 
approx = cv2.approxPolyDP(cnt,epsilon,True)
draw_img = img.copy()
approx = cv2.drawContours(draw_img, [approx], -1, (0, 255, 0), 2)

res = np.hstack((original,approx))
cv_show(res,'res')

image-20230804224154557

左边是原始轮廓,右边是近似轮廓,可以看出对于轮廓变化较大的区域,近似效果有一定偏差,如果我们将epsilon设置的更小一点,如下所示

image-20230802164731148

此时近似效果非常接近。

4.外接矩形

很多时候,我们不是直接利用图像的轮廓进行操作,因为这些图像往往不规则,我们需要对其外接矩形或外接圆来进行分析,在opencv中,我们可以利用cv2.boundingRect()函数得到轮廓的外接矩形信息。

img = cv2.imread('contours.png')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cnt = contours[0]

x,y,w,h = cv2.boundingRect(cnt)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
cv_show(img,'img')

image-20230804224108000

总结

我们介绍了如何进行图形轮廓的检测、特征计算、轮廓近似处理。总的来说,图像轮廓具有以下特点:

  • 轮廓是由连续的曲线或边界组成的,能够准确地描述目标的形状。
  • 轮廓可以用于目标的识别、分类和形状分析。
  • 轮廓可以通过计算形状的特征(如面积、周长、重心等)来获取更多的信息。
  • 可以使用图像轮廓进行图像分割、边缘检测和图像增强等任务。

🔎本章的介绍到此介绍,如果文章对你有帮助,请多多点赞、收藏、评论、订阅支持!!《Opencv入门到项目实战》

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

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

相关文章

h5高德地图定位与Audio标签冲突

看到此文说明你也遇见此问题了,在ios设备使用(高德地图、百度地图)定位,如果在页面中有audio标签则会出现定位失败要么就是音频无法播放,此问题已和官方证实 是冲突问题,暂无解决方案。 因为高德地图也是基于原生定位开发的&#…

51单片机学习--红外遥控(外部中断)

需要利用下面这个红外接收头,OUT口会发出红外信号对应的高低电平,由于发送的速度很快,所以需要把OUT引脚接在外部中断引脚上,当OUT一旦产生下降沿,马上进中断,这样响应会更及时。 外部中断引脚位于P3_2和P…

chatGPT能力培训,客户最关注的99个方向

前言: chatGPT的主要应用,包括文本生成、图像生成和图文关联三大核心方向: 用户的在实际的工作和学习过程中,最关心的内容,可以按照上述类别进行划分,我们总结了,相关的插头GPT能力培训的相关主…

工程管理系统简介 工程管理系统源码 java工程管理系统 工程管理系统功能设计em

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff…

这些工具让音频文件格式转换更简单

小华是一位音乐爱好者,他平时喜欢下载并播放一些流行音乐。在这个过程中,他发现从不同平台上下载下来的音乐格式并不一样,而不同的播放平台也支持不同的音频格式。这令他感到烦恼,并希望通过一些音频格式转换器来帮助他解决音频格…

2023牛客暑期多校训练营7 I-We Love Strings (分块)

文章目录 题目大意题解参考代码 题目大意 题解 这题给定的 n n n 大小和 s i s_i si​ 的总长度有玄机。 我们发现: 400 2 0 2 40020^2 400202,对于每一组数据 n n n 的个数每增加一个, s i s_i si​ 的平均值就会减小。 处理相同的 l…

【MySQL】表中的一条数据在磁盘上是如何存放的?

文章目录 1 InnoDB行格式2 COMPACT行格式2.1 记录的额外信息2.2 记录的真实数据 3 Dynamic & Compressed4 VarChar(n)中n的最大取值? 1 InnoDB行格式 不同的存储引擎一般是为实现不同的特性来开发的,真实数据在不同存储引擎中的存放格式一般是不同的…

Sentieon | 每周文献-Long Read Sequencing(长读长测序)-第七期

长读测序系列文章-1 标题(英文): PrecisionFDA Truth Challenge V2: Calling variants from short and long reads in difficult-to-map regions标题(中文): PrecisionFDA真相挑战第二版:利用短…

React源码解析18(2)------ FilberNode,FilberRootNode结构关系

摘要 在上一篇,我们实现了通过JSX转换为ReactElement的方法,也看到了转换后React元素的结构。但是这个React元素,并不能很清楚的表达组件之间的关系,以及属性的处理。 所以在React内部,会将所有的React元素转换为Fil…

银行高效办公神技,看完跪了!

在现代社会中,银行作为金融体系的关键组成部分,不仅需要保障日常的业务运作,还必须在电力故障等紧急情况下保持连续性。 蓄电池作为一种关键设备,需要持续的监控和维护,以确保其可靠性和性能。因此,银行网点…

Salesforce 助理认证和管理员认证有何区别?备考者应如何选择?

随着Salesforce生态系统对专业人员的需求不断增长,获得相关认证对于寻求职业发展的从业者来说至关重要。 对于刚接触Salesforce平台的人而言,Salesforce助理认证和Salesforce管理员认证是两个比较基础的认证。这两个认证有什么区别呢?从业者…

python爬虫实战(1)--爬取新闻数据

想要每天看到新闻数据又不想占用太多时间去整理,萌生自己抓取新闻网站的想法。 1. 准备工作 使用python语言可以快速实现,调用BeautifulSoup包里面的方法 安装BeautifulSoup pip install BeautifulSoup完成以后引入项目 2. 开发 定义请求头&#xf…

国内数字藏品行业现状分析

国内数字藏品行业现状分析 NFT与国内数字藏品的区别 数字藏品是NFT的一种应用形式,国内数字藏品与NFT本质区别在于国内数字藏品不具备NFT的金融属性及社交属性,与虚拟货币划清了明确的界限。 国内数字藏品所处的发展阶段 发展阶段(成长期)。 由于加密…

24届近5年中国计量大学自动化考研院校分析

今天给大家带来的是中国计量大学控制考研分析 满满干货~还不快快点赞收藏 一、中国计量大学 学校简介 中国计量大学是我国质量监督检验检疫行业唯一的一所本科院校,是一所计量标准质量检验检疫特色鲜明、多学科协调发展的普通高校,坐落于…

springboot添加swagger和knife简化接口测试

1、添加依赖 <!-- 接口测试包--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><!--排除swagger2的annotations和models依赖&#xff0c;然后再引入1.5.21版本的annotations和models…

Pr2022安装插件beat edit安装之后无法加载音乐怎么办?

你运行设置不对&#xff0c;安装好后试试管理员权限运行。 安装好插件后点击上方的窗口&#xff0c;然后再在里面找到扩展&#xff0c;继续点开里面有个BeatEdit&#xff0c;就是插件本身&#xff0c;点开。先选择一个加载音乐的选项&#xff0c;载入音乐先。这个时候可以按下…

一篇文章教会你什么是Linux进程控制

Linux进程控制 进程创建1.fork函数初识1.1那么fork创建子进程时&#xff0c;操作系统都做了什么呢&#xff1f;1.2 父子进程和CPU中的EIP&#xff08;指令指针&#xff09;之间存在一定的关系1.3 fork的常规用法有哪些&#xff1f;1.4 fork调用失败的原因有哪些&#xff1f; 2.…

TLS洪水攻击是什么,当网络加密成为一种负担怎么办?

今天&#xff0c;我们将深入研究一种典型的DDOS攻击类型——TLS洪水攻击&#xff0c;TLS&#xff08;传输层安全&#xff09;洪水攻击可以淹没大多数DDoS防护解决方案。因此如果您使用了错误的解决方案&#xff0c;意味着您的Web应用程序面临很大的风险&#xff01; 今天将由火…

云端同步、高效无界:5款免费的跨平台思维导图软件推荐!

思维导图是一种以图形化方式表示思想、概念或任务的方法&#xff0c;可以帮助用户梳理思维、提高记忆和理解。在工作中&#xff0c;思维导图可以用于会议记录、任务规划、项目管理等&#xff0c;帮助提高工作效率和团队协作能力&#xff1b;在学习中&#xff0c;思维导图可以用…

HA3 SQL样本实验:一种混合计算查询的全新样本解决方案

作者&#xff1a;陆唯一(芜霜) HA3&#xff08;对外开源代号&#xff1a;Havenask &#xff09;是阿里智能引擎团队自研的大规模分布式检索系统&#xff0c;广泛应用于阿里内部的搜索业务&#xff0c;是十多年来阿里在电商领域积累下来的核心竞争力产品。Ha3 SQL 是在原有Ha3引…