基于python使用OpenCV進(jìn)行物體輪廓排序_第1頁
基于python使用OpenCV進(jìn)行物體輪廓排序_第2頁
基于python使用OpenCV進(jìn)行物體輪廓排序_第3頁
基于python使用OpenCV進(jìn)行物體輪廓排序_第4頁
基于python使用OpenCV進(jìn)行物體輪廓排序_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第基于python使用OpenCV進(jìn)行物體輪廓排序在進(jìn)行圖像處理過程中,我們經(jīng)常會遇到一些和物體輪廓相關(guān)的操作,比如求目標(biāo)輪廓的周長面積等,我們直接使用Opencv的findContours函數(shù)可以很容易的得到每個目標(biāo)的輪廓,但是可視化后,這個次序是無序的,如下圖左側(cè)所示:

本節(jié)打算實現(xiàn)對物體輪廓進(jìn)行排序,可以實現(xiàn)從上到下排序或者從左倒右排序,達(dá)到上圖右側(cè)的可視化結(jié)果.

2.1讀取圖像

首先,我們來讀取圖像,并得到其邊緣檢測圖,代碼如下:

image=cv2.imread(args[image])

accumEdged=np.zeros(image.shape[:2],dtype=uint8)

forchanincv2.split(image):

chan=cv2.medianBlur(chan,11)

edged=cv2.Canny(chan,50,200)

accumEdged=cv2.bitwise_or(accumEdged,edged)

cv2.imshow(edgemap,accumEdged)

運行結(jié)果如下:

左側(cè)為原圖,右側(cè)為邊緣檢測圖.

2.2獲取輪廓

opencv-python中查找圖像輪廓的API為:findContours函數(shù),該函數(shù)接收二值圖像作為輸入,可輸出物體外輪廓、內(nèi)外輪廓等等.

代碼如下:

cnts=cv2.findContours(accumEdged.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

cnts=grab_contours(cnts)

cnts=sorted(cnts,key=cv2.contourArea,reverse=True)[:5]

orig=image.copy()

#unsorted

for(i,c)inenumerate(cnts):

orig=draw_contour(orig,c,i)

cv2.imshow(Unsorted,orig)

cv2.imwrite(./Unsorted.jpg,orig)

運行結(jié)果如下:

需要注意的是,在OpenCV2.X版本,函數(shù)findContours返回兩個值,

函數(shù)聲明如下:

contours,hierarchy=cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

但是在OpenCV3以上版本,該函數(shù)的聲明形式如下:

image,contours,hierarchy=cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

所以為了適配兩種模式,我們實現(xiàn)函數(shù)grab_contours來根據(jù)不同的版本,選擇對應(yīng)的返回輪廓的下標(biāo)位置,

代碼如下:

defgrab_contours(cnts):

iflen(cnts)==2:

cnts=cnts[0]

eliflen(cnts)==3:

cnts=cnts[1]

returncnts

2.3輪廓排序

通過上述步驟,我們得到了圖像中的所有物體的輪廓,接下來我們定義函數(shù)sort_contours函數(shù)來實現(xiàn)對輪廓進(jìn)行排序操作,該函數(shù)接受method參數(shù)來實現(xiàn)按照不同的次序?qū)喞M(jìn)行排序,比如從左往右,或者從右往左.

代碼如下:

defsort_contours(cnts,method=left-to-right):

reverse=False

i=0

ifmethod==right-to-leftormethod==bottom-to-top:

reverse=True

ifmethod==bottom-to-topormethod==top-to-bottom:

i=1

boundingBoxes=[cv2.boundingRect(c)forcincnts]

(cnts,boundingBoxes)=zip(*sorted(zip(cnts,boundingBoxes),key=lambdab:b[1][i],reverse=reverse))

return(cnts,boundingBoxes)

上述代碼的核心思想為先求出每個輪廓的外接矩形框,然后通過對外接框按照x或y坐標(biāo)排序進(jìn)而來實現(xiàn)對輪廓的排序.

調(diào)用代碼如下:

#sorted

(cnts,boundingboxes)=sort_contours(cnts,method=args[method])

for(i,c)inenumerate(cnts):

image=draw_contour(image,c,i)

cv2.imshow(Sorted,image)

cv2.wai

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論