如何在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("Moments of first contour:", M) cv2.imshow("Contour", img) cv2.waitKey(0) cv2.destroyAllWindows()
让我们看一些例子以便更好地理解。
我们将在下面的示例中使用以下图像作为输入文件。
示例1
在下面的Python 3程序中,我们检测图像中的轮廓并找到第一个轮廓的矩。我们还在图像上绘制第一个轮廓。
# import the required libraries import cv2 # Read the input image img = cv2.imread('shape.png') # Convert the input image to grayscale gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # apply thresholding on gray image ret,thresh = cv2.threshold(gray,150,255,0) # Find the contours in the image contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) print("Number of Contours detected:",len(contours)) # Find the moments of first contour cnt = contours[0] M = cv2.moments(cnt) # Draw the contour cv2.drawContours(img, [cnt], -1, (0,255,255), 3) x1, y1 = cnt[0,0] cv2.putText(img, 'Contour:1', (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) # print the moments of the first contour print("Moments of first contour:", M) cv2.imshow("Contour", img) cv2.waitKey(0) cv2.destroyAllWindows()
输出
执行后,程序将产生以下输出:
Number of Contours detected: 3 Moments of first contour: {'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("Number of Contours detected:",len(contours)) for i, cnt in enumerate(contours): M = cv2.moments(cnt) print(f"Moments of Contour {i+1}:\n", M) x1, y1 = cnt[0,0] img1 = cv2.drawContours(img, [cnt], -1, (0,255,255), 3) cv2.putText(img1, f'Contour:{i+1}', (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) cv2.imshow("Contours", img) cv2.waitKey(0) cv2.destroyAllWindows()
输出
执行后,它将产生以下输出:
Number of Contours detected: 3 Moments of Contour 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} Moments of Contour 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} Moments of Contour 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}
我们将得到以下窗口,显示输出:
广告