目錄
簡述
1. 什么是圖像輪廓?
2. 查找圖像輪廓
2.1 接口定義
2.2 參數說明
?2.3 代碼示例
2.4 運行結果
3. 繪制圖像輪廓
3.1 接口定義
3.2 參數說明
3.3 代碼示例
?3.4 運行結果
4. 計算輪廓周長
5. 計算輪廓面積
6. 示例:計算圖像輪廓的面積與周長
7. 應用場景
相關閱讀
OpenCV:多邊形逼近與凸包-CSDN博客
簡述
在圖像處理領域,輪廓是圖像中物體的邊界或形狀信息的表達方式。通過提取輪廓,可以對圖像中的目標進行識別、測量和分析。本文將從概念到實際操作詳細介紹圖像輪廓及其相關操作,并展示如何在 OpenCV 中實現。
1. 什么是圖像輪廓?
圖像輪廓?是圖像中物體邊界的閉合曲線,表示具有相同強度或顏色像素的連接路徑。它是一種重要的圖像特征,常用于形狀分析和對象檢測。
特點
- 輪廓基于二值圖像計算,必須先將輸入圖像轉換為二值圖。
- OpenCV 提供的輪廓查找算法將視圖像中的白色區域為前景(目標)。
- 輪廓的方向可以是順時針或逆時針。
2. 查找圖像輪廓
OpenCV 提供了 cv2.findContours() 函數來查找圖像的輪廓。
2.1 接口定義
contours, hierarchy = cv2.findContours(image, mode, method)
2.2 參數說明
image:輸入的二值圖像(通常是灰度圖的閾值化結果)。
mode:輪廓的檢索模式,常見值:
- cv2.RETR_EXTERNAL:只檢測最外層輪廓。
- cv2.RETR_LIST:檢測所有輪廓,不建立層級關系。
- cv2.RETR_TREE:檢測所有輪廓,并構建完整層級關系。
method:輪廓的近似方法:
- cv2.CHAIN_APPROX_NONE:存儲所有的輪廓點。
- cv2.CHAIN_APPROX_SIMPLE:只存儲必要的輪廓點,壓縮水平和垂直冗余點。
返回值:
- contours:檢測到的輪廓列表,每個輪廓是一個 Numpy 數組。
- hierarchy:每個輪廓的層級關系。
?2.3 代碼示例
import cv2# 讀取圖像并轉為灰度圖
image = cv2.imread('D:\\resource\\filter\\find_contours.png', cv2.IMREAD_GRAYSCALE)# 二值化
_, binary_img = cv2.threshold(image, 150, 255, cv2.THRESH_BINARY)# 輪廓查找
#contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print(contours)# 顯示圖像
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
示例說明:
- 當前示例使用的圖像為:白色背景,中間畫了一個黑色的矩形。
- 用win11自帶的畫圖軟件畫出來的,并非純粹的黑白圖像,在代碼中最好進行二值化處理。
- 該示例的作用是將圖像中所有輪廓的必要點打印出來。
2.4 運行結果
?
打印結果顯示的是:圖像必要的輪廓點。
該圖像包含2個輪廓?:
- 最外層的白色背景邊框。
- 中間黑色矩形邊框。
3. 繪制圖像輪廓
OpenCV 提供了 cv2.drawContours() 函數用于繪制輪廓。
3.1 接口定義
cv2.drawContours(image, contours, contourIdx, color, thickness)
3.2 參數說明
image:目標圖像,輪廓將繪制在此圖像上。
contours:輪廓數據,cv2.findContours() 的輸出。
contourIdx:指定繪制的輪廓索引:
- -1:繪制所有輪廓。
- >=0:繪制特定索引的輪廓。
color:繪制輪廓的顏色(BGR 格式)。
thickness:線條粗細,-1 表示填充輪廓。
3.3 代碼示例
import cv2# 讀取圖像
image = cv2.imread('D:\\resource\\filter\\find_contours.png')# 轉為灰度圖
gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 二值化
_, binary_img = cv2.threshold(gray_img, 150, 255, cv2.THRESH_BINARY)# 輪廓查找
contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 繪制輪廓
result = cv2.drawContours(image, contours, -1, (0,0,255), 2)# 顯示圖像
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
示例說明:
- 依舊使用同一張圖片。
- 該示例的作用是將圖像中所有的輪廓用紅色的線條繪制出來,其中線條的粗細數值為2。?
?3.4 運行結果
將圖像中所有的輪廓繪制出來:
4. 計算輪廓周長
OpenCV 提供了 cv2.arcLength() 函數計算輪廓的周長。
接口定義
perimeter = cv2.arcLength(curve, closed)
參數說明
curve
:輸入輪廓點。closed
:布爾值,是否將輪廓視為閉合曲線。
返回值:
輪廓的周長(浮點數)。
5. 計算輪廓面積
OpenCV 提供了 cv2.contourArea() 函數計算輪廓的面積。
接口定義:
area = cv2.contourArea(contour)
參數說明:
contour:
輸入輪廓點。
返回值:
輪廓的面積(浮點數)。
6. 示例:計算圖像輪廓的面積與周長
示例如下:?
import cv2# 讀取圖像
image = cv2.imread('D:\\resource\\filter\\find_contours.png')# 轉為灰度圖
gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 二值化
_, binary_img = cv2.threshold(gray_img, 150, 255, cv2.THRESH_BINARY)# 輪廓查找
#contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# print(contours)# 繪制輪廓
#result = cv2.drawContours(image, contours, -1, (0,0,255), 2)# 計算面積
area = cv2.contourArea(contours[1])
print("area=%d"%(area))# 計算周長
len = cv2.arcLength(contours[1], True)
print("len=%d"%(len))# 顯示圖像
#cv2.imshow('image', image)
#cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
示例說明:
- 依舊使用同一張圖像。
- 查找圖像輪廓,取索引為1的輪廓。
- 計算其面積與周長,并打印出來。
?打印輸出:
PS D:\code\opencv_python> & "D:/Program Files/Python38-32/python.exe" d:/code/opencv_python/calc_contours.py
area=35951
len=769
PS D:\code\opencv_python>
7. 應用場景
- 目標檢測與識別:通過輪廓提取圖像中的特定對象。
- 形狀分析:計算周長、面積等幾何屬性。
- 物體測量:用于測量物體的尺寸和外觀特征。