您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“怎么利用Python+OpenCV實(shí)現(xiàn)簡(jiǎn)易圖像邊緣輪廓檢測(cè)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“怎么利用Python+OpenCV實(shí)現(xiàn)簡(jiǎn)易圖像邊緣輪廓檢測(cè)”吧!
本文所用的第三方庫(kù)是Opencv4.3
導(dǎo)入第三方庫(kù)
import cv2 as cv
由于Opencv顯示圖像比較麻煩,與matlab或matplob不一致,考慮到基礎(chǔ)薄弱可能對(duì)此庫(kù)的圖像顯示機(jī)制不了解,在此我先定義一個(gè)img_show函數(shù),目的是更方便的顯示圖像。
def img_show(pic,name): ''' 此函數(shù)img_show()用于調(diào)用OpenCV的相關(guān)函數(shù)來進(jìn)行圖像展示 name為顯示圖像窗口的名稱(name為字符串) pic為被顯示圖像(pic為opencv imread進(jìn)來的圖片) ''' cv.imshow(pic,name) cv.waitkey(0) cv.destroyAllWindows()
此函數(shù)用于圖像單通道不同閾值的操作,一般用來將圖像進(jìn)行二值化處理,二值化處理將有助于邊緣檢測(cè)的梯度計(jì)算。
其中pic為待處理圖片,由于是對(duì)單通道處理,所以pic一般要轉(zhuǎn)換為灰度圖
thresh為操作閾值,高于這個(gè)閾值的將根據(jù)不同的model統(tǒng)一成 0 或 maxvalue
model為操作方法,一般只需要cv.THRESH_BINARY_INV和cv.THRESH_BINARY
…THRESH_BINARY_INV 將大于thresh的設(shè)置為0
…THRESH_BINARY 將大于thresh的設(shè)置為255
該圖像有兩個(gè)返回值,第一個(gè)返回值為閾值,即thresh值,第二個(gè)為二值圖像的矩陣
此函數(shù)用于提取pic的輪廓點(diǎn),pic為二值圖像時(shí),函數(shù)提取將更加精準(zhǔn)
model 為提取模式 一般用到cv.RETR_EXTERNAL和cv.RETR_TREE
…Extrnal為以外層輪廓的方式進(jìn)行提取
…Tree則提取圖像內(nèi)外層所有輪廓
method 為提取方法,有cv.CHAIN_APPROX_NONE和cv.CHAIN_APPROX_SIMPLE
…NONE為以線的方式連接提取出來的輪廓
…SIMPLE則壓縮了線和斜邊,只標(biāo)記了輪廓的各個(gè)頂點(diǎn)
此函數(shù)的返回值有兩個(gè),一個(gè)是邊緣點(diǎn)(列表形式),一個(gè)是層次信息
contours,hierarchy = cv.findContours(pic,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_NONE)
此段代碼的意思是
基于pic 此圖像
使用描述外輪廓的模式
通過各個(gè)點(diǎn)鏈接的方式進(jìn)行輪廓提取
最終得到輪廓列表集合contours和層次關(guān)系hierarchy
注:在contours里面有非常多的輪廓集合,比如contours[0]\contours[1]\contours[2]是三個(gè)輪廓,可能只有1是目標(biāo)輪廓,其他均為噪聲輪廓
此函數(shù)用于在指定畫布,用指定顏色粗細(xì)的線畫出指定輪廓(索引判斷)或所有輪廓(-1)
畫布:將輪廓點(diǎn)畫在畫布上,一般是代替去圖片的copy圖,不然會(huì)污染原圖。
輪廓集合:上文中提到的contours,其中包含了目標(biāo)輪廓和噪聲輪廓的所有輪廓
索引:選定輪廓集合中的某一輪廓,如果你知道目標(biāo)輪廓的編號(hào)可以直接寫,如果不知道就寫-1,可以畫出所有輪廓
顏色: 元組形式,(255,0,0)為紅色,以此類推
粗細(xì):輪廓的粗細(xì) 1~任意整數(shù),太大會(huì)覆蓋原圖
此函數(shù)用于將檢測(cè)的函數(shù)進(jìn)行矩陣點(diǎn)的查找
圖像:被檢測(cè)的圖像,一般是傳入目標(biāo)的輪廓,即contours[index],index為目標(biāo)編號(hào)
此函數(shù)會(huì)返回四個(gè)值:x,y,w,h
其中x,y指的是該圖像x軸上最小值和y軸最小值(有左上角為原點(diǎn)時(shí)),w,h跟別指的囊括圖像所有的寬和高
#導(dǎo)入opencv import cv2 as cv #定義opencv的圖像顯示函數(shù) def img_show(pic,name): cv.imshow(pic,name) cv.waitKey(0) cv.destroyAllWindows() #彩色模式讀入圖片 eagle_o = cv.imread('eagle.png',1) # 圖片轉(zhuǎn)為灰度圖 eagle = cv.cvtColor(eagle_o,cv.COLOR_BGR2GRAY) # 將圖像轉(zhuǎn)換為二值圖 ret,eagle_2v = cv.threshold(eagle,125,255,cv.THRESH_BINARY_INV) #ret為閾值,eagl_2v為二值圖 # 基于二值圖像用外輪廓的模式,通過全點(diǎn)連接輪廓的方法提取輪廓 contours,hierarchy = cv.findContours(eagle_2v,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_NONE) # 在copy圖上畫出所有輪廓 img = cv.drawContours(eagle_o.copy(),contours,-1,(255,25,0),5) # 獲取目標(biāo)圖像的最小矩陣,此處29為目標(biāo)的輪廓 x,y,w,h = cv.boundingRect(contours[29]) # 繪制目標(biāo)框 img = cv.rectangle(eagle_o,(x,y),(x+w,y+h),(255,255,0),7) img_show('goal',img)
到此,相信大家對(duì)“怎么利用Python+OpenCV實(shí)現(xiàn)簡(jiǎn)易圖像邊緣輪廓檢測(cè)”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。