矩特征被广泛应用于图像识别、模式识别等方面。矩信息包含了对应图像不同类型的几何特征,如大小、形状、角度、位置等,一个轮廓矩代表一个轮廓、一幅图像、一组点集的全局特征。
1.矩的计算
Opencv提供了函数cv2.moments()来获取图像的moments特征,我们也将用这个函数获取的轮廓特征称为轮廓矩。轮廓矩描述了一个轮廓的重要特征,可以用来比较两个轮廓。
式中有两个参数:
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
大多数矩都是通过数学公式计算得到的抽象特征,但零阶矩“m00"的含义比较直观,表示一个轮廓的面积。假如有两个轮廓,不管它们出现在图像的哪个位置,我们都可以通过函数cv2.moments()的m00矩来判断其面积是否一致。在位置发生变化时,虽然轮廓的面积、周长等特征不变,但是耿高阶的特征会随着位置的变化而发生变化。
在很多情况下,我们希望比较不同位置的两个对象的一致性。解决这一问题的方法是引入中心矩。中心矩通过减去均值而获取平移不变性,因而能够比较不同位置的两个对象是否一致。
除了考虑平移不变性外,有时还会考虑缩放一致性,也就是希望图像在缩放前后能够拥有相同的特征值。中心矩没有这个属性。归一化中心矩通过除以物体的总尺寸而获得缩放不变性,它也有平移不变性。
在OpenCV中,cv2.moments()会同时计算上述空间矩、中心化矩和归一化中心矩。
2.计算轮廓的面积
函数cv2.contourArea()用于计算轮廓的面积。
有两个参数:
contour: 表示轮廓
oriented:是布尔值,当它为True时,返回的值带正/负号(表示轮廓是顺时针的还是逆时针的)。默认为False,返回的是绝对值。
两种方法求得的面积是一致的。
3.计算轮廓的长度
cure:表示的是轮廓
closed: 是布尔值,表示轮廓是否是封闭的。True表示封闭
注意:实际上这里得到的轮廓长度是浮点值,这里取整处理