如何使用 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
我們將看到以下視窗,顯示輸出。
廣告