如何利用Python+OpenCV實現(xiàn)簡易圖像邊緣輪廓檢測(零基礎(chǔ))
前言
圖像的輪廓檢測不論是機器視覺還是其他方面都有較大作用,本文將基與Python3.7和OpenCV4.3對靜態(tài)圖像進行輪廓檢測。最終以方框的形式框出目標圖像。
函數(shù)基礎(chǔ)與三方庫
本文所用的第三方庫是Opencv4.3
導(dǎo)入第三方庫
import cv2 as cv
由于Opencv顯示圖像比較麻煩,與matlab或matplob不一致,考慮到基礎(chǔ)薄弱可能對此庫的圖像顯示機制不了解,在此我先定義一個img_show函數(shù),目的是更方便的顯示圖像。
def img_show(pic,name):
'''
此函數(shù)img_show()用于調(diào)用OpenCV的相關(guān)函數(shù)來進行圖像展示
name為顯示圖像窗口的名稱(name為字符串)
pic為被顯示圖像(pic為opencv imread進來的圖片)
'''
cv.imshow(pic,name)
cv.waitkey(0)
cv.destroyAllWindows()
cv.threshold(pic,thresh,maxvalue,model)
此函數(shù)用于圖像單通道不同閾值的操作,一般用來將圖像進行二值化處理,二值化處理將有助于邊緣檢測的梯度計算。
其中pic為待處理圖片,由于是對單通道處理,所以pic一般要轉(zhuǎn)換為灰度圖
thresh為操作閾值,高于這個閾值的將根據(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
該圖像有兩個返回值,第一個返回值為閾值,即thresh值,第二個為二值圖像的矩陣
cv.findContours(待處理圖片,model(提取模式),method(提取方法))
此函數(shù)用于提取pic的輪廓點,pic為二值圖像時,函數(shù)提取將更加精準
model 為提取模式 一般用到cv.RETR_EXTERNAL和cv.RETR_TREE
…Extrnal為以外層輪廓的方式進行提取
…Tree則提取圖像內(nèi)外層所有輪廓
method 為提取方法,有cv.CHAIN_APPROX_NONE和cv.CHAIN_APPROX_SIMPLE
…NONE為以線的方式連接提取出來的輪廓
…SIMPLE則壓縮了線和斜邊,只標記了輪廓的各個頂點
此函數(shù)的返回值有兩個,一個是邊緣點(列表形式),一個是層次信息
contours,hierarchy = cv.findContours(pic,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_NONE)
此段代碼的意思是
基于pic 此圖像
使用描述外輪廓的模式
通過各個點鏈接的方式進行輪廓提取
最終得到輪廓列表集合contours和層次關(guān)系hierarchy
注:在contours里面有非常多的輪廓集合,比如contours[0]\contours[1]\contours[2]是三個輪廓,可能只有1是目標輪廓,其他均為噪聲輪廓
cv.drawContours(畫布,輪廓集合,索引,顏色,粗細)
此函數(shù)用于在指定畫布,用指定顏色粗細的線畫出指定輪廓(索引判斷)或所有輪廓(-1)
畫布:將輪廓點畫在畫布上,一般是代替去圖片的copy圖,不然會污染原圖。
輪廓集合:上文中提到的contours,其中包含了目標輪廓和噪聲輪廓的所有輪廓
索引:選定輪廓集合中的某一輪廓,如果你知道目標輪廓的編號可以直接寫,如果不知道就寫-1,可以畫出所有輪廓
顏色: 元組形式,(255,0,0)為紅色,以此類推
粗細:輪廓的粗細 1~任意整數(shù),太大會覆蓋原圖
cv.boundingRect(圖像)
此函數(shù)用于將檢測的函數(shù)進行矩陣點的查找
圖像:被檢測的圖像,一般是傳入目標的輪廓,即contours[index],index為目標編號
此函數(shù)會返回四個值:x,y,w,h
其中x,y指的是該圖像x軸上最小值和y軸最小值(有左上角為原點時),w,h跟別指的囊括圖像所有的寬和高
代碼實現(xiàn)
#導(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為二值圖
# 基于二值圖像用外輪廓的模式,通過全點連接輪廓的方法提取輪廓
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)
# 獲取目標圖像的最小矩陣,此處29為目標的輪廓
x,y,w,h = cv.boundingRect(contours[29])
# 繪制目標框
img = cv.rectangle(eagle_o,(x,y),(x+w,y+h),(255,255,0),7)
img_show('goal',img)實現(xiàn)效果

總結(jié)
到此這篇關(guān)于如何利用Python+OpenCV實現(xiàn)簡易圖像邊緣輪廓檢測的文章就介紹到這了,更多相關(guān)Python OpenCV圖像邊緣輪廓檢測內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python虛擬環(huán)境終極(含PyCharm的使用教程)
這篇文章主要介紹了Python虛擬環(huán)境終極(含PyCharm的使用教程),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04
Python數(shù)據(jù)結(jié)構(gòu)與算法之圖結(jié)構(gòu)(Graph)實例分析
這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)與算法之圖結(jié)構(gòu)(Graph),結(jié)合實例形式分析了圖結(jié)構(gòu)的概念、原理、使用方法及相關(guān)操作技巧,需要的朋友可以參考下2017-09-09
Python調(diào)用系統(tǒng)命令os.system()和os.popen()的實現(xiàn)
這篇文章主要介紹了Python調(diào)用系統(tǒng)命令os.system()和os.popen()的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Numpy數(shù)組的轉(zhuǎn)置和軸交換的實現(xiàn)
本文主要介紹了Numpy數(shù)組的轉(zhuǎn)置和軸交換的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
使用Python解析FineReport模板數(shù)據(jù)集
這篇文章主要為大家詳細介紹了如何使用Python解析FineReport模板數(shù)據(jù)集,文中的示例代碼講解詳細,具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解下2023-12-12
jupyter notebook運行代碼沒反應(yīng)且in[ ]沒有*
本文主要介紹了jupyter notebook運行代碼沒反應(yīng)且in[ ]沒有*,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
Python測試函數(shù)出現(xiàn)AssertionError:None?!=?‘Janis?Joplin‘問題及解決
這篇文章主要介紹了Python測試函數(shù)出現(xiàn)AssertionError:None?!=?‘Janis?Joplin‘問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09

