美文网首页
图像轮廓之矩特征

图像轮廓之矩特征

作者: 大龙10 | 来源:发表于2021-11-06 06:45 被阅读0次

    《OpenCV轻松入门:面向Python》读书笔记
    作者:李立宗
    出版社:电子工业出版社
    出版时间:2019-05

    第12章 图像轮廓

    12.2 矩特征

    • 比较两个轮廓最简单的方法是比较二者的轮廓矩。
    • 轮廓矩代表了一个轮廓、一幅图像、一组点集的全局特征。矩信息包含了对应对象不同类型的几何特征,例如大小、位置、角度、形状等。
    • 矩特征被广泛地应用在模式识别、图像识别等方面。

    1) 矩的计算:moments函数

      OpenCV提供了函数cv2.moments()来获取图像的moments特征。通常情况下,我们将使用函数cv2.moments()获取的轮廓特征称为“轮廓矩”。轮廓矩描述了一个轮廓的重要特征,使用轮廓矩可以方便地比较两个轮廓。
    函数cv2.moments()的语法格式为:

    retval=cv2.moments(array [, binaryImage])

    式中有两个参数:

    • array:可以是点集,也可以是灰度图像或者二值图像。当array是点集时,函数会把这些点集当成轮廓中的顶点,把整个点集作为一条轮廓,而不是把它们当成独立的点来看待。
    • binaryImage:该参数为True时,array内所有的非零值都被处理为1。该参数仅在参数array为图像时有效。

    该函数的返回值retval是矩特征,主要包括:
    (1)空间矩

    • 零阶矩:m00
    • 一阶矩:m10, m01
    • 二阶矩:m20, m11, m02
    • 三阶矩:m30, m21, m12, m03

    (2)中心矩

    • 二阶中心矩:mu20, mu11, mu02
    • 三阶中心矩:mu30, mu21, mu12, mu03

    (3)归一化中心矩

    • 二阶Hu矩:nu20, nu11, nu02
    • 三阶Hu矩:nu30, nu21, nu12, nu03

    在OpenCV中,函数cv2.moments()会同时计算上述空间矩、中心矩和归一化中心距。

    2) 计算轮廓的面积:contourArea函数

    函数cv2.contourArea()用于计算轮廓的面积。该函数的语法格式为:

    retval=cv2.contourArea(contour[, oriented])

    式中的返回值retval是面积值。
    式中有两个参数:

    • contour是轮廓。
    • oriented是布尔型值。当它为True 时,返回的值包含正/负号,用来表示轮廓是顺时针还是逆时针的。该参数的默认值是False,表示返回的retval是一个绝对值。

    【例12.6】使用函数cv2.contourArea()计算各个轮廓的面积,将面积大于15000的轮廓筛选出来。

    #筛选出大于特定大小的轮廓
    import cv2
    import numpy as np
    o = cv2.imread('contours.bmp')  
    cv2.imshow("original",o)
    gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)  
    ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)  
    image,contours, hierarchy = cv2.findContours(binary,
                                                 cv2.RETR_LIST,
                                                 cv2.CHAIN_APPROX_SIMPLE)  
    n=len(contours)
    contoursImg=[]
    for i in range(n):
        temp=np.zeros(o.shape,np.uint8)
        contoursImg.append(temp)
        contoursImg[i]=cv2.drawContours(contoursImg[i],
                   contours,i,(255,255,255),3)
        if cv2.contourArea(contours[i])>15000:
            cv2.imshow("contours[" + str(i)+"]",contoursImg[i])    
    cv2.waitKey()
    cv2.destroyAllWindows()
    

    3) 计算轮廓的长度:arcLength函数

    函数cv2.arcLength()用于计算轮廓的长度,其语法格式为:

    retval=cv2.arcLength(curve, closed)

    式中返回值retval是轮廓的长度(周长)。
    上式中有两个参数:

    • curve是轮廓。
    • closed是布尔型值,用来表示轮廓是否是封闭的。该值为True时,表示轮廓是封闭的。

    相关文章

      网友评论

          本文标题:图像轮廓之矩特征

          本文链接:https://www.haomeiwen.com/subject/xlngaltx.html