《OpenCV计算机视觉》—— 图像轮廓检测与绘制

文章目录

  • 一、轮廓的检测
  • 二、轮廓的绘制
    • 图像轮廓检测与绘制的代码实现
  • 三、轮廓的近似

一、轮廓的检测

  • 轮廓检测是指在包含目标和背景的数字图像中,忽略背景和目标内部的纹理以及噪声干扰的影响,采用一定的技术和方法来实现目标轮廓提取的过程
  • 注意:做轮廓检测前需要将图片读取为二值数据,即像素值只为0和255
  • 轮廓检测所用到的函数为 cv2.findcontours(img, 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:压缩模式,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廊信息。
  • 返回的参数:image,contours,hierarchy
    • image:返回处理的原图(在 OpenCV 4.x 中这个返回值已经被移除)
    • contours:包含图像中所有轮廓的list对象。其中每一个独立的轮廓信息以边界点坐标(x,y)的形式储存在numpy数组中。
    • hierarchy:轮廓的层次结构。一个包含4个值的数组:[Next,Previous,First child,Parent]
      • Next:与当前轮廓处于同一层级的下一条轮廓
      • Previous:与当前轮廓处于同一层级的上一条轮廓
      • First Child:当前轮廓的第一条子轮廓
      • Parent:当前轮廓的父轮廓

二、轮廓的绘制

  • cv2.drawContours()函数是用于在图像上绘制轮廓
  • 参数介绍:cv2.drawContours(image, contours, contourIdx, color, thickness=None
    lineType=None, hierarchy=None, maxLevel=None, offset=None)
    • image:要在其上绘制轮廓的输入图像(在原图中画)。
    • contours:轮廓列表,通常由cv2.findContours()函数返回。
    • contourIdx:要绘制的轮廓的索引。如果为负数,则绘制所有轮廓。–> -1
    • color:轮廓的颜色,以BGR格式表示。例如,(0,255,0)表示绿色。
    • thickness:轮廓线的粗细,默认值为1。
    • lineType:轮廓线的类型。默认值为cV2.LINE_8
    • hierarchy:轮廓层次结构。通常由cv2.findContours()函数返回.
    • maxLevel:绘制的最大轮廓层级。默认值为None,表示绘制所有层级。
    • offset:轮廓点的偏移量。默认值为None。

图像轮廓检测与绘制的代码实现

import cv2

# 读取图片
phone = cv2.imread('phone.png')
phone_gray = cv2.cvtColor(phone, cv2.COLOR_BGR2GRAY)  # 转换为灰度图

# 阙值处理为二值(黑白图像)
ret, phone_binary = cv2.threshold(phone_gray, 120, 255, cv2.THRESH_BINARY)
# 查找图像轮廓  cv2.RETR_LIST --> 查找所有轮廓,且不建立等级关系
_, contours, hierarchy = cv2.findContours(phone_binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
# 查看轮廓的层次结构
print(hierarchy)
# 查看一共有多少的轮廓
print(len(contours))

# 绘制所有的轮廓
Contours_show = cv2.drawContours(phone, contours=contours, contourIdx=-1, color=(0, 255, 0), thickness=3)

# 显示灰度图和在原图中绘出轮廓后的图
cv2.imshow('phone_gray', phone_gray)
cv2.imshow('Contours_show', Contours_show)

# 等待任意键按下后关闭所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 结果如下
    在这里插入图片描述

三、轮廓的近似

  • 轮廓的近似是计算机视觉和图像处理中的一个常用技术。它可以帮助我们简化轮廓的形状,去除一些不必要的细节,同时保持轮廓的主要形状特征。

  • 在OpenCV中,可以使用cv2.approxPolyDP()函数来近似一个轮廓。这个函数基于 Douglas-Peucker 算法,该算法通过迭代的方式简化轮廓的顶点集合,以生成一个近似于原始轮廓的多边形,但顶点数量更少。这在处理图像中的形状时非常有用,特别是当你想要去除轮廓上的小噪点或不必要的细节,同时保留其主要形状特征时。

  • 参数解释:cv2.approxPolyDP(curve, epsilon, closed)

    • curve:输入轮廓,通常是一个由点组成的 NumPy 数组,这些点定义了轮廓的形状。
    • epsilon:近似的精度参数。它是原始轮廓到近似多边形之间的最大距离。较小的 epsilon 值意味着近似多边形将更接近原始轮廓,但可能会包含更多的顶点。较大的 epsilon 值会导致生成一个更简单的多边形,但可能会丢失一些细节。
    • closed:一个布尔值,指定近似多边形是否应该是封闭的。如果为 True,则函数将确保近似多边形是封闭的,即第一个和最后一个顶点将相同。
  • 返回值 approx 是一个新的 NumPy 数组,包含了近似多边形的顶点。

  • 代码实现

    import cv2
    
    # 读取图像
    he = cv2.imread('he.png')
    
    # 转换为灰度图像
    he_gray = cv2.cvtColor(he, cv2.COLOR_BGR2GRAY)
    
    # 应用阈值处理
    ret, he_thresh = cv2.threshold(he_gray, 120, 255, cv2.THRESH_BINARY)
    
    # 查找轮廓
    _, contours, hierarchy = cv2.findContours(he_thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
    # 创建一个新图像用于绘制轮廓
    he_new = he.copy()
    
    # 遍历所有轮廓
    for cnt in contours:
        # 轮廓近似
        # cv2.arcLength()函数用于计算轮廓的周长(近似的精度设置为周长的0.2%)
        epsilon = 0.002 * cv2.arcLength(cnt, True)  # 可以调整epsilon的值以获得不同的近似精度
        approx = cv2.approxPolyDP(cnt, epsilon, True)
    
        # 绘制近似后的轮廓
        cv2.drawContours(he_new, [approx], 0, (0, 255, 0), 3)
    
    # 显示原始图像和带有轮廓的图像
    cv2.imshow('Original Image', he)
    cv2.imshow('Image with Contours', he_new)
    
    # 等待任意键按下后关闭所有窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 结果如下
      在这里插入图片描述
    • 由结果可以看出轮廓的近似结果就是一个近似于原始轮廓的多边行。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GPS/LBS/Wi-Fi定位,全安排!—合宙Air201资产定位模组LuatOS快速入门04

经历了hello world、点灯、远程控制三期基础教程,小伙伴们是不是收获满满,期待更高阶的应用呢? 本期,我们将学习合宙Air201的核心功能之一——定位功能! Air201定位示例教程 合宙Air201资产定位模组——是一个集成超…

TCP交互通讯在Windows中的频率

在基于TCP协议的交互式通讯中,通过网口进行数据传输时,Windows系统的通讯频率通常受到多方面的限制,很难稳定达到几千Hz。以下是关于频率范围的合理分析及提高频率的措施。 频率限制的原因: 网络延迟:TCP通讯的一个核心…

SpringBoot集成Thymeleaf模板引擎,为什么使用(详细介绍)

学习本技术第一件事:你为什么要使用,解决什么问题的? 1.为什么使用(使用背景)? 首先应用场景是单体项目,如果是前后端分离就不用关注这个了,因为单体项目你前后端都是写在一个项目…

【CTF MISC】XCTF GFSJ1086 [简单] 简单的base编码 Writeup(Base64编码+循环解码+Base92编码)

[简单] 简单的base编码 你懂base编码吗? 工具 在线BASE92编码解码:https://ctf.bugku.com/tool/base92 解法 Vm0wd2QyUXlVWGxWV0d4V1YwZDRWMVl3WkRSV01WbDNXa1JTVjAxV2JETlhhMUpUVmpBeFYySkVUbGhoTVVwVVZtcEJlRll5U2tWVWJHaG9UVlZ3VlZadGNFSmxSbGw1V…

MySQL详解:数据类型、约束

MySQL 1. 数据类型1.1 数值类型1.1.1 bit 位类型1.1.2 整数数据类型1.1.3 小数类型floatdecimal 1.2 字符类型1.2.1 char1.2.2 varchar 可变长字符串1.2.3 日期和时间类型datedatetimetimestamp 1.2.4 enum1.2.5 set集合查询函数 find_in_set 2. 表的约束2.1 NULL 空属性2.2 默…

《Linux运维总结:基于ARM64+X86_64架构CPU使用docker-compose一键离线部署mongodb 7.0.14容器版副本集群》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、部署背景 由于业务系统的特殊性,我们需要面向不通的客户安装我们的业务系统&…

[Visual Stuidio 2022使用技巧]2.配置及常用快捷键

使用vs2022开发WPF桌面程序时常用配置及快捷键。 语言:C# IDE:Microsoft Visual Studio Community 2022 框架:WPF,.net 8.0 一、配置 1.1 内联提示 未开启时: 开启后: 开启方法: 工具-选…

基于微信小程序的垃圾分类(lw+演示+源码+运行)

摘 要 随着生态文明体制改革的不断推进,可持续发展的环保理念逐渐成为社会共识,而在推行环保措施的过程中却困难重重.针对生活废弃物肆意无序投放的问题,尽管目前各大城市相继推出垃圾分类强制性执行的政策法规,但因市民欠缺对垃圾种类的正确认识而导致垃圾分类的施行难度和成…

Luban策划开源工具

一、Luban游戏配置解决方案,是一个强大、易用、优雅、稳定的游戏配置解决方案。它设计目标为满足从小型到超大型游戏项目的简单到复杂的游戏配置工作流需求。luban标准化了游戏配置开发工作流,可以极大提升策划和程序的工作效率。 二、核心特性&#xf…

【代码随想录训练营第42期 Day58打卡 - 图论Part8 - 拓扑排序

目录 一、拓扑排序介绍 定义 特点 实现方法(2种) 应用 二、题目与题解 题目:卡码网 117. 软件构建 题目链接 题解:拓扑排序 - Kahn算法(BFS) 三、小结 一、拓扑排序介绍 对于拓扑排序&#xff0c…

攻防世界 ics-05

ics-05 隐藏的变量传参,php弱类型比较 只有设备维护中心可以点击进去 查看源码,发现有个隐藏的超链接变量传参 看到变量传参,有可能存在文件包含漏洞读取源码,这个站是php的站,所以可以使用php伪协议读取源码 index.p…

Web 原生组件化方案:Web Components

你好,我是沐爸,欢迎点赞、收藏、评论和关注。 Web 组件化是一种将Web应用的UI部分拆分成可复用的独立组件的架构方法。这种方法有助于提高代码的可维护性、可重用性和可测试性。 而Web Components 标准则提供了一套原生的API,允许开发者创建…

IDEA 通义灵码 插件使用体验

目录 前言 主要功能 演示代码 解释代码 生成单元测试 生成代码注释 生成优化建议 代码片段补全 总结 前言 自从 AI 技术开始大规模应用,老板就想让下面的牛马借助 AI 工具来提高编码效率,由于团队都没有在实际编码中深度使用过 AI 工具&#x…

视频推拉流/直播点播EasyDSS平台安装失败并报错“install mediaserver error”是什么原因?

TSINGSEE青犀视频推拉流/直播点播EasyDSS平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务,在应用场景中可实现视频直播、点播、转码、管理、录像、检索、时移回看等。此外,平台还支持用户自行上传视频文件,也可…

【物联网技术大作业】设计一个智能家居的应用场景

前言: 本人的物联网技术的期末大作业,希望对你有帮助。 目录 大作业设计题 (1)智能家居的概述。 (2)介绍智能家居应用。要求至少5个方面的应用,包括每个应用所采用的设备,性能&am…

【深度学习】神经网络-怎么分清DNN、CNN、RNN?

怎么分清DNN、CNN、RNN? 最“大”的概念是人工神经网络(Artificial Neural Network, ANN),它是较为广泛的术语,通常指的是一类模拟生物神经网络的数学模型,其中包括神经元、权重和连接。在这个术语下&#…

【Redis】主从复制 - 源码

因为主从复制的过程很复杂, 同时核心逻辑主要集中在 replication.c 这个文件中, 避免篇幅过大, 所以将主从复制中涉及这个文件的代码集中到了另一篇文章。 在当前文章主要分析主从复制的大体代码逻辑, 如果需要了解整体的过程, 可以配合 Redis 主从复制 - relication 源码分析 …

iOS 知识点记录

王巍 博客地址:OneVs Den git地址:onevcat (Wei Wang) GitHub 江湖人称喵神,目前就职于line。喵神的博客涉及方面比较广, 有Obejctive-C, Swift, SwiftUI, Unity等等。博客内容很有深度,非常值得关注。 戴铭 博客地址&#xff1…

ESP32-WROOM-32 开篇(刚买)

简介 买了一个ESP32-WROOM-32模块的开发板, 记录板初上机细节。 模块简介 Look 连接PC 1. 解决驱动问题 https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tabdownloads 下载驱动, 如下图 解压缩下载的包, 然后电机64位的版本, 一直…

汽车无钥匙启动功能工作原理

移‌动管家无钥匙启动‌是一种科技化的汽车启动方式,它允许车主在不使用传统钥匙的情况下启动车辆。这种技术通过智能感应系统实现,车主只需携带智能钥匙,当靠近车辆时,车辆能够自动解锁并准备启动。启动车辆时,车主无…