文章目錄
- 一、影像輪廓
- 二、影像輪廓檢測的實作
- 三、輪廓特征
- 四、輪廓近似
一、影像輪廓
- 影像輪廓與影像邊界區別
影像輪廓指的是影像整體,連接在一起,而影像邊界可能是零散的線段,
二、影像輪廓檢測的實作
-
opencv輪廓檢測函式
def findContours(image: Any, mode: Any, method: Any, contours: Any = None, hierarchy: Any = None, offset: Any = None)部分引數說明:
①mode:輪廓檢索模式
常用的模式
RETR_EXTERNAL:只檢測最外邊輪廓
RETR_LIST:檢測所有輪廓,并將其保存到一條鏈表當中
RETR_CCOMP:檢測所有輪廓,并將他們組織為兩層,頂層為各部分的外部邊界,第二層為空洞的邊界
RETR_TREE:檢索所有輪廓,并重構嵌套輪廓的整個層次,最常用模式,
②method:輪廓逼近方法
CHAIN_APPROX_NONE:以Freeman鏈碼的方式輸出輪廓,所有其他方法輸出多邊形,
CHAIN_APPROX_SIMPLE:壓縮水平的、垂直的和斜的部分(只保留他們終點部分), -
輪廓檢測程序
①讀取影像灰度圖lena = cv2.imread("Lena.png") gray = cv2.cvtColor(lena, cv2.COLOR_BGR2GRAY)②影像二值化
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
③影像輪廓檢測
binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)④繪制輪廓
# 繪制輪廓資訊 draw_img = lena.copy() # 默認取-1,全部輪廓,取其他的值的時候,通常會繪制出部分輪廓, res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2) showImg(res, 'res')
三、輪廓特征
- 輪廓面積計算
cnt = contours[0] cv2.contourArea() - 輪廓周長計算
# True表示閉合的 cv2.arcLength(cnt,True)
四、輪廓近似
-
將部分折線部分化為直,近似為一個形狀,
counter = cv2.imread("counter.png") # 影像輪廓檢測 gray = cv2.cvtColor(counter, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) # 繪制輪廓資訊 draw_img = lena.copy() res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2) showImg(res, 'res') cnt = contours[0] # 通過改變系數,來改變近似的效果 epsilon = 0.1 * cv2.arcLength(cnt, True) approx = cv2.approxPolyDP(cnt, epsilon, True) draw_img = lena.copy() res = cv2.drawContours(draw_img, [approx], -1, (0, 0, 255), 2) showImg(res, 'res')原始輪廓

部分進行輪廓近似

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/328230.html
標籤:其他
