OpenCV-Python(21):轮廓层次结构

news2024/11/28 0:43:19

目标

  • 学习轮廓的层次结构,了解轮廓之间的父子关系

原理

        在前面的内容中我们使用函数cv2.findContours() 来查找轮廓的时候,我们会传入一个参数:轮廓提取模式(Contour_Retrieval_Mode)。我们总是把它􄕭置为cv2.RETR_LIST 或者是cv2.RETR_TREE,效果效果还是可以得。但是它们到底代表什么呢?
        同时,我们得到的结果包含3 个数组,第一个图像,第二个是轮廓,第三个是层次结构。但是我们从来没有用过层次结构。层次结构是用来干嘛的呢?层次结构与廓提取模式有什么关系呢?这将是我们将要进行学习和讨论的。

什么是层次结构

        通常我们使用函数cv2.findContours 在图片中查找一个对像。有时对可能位于不同的位置,还有些情况,一个形状在另外一个形状的内部。这种情况下我们称外部的形状为父,内部的形状为子。按照这种方式分类,一幅图像中的所有轮廓之间就建立父子关系。这样我们就可以确定一个轮廓与其他轮廓是怎样连接的,比如它是不是某个轮廓的子轮廓或者是父轮廓。这种关系就成为组织结构,下图就是一个简单的例子:

        在这幅图像中,我给这几个形状编号为0-5。2 和2a 分别代表最外矩形的外轮廓和内轮廓。在这里面轮廓0、1、2 在外部或最外面。我们可以称他们为(组织结构)0 级,简单来说就是他们属于同一级。 

        接下来轮廓2a。我们把它当成轮廓2 的子轮廓。它就成为(组织结构)第1 级。同样,轮廓3是轮廓2 的子轮廓,成为(组织结构)第3 级。最后轮廓4,5 是轮廓3a 的子轮廓,成为(组织结构)第4 级(最后一级)。按照这种方式给这些形状编号,我们可以说廓4 是轮廓3a 的子轮廓,当然轮廓5 也是。我说这么多就是为了解释层次结构、外轮廓、内轮廓、父轮廓、子轮廓等。

OpenCV 中层次结构

        不管层次结构是什么样的,每一个轮库包含自己的信息:谁是父,谁是子等。OpenCV 使用一个含有四个元素的数组表示。[Next,Previous,First_Child,Parent]。

        Next 示同一级组织结构中的下一个轮廓。

        以上图中的轮廓0 为例,轮廓1 就是他的Next。同样轮廓1 的Next是2,Next=2。那么轮廓2 呢,在同一级没有Next。此时Next=-1。而轮廓4 的Next为5,所以它的Next=5。

        Previous 表示同一级结构中的前一个轮廓。

        与前面一样,轮廓1 的Previous 为轮廓0,轮廓2 的Previous 为轮廓1。轮廓0 没有Previous,所以Previous=-1。

        First_Child 表示它的第一个子轮廓。
        没有必要再解释了,轮廓2 的子轮廓为2a。所以它的First_Child 为2a。那么廓3a 呢,它有两个子轮廓。但是我们只要第一个子轮廓,所以是轮廓4(按照从上往下/从左往右的顺序排序)。

        Parent 表示它的父轮廓。
        与First_Child 刚好相反。轮廓廓4 和5 的父轮廓是轮廓3a。而轮廓3a的父轮廓是3。

 轮廓检索模式

        我们上面了解了OpenCV 中的轮廓廓组织结构。下面我们还是根据上面的图片再学习一下轮廓检索模式cv2.RETR_LIST,cv2.RETR_TREE,cv2.RETR_CCOMP,cv2.RETR_EXTERNAL到底代表什么意思?

  • RETR_LIST

        从解释的角度来看,这应该是最简单的。它只是提取所有的轮廓,而不去创建任何父子关系。换句话说,就是人人平等,它们属于同一级组织轮廓(如果你不关心轮廓之间的关系,这是一个非常好的选择)。所以在这种情况下,组织结构数组的第三和第四个数都是-1。但是很明显,Next 和Previous 应有对应的值。

        下面就是我得到的结果,每一行是对应轮廓的组织结构细节。例如,第一行对应的是轮廓0。下一个轮廓为1,所以Next=1。前面没有其他的轮廓,所以Previous=0。接下来的两个参数是-1,与刚才我们说的一样。

  • RETR_EXTERNAL 

        如果你选择这种模式的话,只会返回最外层的轮廓,所有的子轮廓都会被忽略掉。(当你只想得到最外面的轮廓时,你可以用这种模式,在有些情况下很有用)所以在上图中使用这种模式的话,只会返回最外层的轮廓(第0 级),轮廓廓0、1、2。下面是我选择这种模式得到的结果:

  • RETR_CCOMP 

        在这种模式下会返回所有的轮廓并将轮廓分为两级组织结构。例如,一个对象的外轮廓为第1 级组织结构。而对象内中空洞的轮廓为第2 级组织结构,空洞中的任何对象的轮廓又是第1 级组织结构。空洞的组织结构为第2 级。
        想象一下一副黑底白字的图像,图像中是数字0。0 的外边界属于第一级组织结构,0 的内部属于第2 级组织结构。我们可以以下图为例简单介绍一下。我们已经用红色数字为这些轮廓编号,
并用绿色数字代表它们的组织结构。顺序与OpenCV 检测轮廓的顺序一致。

        现在我们考虑轮廓0,它的组织结构为第1 级。其中有两个空洞1 和2,它们属于第2 级组织结构。所以对于轮廓0 来说,他属于同一级组织结构的下一个(Next)是轮廓3,并且没Previous。它的Fist_Child 为轮廓1,组织结构为2。由于它是第1 级,所以没有父轮廓。因此它的组织结构数组为[3,-1,1,-1]。

        现在是轮廓1,它是第2 级。处于同一级的下一个轮廓为2。没有Previous,也没有Child(因为是第2 级所以有父轮廓)父轮廓是0。所以数组是[2,-1,-1,0]。
        轮廓2,它是第2 级。在同一级的组织结构中没有Next。Previous 为轮廓1。没有子􈙽,父轮廓为0,所以数组是[-1,1,-1,0]。

        轮廓3,它是第1 级。在同一级的组织结构中Next 为5。Previous 为轮廓0。子为4,没有父轮廓,所以数组是[5,0,4,-1]。

        轮廓4,它是第2 级。在同一级的组织结构中没有Next。没有Previous,没有子,父轮廓为3,所以数组是[-1,-1,-1,3]。

下面是我得到的答案:

  • RETR_TREE 

        终于到最后一个了,也是最完美的一个。这种模式下会返回所有轮廓,并且创建一个完整的组织结构列表。它甚至会告诉你,谁是爷爷,谁是爸爸,谁是儿子,谁是孙子等。

        还是以上图为例,使用这种模式对OpenCV 返回的结果重新排序并分析它,红色数字是边界的序号,绿色是组织结构。

        轮廓0 的组织结构为0,同一级中Next 为7,没有Previous。子轮廓是1,没有父轮廓。所以数组是[7,-1,1,-1]。 

        轮廓1 的组织结构为1,同一级中没有其他,没有Previous。子轮廓是2,父轮廓为0。所以数组是[-1,-1,2,0]。

        剩下的自己算一下吧。下面是结果:

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

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

相关文章

css+js实现鼠标移动边框高亮效果

前言&#xff1a;效果是鼠标移入空白区域&#xff0c;边框高亮的效果。效果是在douyin的渡一教育袁老师的课程学习到的&#xff0c;观看以后是一个实用的小特效。想看的可以平台查询&#xff0c;自己也学到了知识。 <!DOCTYPE html> <html lang"en"> <…

Erlang、RabbitMQ下载与安装教程(windows超详细)

目录 安装Erlang 1.首先安装RabbitMQ需要安装Erlang环境 2.点击下载好的.exe文件进行傻瓜式安装,一直next即可 3.配置Erlang环境变量 安装RabbitMQ 1.给出RabbitMQ官网下载址&#xff1a;Installing on Windows — RabbitMQ&#xff0c;找到 2.配置RabbitMQ环境变量&#xff0…

3. Bean 的配置

配置信息的继承 查看下面两个 Employee 的配置&#xff0c;其中 dept 属性是重复的: <bean id"dept" class"com.parent.bean.Department"><property name"deptId" value"100"/><property name"deptName" v…

#define定义宏

#define的定义范围 #define不光可以定义变量&#xff0c;常量&#xff0c;还可以定义几乎所有的东西&#xff0c;因为#define可以定义一串代码&#xff08;即宏&#xff09;&#xff0c;所以包含在代码中的东西都能被定义。 #define定义宏 定义是宏名必须于它的参数括号紧挨&am…

秋招复习篇之代码规范

目录 前言 1、变量命名 2、代码空格 1&#xff09;操作符左右一定有空格&#xff0c; 2&#xff09;分隔符&#xff08;, 和;&#xff09;前一位没有空格&#xff0c;后一位保持空格&#xff0c;例如&#xff1a; 3&#xff09;大括号和函数保持同一行&#xff0c;并有一个空格…

2024年第三届服务机器人国际会议(ICoSR 2024) | Ei、Scopus双检索

会议简介 Brief Introduction 2024年第三届服务机器人国际会议(ICoSR 2024) 会议时间&#xff1a;2024年7月26日-28日 召开地点&#xff1a;中国杭州 大会官网&#xff1a;www.iwosr.org 进入新时代&#xff0c;科技更新迭代快速发展&#xff0c;机器人不仅变得更加节能&#x…

SpringBoot+AOP+Redis 防止重复请求提交

本文项目基于以下教程的代码版本&#xff1a; https://javaxbfs.blog.csdn.net/article/details/135224261 代码仓库: springboot一些案例的整合_1: springboot一些案例的整合 1、实现步骤 2.引入依赖 我们需要redis、aop的依赖。 <dependency><groupId>org.spr…

【滑动窗口】【二分查找】C++算法:和至少为 K 的最短子数组

作者推荐 动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本 本题涉及知识点 滑动窗口 有序向量 二分查找 LeetCode862:和至少为 K 的最短子数组 给你一个整数数组 nums 和一个整数 k &#xff0c;找出 nums 中和至少为 k 的 最短非空子数组 &#xff0c;并返回…

5G时代的电商:超高速网络如何改变购物体验?

随着5G技术的不断发展和商业化推广&#xff0c;超高速网络正深刻地改变着人们的生活方式&#xff0c;其中最显著的之一便是电子商务领域。本文将深入探讨5G时代电商的发展趋势&#xff0c;以及超高速网络如何深刻改变用户的购物体验。 5G技术的崛起 5G技术是第五代移动通信技术…

nfs高可用部署

一、前言 为了避免nfs单点问题导致的服务不可用&#xff0c;使用以下架构实现nfs的高可用&#xff0c;keepalivedinotifyrsyncnfs&#xff0c;keepalived实现nfs的高可用&#xff0c;inotify持续监控nfs数据目录的变化&#xff0c;发生变化后通过rsync进行同步到备节点&#xf…

元旦快到了,分享一些元旦祝福模板

元旦-王安石 爆竹声中一岁除&#xff0c;春风送暖入屠苏。 千门万户曈曈日&#xff0c;总把新桃换旧符。 元旦其实也是中国的传统节日了&#xff0c;不过元旦是由中国的春节演化而来的。传统的元旦时间是正月初一&#xff0c;从王安石的诗也能看的出来&#xff0c;其实描述的…

Apache Doris (五十六): Doris Join类型 - 四种Join对比

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 Doris 支持两种物理算子,一类是…

Linux自定义shell编写

Linux自定义shell编写 一.最终版本展示1.动图展示2.代码展示 二.具体步骤1.打印提示符2.解析命令行3.分析是否是内建命令1.shell对于内建名令的处理2.cd命令3.cd函数的实现4.echo命令的实现5.export命令的实现6.内建命令函数的实现 4.创建子进程通过程序替换执行命令5.循环往复…

RabbitMQ是做什么的

rabbitMQ是做异步通讯的。用于解决同步同讯的拓展性差&#xff0c;级联失败的问题。 异步调用方式其实就是基于消息通知的方式&#xff0c;一般包含三个角色:。 消息发送者:投递消息的人&#xff0c;就是原来的调用方 消息代理:管理、暂存、转发消息&#xff0c;你可以把它理…

060:vue中markdown编辑器mavon-editor的应用示例

第060个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

Hadoop之Yarn 详细教程

1、yarn 的基本介绍和产生背景 YARN 是 Hadoop2 引入的通用的资源管理和任务调度的平台&#xff0c;可以在 YARN 上运行 MapReduce、Tez、Spark 等多种计算框架&#xff0c;只要计算框架实现了 YARN 所定义的 接口&#xff0c;都可以运行在这套通用的 Hadoop 资源管理和任务调…

兔子目标检测数据集VOC格式3900张

兔子是一类可爱的哺乳动物&#xff0c;拥有圆润的脸庞和长长的耳朵&#xff0c;身体轻盈柔软。它们通常是以温和和友善的形象出现在人们的视野中&#xff0c;因此常常成为童话故事和卡通形象中的角色。 兔子是草食性动物&#xff0c;主要以各种草本植物为食&#xff0c;包括草…

数字 IC 笔试易混淆整理

signed 扩展 比较以下4段代码&#xff0c;给出W_DATA2的结果&#xff08;十进制或16进制或二进制&#xff09;&#xff1b; wire signed [3:0] W_DATA1 4b1000; wire signed [7:0] W_DATA2; assign W_DATA2 W_DATA1; wire [3:0] W_DATA1 4b1000; wire signed [7:0] W_DA…

【Docker】添加指定用户到指定用户组

运行Docker ps命令&#xff0c;报错&#xff1a;/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied 创建docker用户组 安装docker时默认已经创建好 sudo groupadd docker添加用户加入docker用户组 此处以用户user为例 sudo usermo…

@Zabbix监控网络设备Trap接口UPDOWN关联告警配置

网络设备Trap接口UPDOWN关联告警配置 文章目录 网络设备Trap接口UPDOWN关联告警配置SNMPTrap描述1.监控平台监控项配置2.监控平台日志接收3.监控平台触发器配置4.监控平台触发器功能测试1&#xff09;告警触发2&#xff09;告警恢复 5.告警解析 SNMPTrap描述 在Zabbix中&#x…