Python OpenCV 基於圖像邊緣提取的輪廓發現函數
基礎知識鋪墊
在圖像中,輪廓可以簡單的理解為連接具有相同顏色的所有連續點(邊界)的曲線,輪廓可用於形狀分析和對象檢測、識別等領域。
輪廓發現的原理:先通過閾值分割提取目標物體,再通過邊緣檢測提取目標物體輪廓。
一個輪廓就是一系列的點(像素),這些點構成瞭一個有序的點集合。
使用 cv2.findContours
函數可以用來檢測圖像的邊緣。
函數原型說明
contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
我使用的 Python OpenCV 是 4.0 以上版本,如果你使用的是 3.0 以上,可能存在返回值差異問題。
參數說明如下:
image
:輸入圖像;mode
:輪廓檢索模式,具體說明參見後文;method
:輪廓逼近方法,具體說明參加後文;contours
:返回的輪廓;hierachy
:每條輪廓對應的屬性;offset
:每個輪廓點移動的可選偏移量。
備註:image
參數需要是二值圖,而不是灰度圖,返回結果是等高線和層次結構。
輪廓檢索模式,有四種
cv2.RETR_EXTERNAL
:表示隻檢測外輪廓;cv2.RETR_LIST
:檢測的輪廓,不建立等級關系;cv2.RETR_CCOMP
:建立兩個等級的輪廓,上面的一層為外邊界,裡面的一層為內孔的邊界信息。如果內孔內還有一個連通物體,這個物體的邊界也在頂層;cv2.RETR_TREE
:建立一個等級樹結構的輪廓。上述內容,都可以在該網站查詢:官網地址
輪廓逼近方法
cv2.CHAIN_APPROX_NONE
:存儲所有的輪廓點,相鄰的兩個點的像素位置差不超過 1,即max(abs(x1-x2),abs(y2-y1))==1
,一般不會用到;cv2.CHAIN_APPROX_SIMPLE
:壓縮水平方向,垂直方向,對角線方向的元素,隻保留該方向的終點坐標,例如一個矩形輪廓隻需 4 個點來保存輪廓信息。cv2.CHAIN_APPROX_TC89_L1
,cv2.CV_CHAIN_APPROX_TC89_KCOS
:使用teh-Chinl chain
近似算法(沒尋找資料學習)。
瞭解上述內容之後,就可以應用輪廓發現函數瞭,代碼如下:
import cv2 as cv src = cv.imread("./both.jpeg") gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY) ret, thresh = cv.threshold(gray, 150, 255, 0) cv.imshow("thresh",thresh) # 尋找輪廓 contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
輪廓發現之後,還要通過 cv2.drawContours
函數繪制輪廓,該函數原型如下:
image = cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])
參數說明如下:
image
:輸入圖像;contours
:輪廓,在 Python 中是一個 list,就是cv2.findContours
函數找出來的點集,一個列表;contourIdx
:輪廓的索引,指定繪制輪廓 list 中的哪條輪廓,要繪制所有輪廓,請傳遞-1;color
:顏色;thickness
:厚度,如果是-1,表示填充;lineType
:線型;hierarchy
:層次結構的可選信息;maxLevel
:繪制輪廓的最大級別,0:僅繪制指定的輪廓,1:繪制輪廓和所有嵌套輪廓,2:繪制輪廓,所有嵌套輪廓,所有嵌套到嵌套的輪廓;offset
:輪廓偏移參數。
測試代碼與運行結果如下:
import cv2 as cv # help(cv.drawContours) src = cv.imread("./both.jpeg") gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY) ret, thresh = cv.threshold(gray, 150, 255, 0) cv.imshow("thresh",thresh) # 尋找輪廓 contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) # print(contours) # print(hierarchy) # 繪制輪廓 cv.drawContours(src,contours,-1,(200,0,150),2) cv.imshow('src',src) cv.waitKey(0)
到此這篇關於Python OpenCV 基於圖像邊緣提取的輪廓發現函數的文章就介紹到這瞭,更多相關OpenCV 邊緣提取輪廓 內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- python OpenCV圖像金字塔
- OpenCV圖像輪廓的繪制方法
- python opencv 畫外接矩形框的完整代碼
- Python使用Opencv實現邊緣檢測以及輪廓檢測的實現
- OpenCV-Python實現輪廓擬合