Python OpenCV 基于图像边缘提取的轮廓发现函数

阿麦
阿麦
发布时间:2026-10-14 | 5人浏览过
原创

本文详解Python OpenCV中基于图像边缘提取的轮廓发现技术。通过阈值分割与边缘检测提取目标,利用cv2.findContours函数获取轮廓点集及层次结构,并介绍RETR_EXTERNAL等检索模式及CHAIN_APPROX_SIMPLE等逼近方法。最后通过cv2.drawContours实现轮廓可视化绘制,附带完整测试代码与运行结果分析。

基础知识铺垫

在图像处理领域,轮廓被定义为连接具有相同颜色或灰度值的连续边界点的曲线。这些轮廓信息广泛应用于形状分析、对象检测以及物体识别等场景。

轮廓发现的基本原理是先对图像进行阈值分割以提取目标物体,随后通过边缘检测技术获取该物体的轮廓边界。从数据结构角度看,一个轮廓由一系列有序排列的像素点组成,这些点共同构成了一个封闭的点集合。

在OpenCV库中,cv2.findContours 函数专门用于检测图像中的边缘信息。

函数原型说明


contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

本文示例基于 Python OpenCV 4.0 及以上版本。若使用 3.0 以上版本,需注意返回值可能存在差异。具体参数说明如下:

  • image:作为输入图像的变量;
  • mode:指定轮廓的检索模式,详细解释见后文;
  • method:定义轮廓的逼近方法,具体解释见后文;
  • contours:函数返回检测到的轮廓列表;
  • hierachy:存储每条轮廓对应的层次结构信息;
  • offset:可选的偏移量,用于移动每个轮廓点。

注意:image 参数必须传入二值化图像,而非灰度图像。该函数的返回值包括检测到的轮廓列表以及表示轮廓间层级关系的层次结构。

轮廓检索模式共有四种类型:

  • cv2.RETR_EXTERNAL:仅检测最外层轮廓,忽略内部孔洞或嵌套结构;
  • cv2.RETR_LIST:检测所有轮廓,但不建立任何等级或层级关系;
  • cv2.RETR_CCOMP:构建两个等级的轮廓结构。顶层为外边界,下一层为内孔的边界信息。若内孔中还存在连通物体,该物体的边界也将位于顶层;
  • cv2.RETR_TREE:构建完整的等级树结构轮廓。上述内容的官方文档可访问官网地址查询。

轮廓逼近方法介绍

  • cv2.CHAIN_APPROX_NONE:存储轮廓中的所有点,确保相邻两个点的像素位置差不超过 1,即满足 max(abs(x1-x2),abs(y2-y1))==1 条件。此方法通常较少使用;
  • cv2.CHAIN_APPROX_SIMPLE:压缩水平、垂直以及对角线方向的元素,仅保留该方向的终点坐标。例如,一个矩形轮廓仅需 4 个点即可保存其全部信息;
  • cv2.CHAIN_APPROX_TC89_L1 和 cv2.CV_CHAIN_APPROX_TC89_KCOS:分别对应使用 teh-Chinl chain 近似算法。由于相关资料较少,此处未做深入学习;

理解上述参数后,即可应用轮廓发现函数。具体代码如下:


import cv2 as cv

src = cv.imread("./both.jpeg")

gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(gray, 150, 255, 0)
cv.imshow("thresh",thresh)
# 寻找轮廓
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

获取轮廓后,还需通过 cv2.drawContours 函数将轮廓绘制到图像上。该函数的原型如下:


image = cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])

参数说明如下:

  • image:输入图像;
  • contours:轮廓数据,在 Python 中表现为 list 类型,即由 cv2.findContours 函数提取的点集列表;
  • contourIdx:指定绘制轮廓列表中哪一条轮廓的索引,若需绘制所有轮廓,请传递 -1;color:指定绘制颜色;
  • thickness:线条厚度,若设置为 -1,则表示填充轮廓内部;
  • lineType:指定线条类型;
  • hierarchy:可选的层次结构信息;
  • maxLevel:绘制轮廓的最大层级。0 表示仅绘制指定轮廓,1 表示绘制轮廓及所有嵌套轮廓,2 表示绘制轮廓、所有嵌套轮廓及其嵌套的嵌套轮廓;
  • offset:轮廓偏移参数。

以下是测试代码与运行结果展示:


import cv2 as cv
# help(cv.drawContours)
src = cv.imread("./both.jpeg")

gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(gray, 150, 255, 0)
cv.imshow("thresh",thresh)
# 寻找轮廓
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

# print(contours)
# print(hierarchy)
# 绘制轮廓
cv.drawContours(src,contours,-1,(200,0,150),2)

cv.imshow('src',src)
cv.waitKey(0)

到此这篇关于Python OpenCV 基于图像边缘提取的轮廓发现函数的文章就介绍到这了,更多相关OpenCV 边缘提取轮廓 内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表