import cv2
import numpy as np
o=cv2.imread('C:/Users/xpp/Desktop/coins.png')#原始图像
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("轮廓"+str(i)+"的矩:\n",cv2.moments(contours[i]))#提取轮廓特征
print("轮廓"+str(i)+"的面积:%d"%cv2.moments(contours[i])['m00'])
cv2.waitKey()
cv2.destroyAllWindows()
轮廓19的矩: {'m00': 8974.5, 'm10': 2036635.8333333333, 'm01': 558017.8333333333, 'm20': 468955543.4166666, 'm11': 126497297.95833333, 'm02': 40771439.75, 'm30': 109496918136.75, 'm21': 29099721634.316666, 'm12': 9233994661.75, 'm03': 3287867639.9500003, 'mu20': 6769848.65736407, 'mu11': -136956.318305403, 'mu02': 6074921.579848155, 'mu30': 1448006.2300262451, 'mu21': 3092744.005244732, 'mu12': -1475507.6674439907, 'mu03': -2679981.253308296, 'nu20': 0.08405400977445295, 'nu11': -0.0017004409256613537, 'nu02': 0.0754258394382496, 'nu30': 0.00018977752378493878, 'nu21': 0.00040533893214355905, 'nu12': -0.0001933818968777062, 'nu03': -0.0003512417249984393} 轮廓19的面积:8974
算法:图像轮廓的矩是一个轮廓、一幅图像、一组点集的全局特征,包括几何特征,例如大小、位置、角度、形状等。如果两个图像轮廓的矩一致,那么两个图像轮廓一致。在图像位置发生变化时,虽然图像轮廓的面积、周长等特征不变,但是更高阶的特征会随着位置的变化而发生变化。中心矩通过减去均值获取平移不变性,忽略两个图像的位置关系,比较不同位置的两个图像的一致性。中心矩不具有缩放不变性,例如,两个形状一致、大小不一的图像,中心矩不同。通过提取图像的归一化中心矩属性值,该属性值不仅具有平移不变性,还具有缩放不变性。
retval=cv2.moments(array[, binaryImage])
对一幅f(x,y)图像,f(x,y)的p+q阶空间矩:
f(x,y)的p+q阶中心矩:
f(x,y)的p+q阶归一化中心矩:
注意:参数binaryImage仅在参数array为图像时有效。零阶矩“m00”的含义最为直观表示图像轮廓的面积。
本文分享自 图像处理与模式识别研究所 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!