zoukankan      html  css  js  c++  java
  • 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

    通过轮廓,提取前景图像

     

     

  • 相关阅读:
    13.sqoop的安装
    12.Flume的安装
    11.把文本文件的数据导入到Hive表中
    10.hive安装
    9.centos7 安装mysql
    8.时间同步
    7.编写mapreduce案例
    mysql中如何处理字符
    装箱拆箱隐含的问题
    何谓幂等性
  • 原文地址:https://www.cnblogs.com/miaorn/p/12228703.html
Copyright © 2011-2022 走看看