如何使用 OpenCV Python 计算图像轮廓的面积和周长?


图像中物体的轮廓对于计算图像的面积和周长非常有用。图像的轮廓是沿着边界连接所有连续点的曲线,这些点具有相同的颜色或强度。轮廓用于形状分析、物体检测和识别等。

要计算物体的面积和周长,我们首先检测物体的轮廓,然后分别应用cv2.contourArea()cv2.arcLength()函数。

语法

函数使用以下语法:

area = cv2.contourArea(cnt)
perimeter = cv2.arcLength(cnt, True)

其中,“cnt”是图像中物体轮廓点的 NumPy 数组。

步骤

您可以使用以下步骤来计算图像中轮廓的面积和周长:

导入所需的库。在以下所有 Python 示例中,所需的 Python 库为OpenCV。确保您已安装它。

import cv2

使用cv2.imread()读取输入图像并将其转换为灰度图像。

img = cv2.imread('pentagon.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.contourArea(cnt)cv2.arcLength(cnt, True)函数计算检测到的轮廓的面积和周长。

area = cv2.contourArea(cnt)
perimeter = cv2.arcLength(cnt, True)

在输入图像上绘制轮廓。

cv2.drawContours(img, [cnt], -1, (0,255,255), 3)

打印图像中检测到的轮廓的面积和周长。

print('Area:', area)
print('Perimeter:', perimeter)

让我们看一些示例以更好地理解。

示例 1

在此程序中,我们计算输入图像“pentagon.png”中检测到的轮廓的面积和周长。

import cv2 # Read the input image img = cv2.imread('pentagon.png') # convert the image to grayscale gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Apply thresholding in the gray image to create a binary image ret,thresh = cv2.threshold(gray,150,255,0) # Find the contours using binary image contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) print("Number of contours in image:",len(contours)) cnt = contours[0] # compute the area and perimeter area = cv2.contourArea(cnt) perimeter = cv2.arcLength(cnt, True) perimeter = round(perimeter, 4) print('Area:', area) print('Perimeter:', perimeter) img1 = cv2.drawContours(img, [cnt], -1, (0,255,255), 3) x1, y1 = cnt[0,0] cv2.putText(img1, f'Area:{area}', (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2) cv2.putText(img1, f'Perimeter:{perimeter}', (x1, y1+20), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2) cv2.imshow("Image", img) cv2.waitKey(0) cv2.destroyAllWindows()

我们将在上述程序中使用以下图像作为输入文件

输出

运行以上代码将得到以下输出:

Number of contours in image: 1 
Area: 39738.5 
Perimeter: 787.0265

我们将看到以下窗口,显示输出:

示例 2

在下面的程序中,我们计算图像中轮廓的面积和周长。我们在图像“shapes.jpg”中检测到四个轮廓。

import cv2 import numpy as np img1 = cv2.imread('shapes.jpg') img = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) ret,thresh = cv2.threshold(img,10,255,0) contours,hierarchy = cv2.findContours(thresh, 1, 2) print("Number of contours in image:",len(contours)) for i, cnt in enumerate(contours): M = cv2.moments(cnt) if M['m00'] != 0.0: x1 = int(M['m10']/M['m00']) y1 = int(M['m01']/M['m00']) area = cv2.contourArea(cnt) perimeter = cv2.arcLength(cnt, True) perimeter = round(perimeter, 4) print(f'Area of contour {i+1}:', area) print(f'Perimeter of contour {i+1}:', perimeter) img1 = cv2.drawContours(img1, [cnt], -1, (0,255,255), 3) cv2.putText(img1, f'Area :{area}', (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) cv2.putText(img1, f'Perimeter :{perimeter}', (x1, y1+20), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) cv2.imshow("Image", img1) cv2.waitKey(0) cv2.destroyAllWindows()

我们将在上述程序中使用以下图像作为输入文件

输出

执行后,它将在控制台上生成以下输出:

Number of contours in image: 4 
Area of contour 1: 29535.0 
Perimeter of contour 1: 688.0
Area of contour 2: 16206.5 
Perimeter of contour 2: 608.6589 
Area of contour 3: 19240.0 
Perimeter of contour 3: 518.2153 
Area of contour 4: 25248.0 
Perimeter of contour 4: 718.0

我们将看到以下窗口,显示输出。

更新于: 2022年9月28日

13K+ 次查看

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告