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

通过轮廓,提取前景图像

 

 

原文地址:https://www.cnblogs.com/miaorn/p/12228703.html