《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时,表示轮廓是封闭的。
网友评论