opencv学习记录之图像轮廓之一
图像矩描述了图像的全局特征
一阶矩与形状有关
二阶距显示曲线围绕直线平均值的扩展程度
三阶矩是关于平均值的对称性测量
由二阶和三阶矩可以导出7个不变矩,不变矩是图像的统计特性,满足平移、伸缩、旋转的不变性
查找轮廓
image , contours , hierarchy = cv2.findContours(image , mode , method)
image:与函数参数中的原始图像一致 , 在opencv 4.X中该返回值被取消
contours:返回的轮廓 , 每个轮廓由若干个点组成,type为list可以进行索引例如:contours[0] , len(contours[0]) 是轮廓的长度 即点的个数
hierarchy:图像的拓扑信息 , 当一个轮廓在另一个轮廓内,我们称外部的轮廓为父轮廓,内部称为子轮廓, 每个轮廓contours[i]
对应4个元素说明层次关系,
[Next , Previous , First_Child , Parent]
Next 为后一个轮廓编号,
Previous :位前一个轮廓编号,
First_Child为第1个子轮廓的索引编号,
Parent为副轮廓的编号 。 若没有对应关系则为-1
image:原始图像,8位单通道图像,所有非零值被处理为1,所有零值保持不变 。 一般将图像处理为二值图像在作为参数使用
mode:轮廓检索模式 ,
cv2.RETR_EXTERNAL只检测外轮廓 ,
cv2.RETR_LIST对检测的轮廓不建立等级关系 ,
cv2.RETR_CCOMP检索所有轮廓并将他们组织成两级层次关系 ,
cv2.RETR_TREE建立等级树结构的轮廓
method:轮廓的近似方法 。
cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻两点的像素位之差不超过1
cv2.CHAIN_APPROX_SIMPLE 压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标
cv2.CHAIN_APPROX_TC89_L1 ,使用teh_Chinl chain 近似算法的风格
cv2.CHAIN_APPROX_TC89_KCOS 使用 teh_Chinl chain近似算法的一种风格
使用cv2.findContours,需要注意待处理的图像必须是灰度二值图像,可以预先进行二值处理,是从黑色背景查找白色图像,对象必须是白色的,背景必须是黑色 ,
绘制轮廓
image = cv2.drawContours(image , contours , contourIdx , color [ , thickness[ , lineType [ , hierarchy [, maxLevel [ ,maxLevel[ ,offest]]]]])
返回值image表示绘制了边缘图像的原始图像
image 待绘制图像, 该函数会直接在图像上绘制轮廓,即在函数执行完后,image就不再是原始图像,可以预先复制图像
contours 需要绘制的轮廓,同样是list类型
contourIdx 需要绘制的边缘索引,如果参数为正数或0则表示对应索引号的轮廓, 若为负数(-1)则表示全部轮廓
color 绘制轮廓的颜色,用RGB个是表示
thickness 表示绘制轮廓时所用画笔的粗细, 如果该值设置为-1则表示为实心轮廓
lineType 表示绘制图像时所用的线型
hierarchy 对应函数cv2.findContours()所输出的层次信息
maxLevel 控制所绘制的轮廓层次的深度
offset 偏移参数
1 import cv2 2 import numpy as np 3 o = cv2.imread("contours.bmp") 4 cv2.imshow("original" , o) 5 gray = cv2.cvtColor(o , cv2.COLOR_BGR2GRAY) 6 ret , binary = cv2.threshold(gray , 127 , 255 , cv2.THRESH_BINARY) 7 contours , hierarchy = cv2.findContours( 8 binary , cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 9 o = cv2.drawContours(o , contours , -1 ,(0,0,255) , 5) 10 n = len(contours) 11 contoursImg = [] 12 for i in range(n): 13 temp = np.zeros(o.shape , np.uint8) 14 contoursImg.append(temp) 15 contoursImg[i] = cv2.drawContours(contoursImg[i] , contours , 16 i , (255,255,255) , 5) 17 cv2.imshow("contours[" + str(i)+"] " , contoursImg[i]) 18 cv2.imshow("result" , o) 19 cv2.waitKey() 20 cv2.destroyAllWindows()
原始图像original
contours[0]
contours[1]
contours[2]
result
通过轮廓,提取前景图像