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

发布时间:2023年12月29日

目标

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

原理

????????在前面的内容中我们使用函数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。下面是我选择这种模式得到的结果:

文章来源:https://blog.csdn.net/mzl_18353516147/article/details/135282211
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。