輪廓可以簡單認為成將連續的點(連著邊界)連在一起的曲線,具有相同的顏色或者灰度。輪廓在形狀分析和物體的檢測和識別中很有用。
? 為了更加準確,要使用二值化圖像。在尋找輪廓之前,要進行閾值化處理或者 Canny 邊界檢測。
? 查找輪廓的函數會修改原始圖像。如果你在找到輪廓之后還想使用原始圖像的話,你應該將原始圖像存儲到其他變量中。
? 在 OpenCV 中,查找輪廓就像在黑色背景中超白色物體。你應該記住,要找的物體應該是白色而背景應該是黑色。
讓我們看看如何在一個二值圖像中查找輪廓:
cv2.findContours()
是 OpenCV 中用于查找圖像中輪廓的函數。該函數的基本語法如下:
contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
參數說明:
image
: 輸入圖像,通常為二值圖像(例如閾值化后的圖像)。mode
: 輪廓檢索模式,有如下幾種選擇:cv2.RETR_EXTERNAL
: 只檢測最外層的輪廓。cv2.RETR_LIST
: 檢測所有輪廓,不建立輪廓層次。cv2.RETR_CCOMP
: 檢測所有輪廓,建立兩層輪廓層次。cv2.RETR_TREE
: 檢測所有輪廓,建立完整的輪廓層次。
method
: 輪廓逼近方法,有如下幾種選擇:cv2.CHAIN_APPROX_NONE
: 存儲所有的輪廓點。cv2.CHAIN_APPROX_SIMPLE
: 壓縮水平、垂直和斜率方向的元素,只保留其端點。cv2.CHAIN_APPROX_TC89_L1
和cv2.CHAIN_APPROX_TC89_KCOS
: 應用 Teh-Chin 鏈逼近算法。
contours
: 輸出參數,存儲檢測到的輪廓。hierarchy
: 輸出參數,存儲輪廓的層次信息。offset
: 可選參數,偏移值,通常不需要使用。
import cv2
# 讀取圖像
img = cv2.imread( r"C:\Users\mzd\Desktop\opencv\images.jpg")
# 將圖像轉換為灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 使用閾值處理圖像
ret, thresh = cv2.threshold(gray, 127, 255, 0)# 查找輪廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 在原始圖像上繪制輪廓
cv2.drawContours(img, contours, -1, (0, 255, 0), 2)# 顯示原始圖像和帶有輪廓的圖像
cv2.imshow('Original Image', img)
cv2.imshow('Contour Image', thresh)# 等待用戶按下任意鍵
cv2.waitKey(0)
cv2.destroyAllWindows()
這個示例演示了如何使用 cv2.findContours()
函數查找圖像中的輪廓,并使用 cv2.drawContours()
函數在原始圖像上繪制這些輪廓。