如何使用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('shapes.jpg')
# 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,127,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))
# compute the area and perimeter for each contour
for cnt in contours:
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,0), 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: 4
Area: 7189.0
Perimeter: 324.2467
Area: 9501.0
Perimeter: 366.6823
Area: 31262.5
Perimeter: 707.404
Area: 48453.0
Perimeter: 1053.6222
我们可以看到窗口显示了所有检测到的轮廓,并在每个轮廓周围添加了对区域和周长的标签。
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("图像中的轮廓数量:",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'轮廓{i+1}的面积:, area)
print(f'轮廓{i+1}的周长:, perimeter)
img1 = cv2.drawContours(img1, [cnt], -1, (0,255,255), 3)
cv2.putText(img1, f'面积 :{area}', (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0<, 255, 0), 2)
cv2.putText(img1, f'周长 :{perimeter}', (x1, y1+20), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
cv2.imshow("图像", img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们将使用以下图像作为 输入文件 在上面的程序中。
输出
执行后,将在控制台上输出以下内容 −
图像中的轮廓数:4
轮廓1的面积:29535.0
轮廓1的周长:688.0
轮廓2的面积:16206.5
轮廓2的周长:608.6589
轮廓3的面积:19240.0
轮廓3的周长:518.2153
轮廓4的面积:25248.0
轮廓4的周长:718.0
我们将获得以下窗口,显示输出结果。