【OpenCV-Python】15.OpenCV的图像轮廓——查找轮廓

  • Post author:
  • Post category:python




15.OpenCV的图像轮廓——查找轮廓





前言


图像轮廓是指由位于边缘、连续的、具有相同颜色和强度的点构成的曲线,它可以用于形状分析以及对象检测和识别。




一、查找轮廓


cv2.findContours()函数用于从二值图像中查找图像轮廓,其基本格式如下:

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

contours为返回的轮廓
hierarchy为返回的轮廓层次结构
image为原图像
mode为轮廓的检索模式
method为轮廓的近似方法
offset为每个轮廓点移动的可选偏移量
img = cv2.imread('shapes.jpg')
cv2.imshow('shapes', img)

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('img_gray', img_gray)

ret, thresh = cv2.threshold(img_gray, 125, 255, cv2.THRESH_BINARY)
cv2.imshow('thresh', thresh)

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_TC89_L1)

img1 = np.zeros(img.shape, np.uint8) + 255
cv2.polylines(img1, [contours[0]], True, (255,0,0), 2)

img2 = np.zeros(img.shape, np.uint8) + 255
cv2.polylines(img2, [contours[1]], True, (255,0,0), 2)

img3 = np.zeros(img.shape, np.uint8) + 255
cv2.polylines(img3, [contours[2]], True, (255,0,0), 2)


cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)

cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

print('轮廓:',contours)
print('轮廓类型:',type(contours))
print('轮廓个数:',len(contours))
print('层次:',hierarchy)
print('层次类型:',type(hierarchy))

在这里插入图片描述



1、cv2.findContours()函数返回结果


cv2.findContours()函数返回一个list对象,保存了轮廓数组。轮廓数组的每一个元素都是一个表示轮廓的array对象,返回的轮廓层次是一个numpy.ndarray对象。



2、轮廓层次


根据轮廓的嵌套关系,可将轮廓之间的层次关系分为父级和子级,外部的轮廓为父级,内部的轮廓为子级。


cv2.findContours()函数返回的轮廓层次中,numpy.ndarray对象中的每一个元素表示的层次关系为:[下一个轮廓 前一个轮廓 第一个子级轮廓 父级轮廓]。例如[-1 0 2 -1]中,-1表示不存在对应的轮廓,前一个轮廓在轮廓数组中的序号为0,第一个子级轮廓在轮廓数组中的序号为2.



3、轮廓的检索模式

检索模式mode 说明
cv2.RETR_LIST 仅检索所有轮廓,不创建任何父子关系
cv2.RETR_EXTERNAL 仅检索所有外部轮廓,不包含子级轮廓
cv2.RETR_CCOMP 检索所有轮廓并将它们排列为2级层次结构,所有外轮廓为1级,所有子级轮廓为2级
cv2.RETR_TREE 检索所有轮廓不创建完整的层次列表,如父级、子级、孙子级等



4、轮廓的近似方法

近似方法method 说明
cv2.CHAIN_APPROX_NONE 存储所有轮廓点,轮廓的任意两个相邻点是水平、垂直或对角线上的邻居
cv2.CHAIN_APPROX_SIMPLE 只保存水平、垂直和对角线的端点
cv2.CHAIN_APPROX_TC89_L1 应用Teh-Chin链逼近算法中的一种确定轮廓点



二、OpenCV-Python资源下载


OpenCV-Python测试用图片、中文官方文档、opencv-4.5.4源码




总结


以上内容介绍了OpenCV-Python的查找轮廓操作,有关Python、数据科学、人工智能等文章后续会不定期发布,请大家多多关注,一键三连哟(●’◡’●)。



版权声明:本文为weixin_43843069原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。