如何在OpenCV Python中计算图像矩?
图像矩对于计算图像中物体的重心、面积等特征非常重要。使用物体的轮廓计算物体的图像矩。所以我们首先检测物体的轮廓,然后应用 cv2.moments(cnt) 函数来计算矩。
语法
函数使用的语法如下-
cv2.moments(cnt)
这里,“cnt”是图像中物体轮廓点的 numpy 数组。
步骤
您可以按照以下步骤计算图像中的矩-
导入所需库。在所有下列 Python 示例中,所需的 Python 库是 OpenCV . 确保您已经安装了它。
import cv2
使用 cv2.imread() 读取输入图像并将其转换为灰度。
img = cv2.imread('shape.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
对灰度图像进行阈值处理以创建二进制图像。
ret,thresh = cv2.threshold(gray,150,255,0)
使用 cv2.findContours() 函数在图像中找到轮廓。
contours, _ = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
使用 cv2.moments(cnt) 函数找到轮廓的矩。
cnt = contours[0]
M = cv2.moments(cnt)
在输入图像上绘制轮廓。
cv2.drawContours(img, [cnt], -1, (0,255,255), 3)
打印轮廓的矩并显示绘制的轮廓图像。
print("第一个轮廓的矩:", M)
cv2.imshow("Contour", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
看一些示例以更清晰地了解。
我们将使用以下图片作为 输入文件 。
示例1
在下面的 Python 3 程序中,我们检测图像中的轮廓并找到第一个轮廓的矩。我们还在图像上绘制第一个轮廓。
# 导入所需的库
import cv2
# 读取输入图像
img = cv2.imread('shape.png')
# 将输入图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 对灰度图像进行阈值处理
ret,thresh = cv2.threshold(gray,150,255,0)
# 在图像中寻找轮廓
contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print("检测到的轮廓数目:",len(contours))
# 寻找第一个轮廓的矩
cnt = contours[0]
M = cv2.moments(cnt)
# 在图像中绘制轮廓
cv2.drawContours(img, [cnt], -1, (0,255,255), 3)
x1, y1 = cnt[0,0]
cv2.putText(img, '轮廓:1', (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
# 打印第一个轮廓的矩
print("第一个轮廓的矩:", M)
cv2.imshow("轮廓", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果
执行程序后,将会输出如下结果 −
检测到的轮廓数目: 3
第一个轮廓的矩: {'m00': 14947.0, 'm10': 5239300.5, 'm01': 4905869.833333333, 'm20': 1855054841.3333333,
'm11': 1719626880.3333333, 'm02': 1627236449.0, 'm30': 663246399000.25, 'm21': 608855981883.0333,
'm12': 570384732497.0, 'm03': 545278150361.85004, 'mu20': 18547868.074468374, 'mu11': -4234.319657325745,
'mu02': 17043178.00180459, 'mu30': -103085.66333007812, 'mu21': -2867085.318628311, 'mu12': 93785.43371105194,
'mu03': 2614635.8901367188, 'nu20': 0.08302061174329703, 'nu11': -1.8952895656603758e-05, 'nu02': 0.07628559024028292,
'nu30': -3.7740980910254148e-06, 'nu21': -0.00010496766357504605, 'nu12': 3.4336047797598577e-06, 'nu03':9.572516684589537e-05}
然后我们将会看到如下图像窗口进行输出 −
例子2
下面是一个Python 3程序示例,我们在图像中检测轮廓并找到所有轮廓的矩。同时,我们也在图像上绘制了所有的轮廓。
import cv2
img = cv2.imread('shape.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,170,255,0)
contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
print("检测到轮廓数量:",len(contours))
for i, cnt in enumerate(contours):
M = cv2.moments(cnt)
print(f"轮廓 {i+1}的矩:, M)
x1, y1 = cnt[0,0]
img1 = cv2.drawContours(img, [cnt], -1, (0,255,255), 3)
cv2.putText(img1, f'轮廓:{i+1}', (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
cv2.imshow("轮廓", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果
运行后,将产生以下输出-
检测到轮廓数量:3 轮廓 1 的矩:{'m00': 15402.0, 'm10': 5460392.0, 'm01': 5121775.5, 'm20': 1955553262.0, 'm11': 1815792476.0, 'm02': 1721276078.8333333, 'm30': 707266472160.0, 'm21': 650295900662.75, 'm12': 610232408910.5834, 'm03': 584418978310.75, 'mu20': 19708514.97597742, 'mu11': -4301.4312427043915, 'mu02': 18082709.63451171, 'mu30': -105064.52392578125, 'mu21': -22675.465063095093, 'mu12': 96956.12330245972, 'mu03': 19236.347534179688, 'nu20': 0.0830806075148932, 'nu11': -1.8132544296869317e-05, 'nu02': 0.07622707767590893, 'nu30': -3.5687267756372534e-06, 'nu21': -7.702175415353248e-07, 'nu12': 3.2933087246071784e-06, 'nu03': 6.534010334371792e-07} 轮廓 2 的矩:{'m00': 13560.0, 'm10': 6726168.0, 'm01': 2332734.0, 'm20': 3353389910.0, 'm11': 1157102529.0, 'm02': 415106150.0, 'm30': 1680255479196.0, 'm21': 576881671183.0, 'm12': 205903881453.0, 'm03': 76160706300.0, 'mu20': 17008201.723893642, 'mu11': -3723.4566371440887, 'mu02': 13804681.36017698, 'mu30': 25766.02392578125, 'mu21': -81702.26369953156, 'mu12': 22229.887162208557, 'mu03': 121576.5337524414, 'nu20': 0.09249942201541517, 'nu11': -2.0250088306010698e-05, 'nu02': 0.07507701682121294, 'nu30': 1.203367233494467e-06, 'nu21': -3.815793516358757e-06, 'nu12': 1.0382167575539102e-06, 'nu03': 5.678067268001503e-06} 轮廓 3 的矩:{'m00': 15787.0, 'm10': 2612018.0, 'm01': 2825720.5, 'm20': 468078997.1666666, 'm11': 481368351.5833333, 'm02': 527125908.3333333, 'm30': 90297435295.8, 'm21': 88735810974.15, 'm12': 91882427379.68333, 'm03': 101549171192.45001, 'mu20': 35910882.11478847, 'mu11': 13842361.276815295, 'mu02': 21349234.860206723, 'mu30': 968841707.3605652, 'mu21': 373651504.4356222, 'mu12': -287817054.9542117, 'mu03': -443888063.0274048, 'nu20': 0.14408768219763246, 'nu11': 0.055540650495388824, 'nu02': 0.08566099150299868, 'nu30': 0.03093882414212907, 'nu21': 0.011932122758907373, 'nu12': -0.009191100239267325, 'nu03': -0.014175044918544318}
然后我们可以得到以下窗口,显示输出: