Python Opencv實(shí)現(xiàn)圖像輪廓識(shí)別功能
本文實(shí)例為大家分享了python opencv識(shí)別圖像輪廓的具體代碼,供大家參考,具體內(nèi)容如下
要求:用矩形或者圓形框住圖片中的云朵(不要求全部框出)
輪廓檢測(cè)
Opencv-Python接口中使用cv2.findContours()函數(shù)來(lái)查找檢測(cè)物體的輪廓。
import cv2 img = cv2.imread('cloud.jpg') # 灰度圖像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化 ret, binary = cv2.threshold(gray, 175, 255, cv2.THRESH_BINARY) img1, contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 以圓形框出云朵 # for i in range(len(contours)): # (x, y), radius = cv2.minEnclosingCircle(contours[i]) # center = (int(x), int(y)) # radius = int(radius) # img = cv2.circle(img, center, radius, (0, 255, 0), 2) #以云朵邊界輪廓框出云朵 cv2.drawContours(img, contours, -1, (0, 0, 255), 3) cv2.imshow("img", img) cv2.waitKey(0)
需要注意的是cv2.findContours()函數(shù)接受的參數(shù)為二值圖,即黑白的(不是灰度圖),所以讀取的圖像要先轉(zhuǎn)成灰度的,再轉(zhuǎn)成二值圖。
cv2.findContours()函數(shù)
函數(shù)的原型為:
cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])
返回兩個(gè)值:contours,hierarchy。注:opencv3會(huì)返回三個(gè)值,分別是img, countours, hierarchy
參數(shù)說(shuō)明
第一個(gè)參數(shù)是尋找輪廓的圖像
第二個(gè)參數(shù)表示輪廓的檢索模式,有四種:
1. cv2.RETR_EXTERNAL表示只檢測(cè)外輪廓
2. cv2.RETR_LIST檢測(cè)的輪廓不建立等級(jí)關(guān)系
3. cv2.RETR_CCOMP建立兩個(gè)等級(jí)的輪廓,上面的一層為外邊界,里面的一層為內(nèi)孔的邊界信息。如果內(nèi)孔內(nèi)還有一個(gè)連通物體,這個(gè)物體的邊界也在頂層。
4. cv2.RETR_TREE建立一個(gè)等級(jí)樹結(jié)構(gòu)的輪廓。
第三個(gè)參數(shù)method為輪廓的近似辦法
cv2.CHAIN_APPROX_NONE存儲(chǔ)所有的輪廓點(diǎn),相鄰的兩個(gè)點(diǎn)的像素位置差不超過(guò)1,
即max(abs(x1−x2),abs(y2−y1))==1max(abs(x1−x2),abs(y2−y1))==1
cv2.CHAIN_APPROX_SIMPLE壓縮水平方向,垂直方向,對(duì)角線方向的元素,只保留該方向的終點(diǎn)坐標(biāo),例如一個(gè)矩形輪廓只需4個(gè)點(diǎn)來(lái)保存輪廓信息
cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法
返回值
cv2.findContours()函數(shù)返回兩個(gè)值,一個(gè)是輪廓本身,還有一個(gè)是每條輪廓對(duì)應(yīng)的屬性。
contour返回值
cv2.findContours()函數(shù)首先返回一個(gè)list,list中每個(gè)元素都是圖像中的一個(gè)輪廓,用numpy中的ndarray表示。這個(gè)概念非常重要。在下面drawContours中會(huì)看見??梢源蛴∮^察contours的數(shù)據(jù)類型。
print (type(contours)) print (type(contours[0])) print (len(contours))
hierarchy返回值
該函數(shù)還可返回一個(gè)可選的hiararchy結(jié)果,這是一個(gè)ndarray,其中的元素個(gè)數(shù)和輪廓個(gè)數(shù)相同,每個(gè)輪廓contours[i]對(duì)應(yīng)4個(gè)hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分別表示后一個(gè)輪廓、前一個(gè)輪廓、父輪廓、內(nèi)嵌輪廓的索引編號(hào),如果沒有對(duì)應(yīng)項(xiàng),則該值為負(fù)數(shù)。
輪廓的繪制
OpenCV中通過(guò)cv2.drawContours在圖像上繪制輪廓。
cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset ]]]]])
第一個(gè)參數(shù)是指明在哪幅圖像上繪制輪廓;
第二個(gè)參數(shù)是輪廓本身,在Python中是一個(gè)list;
第三個(gè)參數(shù)指定繪制輪廓list中的哪條輪廓,如果是-1,則繪制其中的所有輪廓。
后面的參數(shù)很簡(jiǎn)單。其中thickness表明輪廓線的寬度,如果是-1(cv2.FILLED),則為填充模式。
OpenCV中通過(guò)cv2.minEnclosingCircle()可以幫我們找到一個(gè)對(duì)象的外接圓。它是所有能夠包括對(duì)象的圓中面積最小的一個(gè)。
(x,y),radius = cv2.minEnclosingCircle(contours[i]) center = (int(x),int(y)) radius = int(radius) img = cv2.circle(img,center,radius,(0,255,0),2)
本文已被收錄到專題《python圖片處理操作》 ,歡迎大家點(diǎn)擊學(xué)習(xí)更多精彩內(nèi)容。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
淺析python標(biāo)準(zhǔn)庫(kù)中的glob
glob 文件名模式匹配,不用遍歷整個(gè)目錄判斷每個(gè)文件是不是符合。這篇文章主要介紹了python標(biāo)準(zhǔn)庫(kù)中的glob的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2020-03-03運(yùn)行tensorflow python程序,限制對(duì)GPU和CPU的占用操作
今天小編就為大家分享一篇運(yùn)行tensorflow python程序,限制對(duì)GPU和CPU的占用操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02python畫一個(gè)圣誕樹實(shí)現(xiàn)示例
這篇文章主要為大家介紹了使用python畫一個(gè)圣誕樹實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05Win10 GPU運(yùn)算環(huán)境搭建(CUDA10.0+Cudnn 7.6.5+pytroch1.2+tensorflow1.
熟悉深度學(xué)習(xí)的人都知道,深度學(xué)習(xí)是需要訓(xùn)練的,本文主要介紹了Win10 GPU運(yùn)算環(huán)境搭建,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09