图像轮廓检索函数cv2.findContours

news/2024/11/15 3:46:17/

findContours

findContours函数主要作用是从二值图中检索轮廓。

用法

import cv2cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

参数

  • image:8-bit单通道图像。该图像会将非0像素值视为1,0像素值视为0,因此也被视为二值图像。
  • mode:轮廓检索模式,检测外轮廓还是内轮廓,是否包含继承(包含)关系: cv2.RETR_EXTERNAL 表示只检测外轮廓,忽略轮廓内部的结构,无继承相关信息;cv2.RETR_LIST 检测所有的轮廓但不建立继承(包含)关系;cv2.RETR_CCOMP 检测所有轮廓,但是仅仅建立两层包含关系;cv2.RETR_TREE 检测所有轮廓,并且建立所有的继承(包含)关系。
  • method:轮廓近似方法,有记录方法:cv2.CHAIN_APPROX_NONE 存储所有的轮廓点,相邻的两个点的像素位置差不超过 1,即 max(abs(x1-x2), abs(y1-y2))=1cv2.CHAIN_APPROX_SIMPLE 压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩阵轮廓只需 4 个点来保存轮廓信息。
  • contours:返回值,检测到的轮廓。每个轮廓都以点向量的形式存储。
  • hierarchy:返回值,包含有关图像轮廓的拓扑信息。它的元素和轮廓的数量一样多。对于第 i i i个轮廓contours[i],元素hierarchy[i][0]hierarchy[i][1]hierarchy[i][2]hierarchy[i][3]分别设置为同一层次的下一个轮廓、同一层次的上一个轮廓、该轮廓的第一个子轮廓(嵌套轮廓)、该轮廓的父轮廓,它们的取值是轮廓的索引值(从0开始)。如果contours[i]没有与其同级的下一个轮廓、上一个轮廓、嵌套轮廓或父轮廓,则hierarchy[i]的相应元素将为负。

    hierarchy表示连通域的继承关系矩阵。矩阵大小为 ( 1 , N , 4 ) (1,N,4) (1,N,4)
    基础元素由四个值组成:[Next, Previous, First_Child, Parent]。前两个值表示同级的前后关系,后两个值表示上下级关系
    Next:下一个同级的轮廓的序号;
    Previous:上一个同级轮廓的序号;
    First_Child:第一个子轮廓的序号;
    Parent:父轮廓的序号;
    矩阵中的每一个值代表都是 轮廓(contour)的序号(id),其中 -1 代表没有这个元素。

  • offset:可选偏移量,每个轮廓点偏移量。如果从图像ROI中提取轮廓,然后在整个图像上下文中对其进行分析,这将非常有用。

实例

针对下面的图片,我们检索它的轮廓:
在这里插入图片描述

import cv2img = cv2.imread('image001.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换为灰度图ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)  # 利用阈值自动选择的方法获取二值图像contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  # 检测轮廓# 打印轮廓
print("轮廓长度:",len(contours))
print("contours[2]:\n",contours[2])
# 打印继承矩阵
print("hierarchy:\n",hierarchy)

输出:

轮廓长度:7
contours[2]:[[[ 47 137]][[ 48 136]][[ 49 137]][[ 49 138]][[ 48 139]][[ 47 138]]]
hierarchy:[[[-1 -1  1 -1][ 2 -1 -1  0][ 3  1 -1  0][-1  2  4  0][ 5 -1 -1  3][ 6  4 -1  3][-1  5 -1  3]]]

结果解析:
从上述结果中,可以得到以下结论:

  • 轮廓的长度为7;
  • 对第3个轮廓进行打印,可以看到,轮廓确实是以点集的形式存储的;
  • 图像轮廓的拓扑信息hierarchy,也称作连通域的继承关系矩阵,大小为 ( 1 , 7 , 4 ) (1,7,4) (1,7,4)

轮廓的排序是从最外围往中间进行的排序,contours[0]表示的是最外层外轮廓。

hierarchy矩阵解释:
hierarchy[0]=[-1 -1 1 -1]表示轮廓contours[0]的拓扑关系,Next =-1表示下一个与contours[0]同级的轮廓,-1表示不存在下一个同级轮廓;Previous = -1表示上一个与contours[0]同级的轮廓,-1表示不存在上一个同级轮廓;First_Child = 1表示contours[0]第一个子轮廓是contours[1], 1是轮廓的索引;Parent = -1表示contours[0]的父轮廓,-1表示不存在父轮廓。


http://www.ppmy.cn/news/325379.html

相关文章

在cv2.findContours函数使用中,报ValueError: not enough values to unpack (expected 3, got 2)

cv2.findContours()函数 cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]]) 其中 第一个参数是需要寻找轮廓的图像; 第二个参数是轮廓的检索模式,有四种方式: cv2.RETR_EXTERNAL表示只检测外轮廓cv2.RETR_LIST检…

cv2.cv2.findContours opencv-python

cv2.findContours用于轮廓检测,其输入为二值图像 输入: 有三个输入参数:输入图像(二值图像),轮廓检索方式,轮廓近似方法 轮廓检索方式 mode 含义 cv2.RETR_EXTERNAL 只检测外轮廓信息 cv2.RETR…

python-opencv2利用cv2.findContours()函数来查找检测物体的轮廓

版权声明:本文为CSDN博主「hjxu2016」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/hjxu2016/article/details/77833336 轮廓检测 轮廓检测也是图像处理中经常用到的…

cv2.threshold()、cv2.findContours(),cv2.findContours图片轮廓处理

参数及含义cv2.threshold threshold(src, thresh, maxval, type[, dst]) -> retval, dst,第一个返回值是**阈值**的float型,第二个返回值是图片像素处理后的结果。cv2.threshold(img,threshold,maxval,type) img:必须是灰度图,是8-bit或3…

cv2.findContours() 图像的轮廓

cv2.findContours(image, mode, method, contoursNone, hierarchyNone, offsetNone)参数: image:寻找轮廓的图像,注意输入的图片必须为二值图片。若输入的图片为彩色图片,必须先进行灰度化和二值化 mode:轮廓的检索模…

cv2.findcontours返回值

cv2.findContours() 函数返回值是三个参数: contours:图像轮廓的列表,其中每个轮廓是一个 Numpy 数组,包含该轮廓上的所有点的坐标。 hierarchy:图像中各轮廓的层次关系的信息,表示轮廓的父轮廓、子轮廓和兄…

opencv(13):cv2.findContours、cv::findContours简要介绍及opencv各版本cv2.findContours函数说明

目录 1. findContours函数 1.1. 轮廓contours 1.2 cv2.findContours、cv::findContours函数简介 1.3 参数说明: 2. opencv各版本cv2.findContours说明 2.1 opencv3.x 2.2 opencv2.x和4.x 3 cv2.findContours使用示例: 3.1 opencv3.x版本 4.…

cv2.findContours()函数

整理一下cv2.findContours()函数使用的相关注意事项。 示例代码: image,contours,hierarchy cv2.findContours(contour,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 输入: contour:带有轮廓信息的图像; cv2.RETR_TREE&#xff1a…