Python OpenCV 基于圖像邊緣提取的輪廓發(fā)現(xiàn)函數(shù)
基礎(chǔ)知識鋪墊
在圖像中,輪廓可以簡單的理解為連接具有相同顏色的所有連續(xù)點(diǎn)(邊界)的曲線,輪廓可用于形狀分析和對象檢測、識別等領(lǐng)域。
輪廓發(fā)現(xiàn)的原理:先通過閾值分割提取目標(biāo)物體,再通過邊緣檢測提取目標(biāo)物體輪廓。
一個(gè)輪廓就是一系列的點(diǎn)(像素),這些點(diǎn)構(gòu)成了一個(gè)有序的點(diǎn)集合。
使用 cv2.findContours 函數(shù)可以用來檢測圖像的邊緣。
函數(shù)原型說明
contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
我使用的 Python OpenCV 是 4.0 以上版本,如果你使用的是 3.0 以上,可能存在返回值差異問題。
參數(shù)說明如下:
image:輸入圖像;mode:輪廓檢索模式,具體說明參見后文;method:輪廓逼近方法,具體說明參加后文;contours:返回的輪廓;hierachy:每條輪廓對應(yīng)的屬性;offset:每個(gè)輪廓點(diǎn)移動(dòng)的可選偏移量。
備注:image 參數(shù)需要是二值圖,而不是灰度圖,返回結(jié)果是等高線和層次結(jié)構(gòu)。
輪廓檢索模式,有四種
cv2.RETR_EXTERNAL:表示只檢測外輪廓;cv2.RETR_LIST:檢測的輪廓,不建立等級關(guān)系;cv2.RETR_CCOMP:建立兩個(gè)等級的輪廓,上面的一層為外邊界,里面的一層為內(nèi)孔的邊界信息。如果內(nèi)孔內(nèi)還有一個(gè)連通物體,這個(gè)物體的邊界也在頂層;cv2.RETR_TREE:建立一個(gè)等級樹結(jié)構(gòu)的輪廓。上述內(nèi)容,都可以在該網(wǎng)站查詢:官網(wǎng)地址
輪廓逼近方法
cv2.CHAIN_APPROX_NONE:存儲(chǔ)所有的輪廓點(diǎn),相鄰的兩個(gè)點(diǎn)的像素位置差不超過 1,即max(abs(x1-x2),abs(y2-y1))==1,一般不會(huì)用到;cv2.CHAIN_APPROX_SIMPLE:壓縮水平方向,垂直方向,對角線方向的元素,只保留該方向的終點(diǎn)坐標(biāo),例如一個(gè)矩形輪廓只需 4 個(gè)點(diǎn)來保存輪廓信息。cv2.CHAIN_APPROX_TC89_L1,cv2.CV_CHAIN_APPROX_TC89_KCOS:使用teh-Chinl chain近似算法(沒尋找資料學(xué)習(xí))。
了解上述內(nèi)容之后,就可以應(yīng)用輪廓發(fā)現(xiàn)函數(shù)了,代碼如下:
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)
輪廓發(fā)現(xiàn)之后,還要通過 cv2.drawContours 函數(shù)繪制輪廓,該函數(shù)原型如下:
image = cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])
參數(shù)說明如下:
image:輸入圖像;contours:輪廓,在 Python 中是一個(gè) list,就是cv2.findContours函數(shù)找出來的點(diǎn)集,一個(gè)列表;contourIdx:輪廓的索引,指定繪制輪廓 list 中的哪條輪廓,要繪制所有輪廓,請傳遞-1;color:顏色;thickness:厚度,如果是-1,表示填充;lineType:線型;hierarchy:層次結(jié)構(gòu)的可選信息;maxLevel:繪制輪廓的最大級別,0:僅繪制指定的輪廓,1:繪制輪廓和所有嵌套輪廓,2:繪制輪廓,所有嵌套輪廓,所有嵌套到嵌套的輪廓;offset:輪廓偏移參數(shù)。
測試代碼與運(yùn)行結(jié)果如下:
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)

到此這篇關(guān)于Python OpenCV 基于圖像邊緣提取的輪廓發(fā)現(xiàn)函數(shù)的文章就介紹到這了,更多相關(guān)OpenCV 邊緣提取輪廓 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python給指定csv表格中的聯(lián)系人群發(fā)郵件(帶附件的郵件)
這篇文章主要介紹了python給指定csv表格中的聯(lián)系人群發(fā)郵件,本文通過代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12
詳解如何使用numpy提高Python數(shù)據(jù)分析效率
NumPy是Python語言的一個(gè)第三方庫,其支持大量高維度數(shù)組與矩陣運(yùn)算。本文主要為大家介紹了如何使用numpy提高python數(shù)據(jù)分析效率,需要的可以參考一下2023-04-04
python GUI庫圖形界面開發(fā)之PyQt5下拉列表框控件QComboBox詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5下拉列表框控件QComboBox詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-02-02
Python光學(xué)仿真學(xué)習(xí)處理高斯光束分布圖像
這篇文章主要為大家介紹了Python光學(xué)仿真學(xué)習(xí)之如何處理高斯光束的分布圖像,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10
YOLOv5改進(jìn)之添加CBAM注意力機(jī)制的方法
注意力機(jī)制最先被用在NLP領(lǐng)域,Attention就是為了讓模型認(rèn)識到數(shù)據(jù)中哪一部分是最重要的,為它分配更大的權(quán)重,獲得更多的注意力在一些特征上,讓模型表現(xiàn)更好,這篇文章主要給大家介紹了關(guān)于YOLOv5改進(jìn)之添加CBAM注意力機(jī)制的相關(guān)資料,需要的朋友可以參考下2022-11-11
在Python中獲取操作系統(tǒng)的進(jìn)程信息
今天小編就為大家分享一篇在Python中獲取操作系統(tǒng)的進(jìn)程信息,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
python pandas dataframe如何獲取除了指定列以外的所有列
這篇文章主要介紹了python pandas dataframe如何獲取除了指定列以外的所有列問題,具有很好的參考價(jià)值,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
Python實(shí)現(xiàn)遍歷大量表格文件并篩選出數(shù)據(jù)缺失率低的文件
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)遍歷大量表格文件并篩選出表格內(nèi)數(shù)據(jù)缺失率低的文件的功能,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-05-05
淺談tensorflow1.0 池化層(pooling)和全連接層(dense)
本篇文章主要介紹了淺談tensorflow1.0 池化層(pooling)和全連接層(dense),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04

