查找图像轮廓

简介: 【6月更文挑战第11天】查找图像轮廓。

cv2.findContours()函数用于从二值图像中查找图像轮廓,其基本格式如下。
contours,hierarchy=cv2.findContours(image,mode,method[,offset])
参数说明如下。
contours为返回的轮廓。
hierarchy为返回的轮廓的层次结构。
image为原图像。
mode为轮廓的检索模式。
method为轮廓的近似方法。
offset为每个轮廓点移动的可选偏移量。
示例代码如下。

查找轮廓

import cv2
import numpy as np
img=cv2.imread('shapes.jpg') #读取图像
cv2.imshow('original',img) #显示原图像
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #将其转换为灰度图像
ret,img2=cv2.threshold(gray,125,255,cv2.THRESH_BINARY) #二值化阈值处理
c,h=cv2.findContours(img2,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) #查找轮廓
print('轮廓:',c)
print('轮廓类型:',type(c))
print('轮廓个数:',len(c))
print('层次:',h)
print('层次类型:',type(h))
for n in(range(3)):
img3=np.zeros(img.shape, np.uint8)+255 #按原图大小创建一幅白色图像
cv2.polylines(img3,[c[n]],True,(255,0,0),2) #绘制轮廓
cv2.imshow('%s' % n,img3) #显示轮廓图像
cv2.waitKey(0) #按任意键结束等待
cv2.destroyAllWindows() #关闭所有窗口
1.cv2.findContours()函数返回结果
cv2.findContours()函数返回一个list对象,保存了轮廓数组。轮廓数组的每个元素都是一个表示轮廓的array对象;返回的轮廓层次是一个numpy.ndarray对象。
2.轮廓层次
根据轮廓的嵌套关系,可将轮廓之间的层次关系分为父级和子级,外部的轮廓为父级,内部的轮廓为子级。例如,图5-4所示的轮廓1是轮廓2的父级,轮廓0和轮廓1同级。
cv2.findContours()函数返回的轮廓层次中,numpy.ndarray对象中的每个元素表示的层次关系格式为:[下一个轮廓 前一个轮廓 第一个子级轮廓 父级轮廓]。例如,[-1 0 2 -1]中,-1表示不存在对应的轮廓,前一个轮廓在轮廓数组中的序号为0,第一个子级轮廓在轮廓数组中的序号为2。
3.轮廓的检索模式
cv2.findContours()函数中的mode参数用于设置轮廓的检索模式,不同检索模式下函数返回的轮廓有所不同。mode参数可设置为下列常数。
cv2.RETR_LIST:仅检索所有轮廓,不创建任何父子关系。
cv2.RETR_EXTERNAL:仅检索所有的外部轮廓,不包含子级轮廓。
cv2.RETR_CCOMP:检索所有轮廓并将它们排列为2级层次结构,所有的外部轮廓为1级,所有的子级轮廓为2级。
cv2.RETR_TREE:检索所有轮廓并创建完整的层次列表,如父级、子级、孙子级等。
4.轮廓的近似方法
cv2.findContours()函数中的method参数用于设置轮廓的近似方法,它用于决定如何确定轮廓包含的像素点。method参数可设置为下列常数。
cv2.CHAIN_APPROX_NONE:存储所有轮廓点,轮廓的任意两个相邻点是水平、垂直或对角线上的邻居。
cv2.CHAIN_APPROX_SIMPLE:只保存水平、垂直和对角线的端点。
cv2.CHAIN_APPROX_TC89_L1:应用Teh-Chin链逼近算法中的一种确定轮廓点。

目录
相关文章
查找并绘制轮廓
查找并绘制轮廓
51 0
|
6月前
|
Python
查找轮廓
【6月更文挑战第25天】查找轮廓。
39 1
|
6月前
|
Web App开发 算法 Java
图像放缩之双线性内插值
图像放缩之双线性内插值
29 0
|
7月前
|
存储 计算机视觉 索引
【OpenCV】-查找并绘制轮廓
【OpenCV】-查找并绘制轮廓
|
7月前
[Halcon&图像] 图像、区域和轮廓相互转化
[Halcon&图像] 图像、区域和轮廓相互转化
305 1
图像查找
图像查找
70 0
|
定位技术
任意一张图片的CGCS2000坐标配准
任意一张图片的CGCS2000坐标配准
158 0
|
存储 编解码 对象存储
将图像标记器多边形转换为标记的块图像以进行语义分割
将存储在对象中的多边形标签转换为适用于语义分割工作流的标记阻止图像。 可以使用计算机视觉工具箱中的图像标记器应用来标记太大而无法放入内存和多分辨率图像的图像。有关详细信息,请参阅在图像标记器(计算机视觉工具箱)中标记大图像。图像标记器应用不支持对被阻止的图像进行像素标记。您只能使用 ROI 形状(如多边形、矩形和线条)创建标签。此示例演示如何使用函数将多边形 ROI 转换为像素标记的块图像,以进行语义分割工作流。
76 0
将图像标记器多边形转换为标记的块图像以进行语义分割
|
数据可视化 C++
【影像配准】配准之棋盘网格图(镶嵌图像)(附有 C++ 代码)
【影像配准】配准之棋盘网格图(镶嵌图像)(附有 C++ 代码)