大家好,欢迎来到IT知识分享网。
矩特征
比较两个轮廓最简单的方法是比较二者的轮廓矩,轮廓矩代表了一个轮廓,一副图像,一组点集的全局特征,矩信息包含了对应对象不同类型的集合特征,例如大小,位置,角度,形状等,矩特征广泛应用在模式识别,图像识别方面。
矩的计算:moments 函数
retval = cv2.moments( array[, binaryImage] )
获取图像的 Moments特征,使用轮廓矩可以方便的比较两个轮廓
- array 可以是点集 ,也可以是灰度图或二值图。当array 是点集时,函数会把这些点集当作轮廓中的顶点,将整个点集当作一条轮廓,而不是当作独立的点
- binaryImage True时,array 内所有非零值都处理为1,参数仅在array 是图像时有效。
- retval 返回的矩特征,主要包括
- 空间矩,零阶矩 m00 ,一阶矩:m10, m01,二阶矩:m20, m11, m02,三阶矩:m30, m21, m12, m03
- 中心矩,二阶中心矩:mu20, mu11, mu02,三阶中心矩:mu30, mu21, mu12, mu03
- 归一化中心矩,二阶 Hu 矩:nu20, nu11, nu02,三阶 Hu 矩:nu30, nu21, nu12, nu03
阿巴阿巴,,上面的啥矩 都是根据公式计算得到的,大多数矩都是通过数学公式得到的抽象特征,但是很明显,如果两个轮廓的矩一致,那么这两个轮廓就是一致的。m00 的含义就很直观,表示一个轮廓的面积。
cv2.moments 返回的特征值可以用来比较两个轮廓是否相似,例如 不管两个轮廓出现再那个位置,可以通过函数cv2.moments() 的m00 矩来判断面积是否一致。
当轮廓位置改变,虽然面积,周长等特征不会变,但是更高阶的特征会随位置而改变,中心矩通过减去均值而获取平移不变性,从而可以比较不同位置的两个对象是否一致。
归一化中心矩通过除以物体总尺寸而获得缩放不变性,通过计算提取对象的归一化中心矩属性值,该属性值不但拥有平移不变性,还有缩放不变性,也就从缩放前后的图像中提取稳定的特征值来比较轮廓。
再opencv 中cv2.moments() 会同时计算上述三种,,i了i了,Opencv就是为了让你忽略一些细节嘛,,,
o = cv2.imread('16.jpg') cv2.imshow("original",o) gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY) ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY) # 转成二值图 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,3) cv2.imshow("contours[" + str(i)+"]",contoursImg[i]) print("观察各个轮廓的矩(moments):") for i in range(n): print("轮廓"+str(i)+"的矩:\n",cv2.moments(contours[i])) print("观察各个轮廓的面积:") for i in range(n): print("轮廓"+str(i)+"的面积:%d" %cv2.moments(contours[i])['m00']) cv2.waitKey() cv2.destroyAllWindows() 观察各个轮廓的矩(moments): 轮廓0的矩: {
'm00': 13120.0, 'm10': .0, 'm01': .0, 'm20': ., 'm11': .0, 'm02': ., 'm30': 0.0
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/157678.html