《計(jì)算機(jī)視覺應(yīng)用與實(shí)踐》課件-項(xiàng)目6 物體檢測與計(jì)數(shù)_第1頁
《計(jì)算機(jī)視覺應(yīng)用與實(shí)踐》課件-項(xiàng)目6 物體檢測與計(jì)數(shù)_第2頁
《計(jì)算機(jī)視覺應(yīng)用與實(shí)踐》課件-項(xiàng)目6 物體檢測與計(jì)數(shù)_第3頁
《計(jì)算機(jī)視覺應(yīng)用與實(shí)踐》課件-項(xiàng)目6 物體檢測與計(jì)數(shù)_第4頁
《計(jì)算機(jī)視覺應(yīng)用與實(shí)踐》課件-項(xiàng)目6 物體檢測與計(jì)數(shù)_第5頁
已閱讀5頁,還剩64頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

計(jì)算機(jī)視覺技術(shù)及應(yīng)用物體檢測與計(jì)數(shù)項(xiàng)目六

01 閾值處理02 形態(tài)學(xué)變換03 項(xiàng)目實(shí)施——紐扣檢測與計(jì)數(shù)04 項(xiàng)目實(shí)訓(xùn)目錄項(xiàng)目目標(biāo)知識目標(biāo)理解圖像閾值處理的概念及其用途。掌握圖像閾值處理中常用方法的基本原理。了解圖像形態(tài)學(xué)變換的基礎(chǔ)知識。掌握腐蝕和膨脹的基本原理。了解開運(yùn)算和閉運(yùn)算的基本原理。了解形態(tài)學(xué)梯度運(yùn)算、頂帽運(yùn)算和黑帽運(yùn)算的基本概念。技能目標(biāo)能夠使用OpenCV進(jìn)行圖像的閾值處理。能夠使用OpenCV進(jìn)行圖像的形態(tài)學(xué)變換。素養(yǎng)目標(biāo)提高分析問題和解決問題的能力和自信心。提升總結(jié)規(guī)律和將事物化繁為簡的能力。對圖像中的物體進(jìn)行檢測與計(jì)數(shù)是很多圖像分析與識別任務(wù)的前提。小旌了解到,圖像形態(tài)學(xué)能夠使用具有一定形態(tài)的結(jié)構(gòu)元素來度量和提取圖像中的形狀或特征。于是,他打算使用形態(tài)學(xué)變換對圖像中的紐扣進(jìn)行檢測與計(jì)數(shù)。為了保證圖像檢測與計(jì)數(shù)的準(zhǔn)確性,小旌首先對圖像進(jìn)行預(yù)處理,包括高斯濾波、色彩空間的轉(zhuǎn)換和二值化閾值處理,然后對預(yù)處理后的圖像進(jìn)行了膨脹、腐蝕和形態(tài)學(xué)梯度運(yùn)算,最后在形態(tài)學(xué)梯度運(yùn)算后的圖像中查找、篩選并為檢測到的紐扣繪制矩形框,同時(shí),通過計(jì)算矩形框的數(shù)量來統(tǒng)計(jì)紐扣的數(shù)量。項(xiàng)目描述項(xiàng)目準(zhǔn)備全班學(xué)生以

3~5

人為一組進(jìn)行分組,各組選出組長。組長組織組員掃碼觀看“形態(tài)學(xué)變換的應(yīng)用”視頻,討論并回答下列問題。問題1:什么是形態(tài)學(xué)?問題2:說出形態(tài)學(xué)運(yùn)算在圖像處理中的3種應(yīng)用。01閾值處理閾值處理直方圖閾值處理是圖像處理中的一種基本技術(shù),它能夠?qū)D像進(jìn)行二值化處理,即將圖像中的每個(gè)像素的灰度值設(shè)置為0或255(或者是0到255之間的任意兩個(gè)值)。在數(shù)字圖像處理中,閾值處理的應(yīng)用如下:二值化特征提取圖像分割邊緣檢測閾值處理直方圖若設(shè)置閾值為T,并將圖像中像素灰度值大于閾值T的像素灰度值設(shè)置為255,將像素灰度值小于或等于閾值T的像素灰度值設(shè)置為0,則其閾值處理的變換公式如下。

其中,為輸出圖像像素的灰度值,為原圖像像素的灰度值。當(dāng)閾值T為127時(shí),閾值處理的示例如圖所示。1201241051451003310610820066708011015618872160911801011673116851776813351181856521071302030000255000025500002552550255025502550255000255002550255025500閾值處理01TEGOSEHERE02TITLEGOSEHERE03TITLEGOSEHERE全局閾值處理Otsu閾值處理自適應(yīng)閾值常用的閾值處理方式有:

全局閾值處理是基于整幅圖像的統(tǒng)計(jì)信息,通過計(jì)算像素灰度值的平均值或直方圖的峰值來確定一個(gè)全局閾值。將圖像中的像素灰度值與該閾值進(jìn)行比較,將高于閾值的像素灰度值設(shè)置為255(或特定值),低于閾值的像素灰度值設(shè)置為0(或特定值)。閾值處理>1.全局閾值處理全局閾值處理格式:retval,dst=cv2.threshold(src,thresh,maxval,type)cv2.threshold()函數(shù)

閾值處理>1.全局閾值處理retval表示閾值處理使用的閾值;dst表示輸出圖像,即閾值分割后的圖像;src表示輸入圖像,即待進(jìn)行閾值處理的圖像;thresh表示要設(shè)置的閾值;maxval表示當(dāng)type為cv2.THRESH_BINARY或者cv2.THRESH_BINARY_INV類型時(shí)要設(shè)置的最大值;type表示閾值處理的類型。OpenCV提供的cv2.threshold()函數(shù)用于實(shí)現(xiàn)圖像的全局閾值處理。閾值處理>1.全局閾值處理type表示閾值處理的類型,常用的閾值處理類型和含義如下表所示:

閾值處理類型 含義cv2.THRESH_BINARY二值化閾值處理。若圖像中像素的灰度值大于閾值,則將其灰度值設(shè)置為最大值,否則,將其像素值設(shè)置為0cv2.THRESH_BINARY_INV反二值化閾值處理。若圖像中像素的灰度值大于閾值,則將其灰度值設(shè)置為0,否則,將其像素值設(shè)置為最大值cv2.THRESH_TOZERO低閾值零處理。若圖像中像素的灰度值小于或等于閾值,則將其灰度值設(shè)置為0,否則,其像素值不變cv2.THRESH_TOZERO_INV超閾值零處理。若圖像中像素的灰度值大于閾值,則將其灰度值設(shè)置為0,否則,其像素值不變cv2.THRESH_TRUNC截?cái)嚅撝堤幚怼H魣D像中像素的灰度值大于閾值,則將其灰度值設(shè)置為閾值,否則,其像素值不變【例6-1】編寫程序,使用

OpenCV

cv2.threshold()函數(shù)對圖像“river.png”(見本書配套素材“例題圖像/river.png”)進(jìn)行全局閾值處理,并顯示原圖像和閾值處理后的圖像?!緟⒖即a】importcv2

#導(dǎo)入OpenCV庫image=cv2.imread("river.png")

#讀取原圖像t1,dst1=cv2.threshold(image,127,255,cv2.THRESH_BINARY)

#二值化閾值處理

t2,dst2=cv2.threshold(image,127,255,cv2.THRESH_BINARY_INV)

#反二值化閾值處理t3,dst3=cv2.threshold(image,127,255,cv2.THRESH_TOZERO)

#低閾值零處理t4,dst4=cv2.threshold(image,127,255,cv2.THRESH_TOZERO_INV)

#超閾值零處理t5,dst5=cv2.threshold(image,127,255,cv2.THRESH_TRUNC)

#截?cái)嚅撝堤幚韈v2.imshow('Input',image)

#顯示原圖像cv2.imshow('BINARY',dst1)

#顯示閾值處理后的圖像cv2.imshow('BINARY_INV',dst2)cv2.imshow('TOZERO',dst3)cv2.imshow('TOZERO_INV',dst4)cv2.imshow('TRUNC',dst5)cv2.waitKey()

#窗口等待,按任意鍵繼續(xù)cv2.destroyAllWindows()

#釋放所有窗口閾值處理>1.全局閾值處理【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如下圖所示。閾值處理>1.全局閾值處理(a)原圖像

(b)二值化閾值處理后的圖像

(c)反二值化閾值處理后的圖像(d)低閾值零處理后的圖像

(e)超閾值零處理后的圖像

(f)截?cái)嚅撝堤幚砗蟮膱D像Otsu

閾值處理又稱最大類間方差法,它根據(jù)圖像的直方圖自動(dòng)選擇一個(gè)閾值,使得前景和背景的類內(nèi)方差最小,類間方差最大。這種方法不需要用戶指定閾值,能夠自適應(yīng)地找到最佳的閾值。它適用于圖像灰度直方圖具有雙峰的情況,可以最大化兩個(gè)類別(前景和背景)之間的方差。閾值處理>2.Otsu閾值處理Otsu閾值處理格式:retval,dst=cv2.threshold(src,thresh,maxval,type)cv2.threshold()函數(shù)

閾值處理>2.Otsu閾值處理注意:參數(shù)同上,需要將閾值處理類型參數(shù)type加上“cv2.THRESH_OTSU”,同時(shí)將用于設(shè)置閾值的參數(shù)thresh設(shè)置為0,表明函數(shù)會(huì)自動(dòng)計(jì)算最佳閾值,不需要手動(dòng)設(shè)置閾值。OpenCV提供的cv2.threshold()函數(shù)用于實(shí)現(xiàn)圖像的Otsu閾值處理。【例6-2】編寫程序,使用

OpenCV

cv2.threshold()函數(shù)對圖像“campus.png”(見本書配套素材“例題圖像/campus.png”)進(jìn)行Otsu閾值處理,并顯示原圖像和Otsu閾值處理后的圖像。【參考代碼】importcv2 #導(dǎo)入OpenCV庫image=cv2.imread("campus.png")

#讀取原圖像image_Gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)#二值化閾值處理t1,dst1=cv2.threshold(image_Gray,127,255,cv2.THRESH_BINARY)#Otsu閾值處理t2,dst2=cv2.threshold(image_Gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)cv2.imshow('Input',image) #顯示原圖像cv2.imshow('BINARY',dst1) #顯示二值化閾值處理后的圖像cv2.imshow('OTSU',dst2) #顯示Otsu閾值處理后的圖像cv2.waitKey() #窗口等待,按任意鍵繼續(xù)cv2.destroyAllWindows() #釋放所有窗口閾值處理>2.Otsu閾值處理【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如下圖所示。閾值處理>2.Otsu閾值處理(a)原圖像

(b)二值化閾值處理后的圖像

(c)Otsu閾值處理后的圖像閾值處理>2.Otsu閾值處理Otsu

閾值處理對應(yīng)的直方圖有什么特點(diǎn)?Otsu

閾值處理是假設(shè)圖像的灰度直方圖具有雙峰,即存在兩個(gè)主要的灰度級別分布,一個(gè)對應(yīng)于前景,另一個(gè)對應(yīng)于背景。如果圖像的直方圖不是雙峰的,那么

Otsu閾值處理可能不會(huì)得到很好的結(jié)果。自適應(yīng)閾值處理是一種使用變化的閾值來完成圖像閾值處理的技術(shù)。與全局閾值處理不同,自適應(yīng)閾值處理通過計(jì)算每個(gè)像素周圍鄰近區(qū)域的灰度值的加權(quán)平均值獲得閾值,并使用該閾值對當(dāng)前像素進(jìn)行閾值處理。自適應(yīng)閾值處理能夠更好地處理明暗差異較大的圖像,因?yàn)樗鼮槊總€(gè)像素或像素塊選擇了更合適的閾值。閾值處理>3.自適應(yīng)閾值處理自適應(yīng)閾值處理格式:dst=cv2.adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,C)cv2.adaptiveThreshold()函數(shù)

閾值處理>3.自適應(yīng)閾值處理dst表示輸出圖像,即自適應(yīng)閾值處理后的圖像;src表示輸入圖像,即待進(jìn)行閾值處理的圖像,該圖像須為灰度圖像;maxValue

表示自適應(yīng)閾值處理所使用的最大值;adaptiveMethod表示自適應(yīng)閾值的計(jì)算方法;thresholdType表示閾值處理的類型,其值為cv2.THRESH_BINARY或cv2.THRESH_BINARY_INV;blockSize表示計(jì)算局部閾值鄰域的大??;C為常量,表示在每個(gè)區(qū)域計(jì)算出的閾值的基礎(chǔ)上,再減去常量C,作為這個(gè)區(qū)域的最終閾值,其值可以為負(fù)數(shù)。OpenCV提供的cv2.adaptiveThreshold()函數(shù)用于實(shí)現(xiàn)圖像的自適應(yīng)閾值處理。閾值處理>3.自適應(yīng)閾值處理adaptiveMethod表示自適應(yīng)閾值的計(jì)算方法,自適應(yīng)閾值的計(jì)算方法和含義如下表所示:

自適應(yīng)閾值的計(jì)算方法 含義cv2.ADAPTIVE_THRESH_MEAN_C鄰域中所有像素的權(quán)重相同,即像素的閾值為所在鄰域所有像素的均值減去常量Ccv2.ADAPTIVE_THRESH_GAUSSIAN_C鄰域中像素的權(quán)重與其到中心點(diǎn)的距離有關(guān),使用高斯函數(shù)計(jì)算各像素的權(quán)重,即像素的閾值為所在鄰域像素的高斯加權(quán)均值減去常量C【例6-3】編寫程序,使用

OpenCV

cv2.adaptiveThreshold()函數(shù)對圖像“mountain.png”(見本書配套素材“例題圖像/mountain.png”)進(jìn)行自適應(yīng)閾值處理,并顯示原圖像和閾值處理后的圖像?!緟⒖即a】importcv2

#導(dǎo)入OpenCV庫image=cv2.imread("mountain.png")

#讀取原圖像image_Gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)athdMEAM=cv2.adaptiveThreshold(image_Gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,3)#自適應(yīng)閾值處理athdGAUS=cv2.adaptiveThreshold(image_Gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,3)cv2.imshow('Input',image)

#顯示原圖像cv2.imshow("image_Gray",image_Gray)

#顯示灰度圖像cv2.imshow("MEAN_C",athdMEAM)

#顯示自適應(yīng)閾值處理后的圖像cv2.imshow("GAUSSIAN_C",athdGAUS)cv2.waitKey()

#窗口等待,按任意鍵繼續(xù)cv2.destroyAllWindows()

#釋放所有窗口閾值處理>3.自適應(yīng)閾值處理【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如下圖所示。閾值處理>3.自適應(yīng)閾值處理(a)原圖像

(b)二值化閾值處理后的圖像

(c)自適應(yīng)閾值處理后的圖像(均值)

(d)自適應(yīng)閾值處理后的圖像(高斯加權(quán)均值)02形態(tài)學(xué)變換形態(tài)學(xué)變換>形態(tài)學(xué)變換基礎(chǔ)>1.集合運(yùn)算形態(tài)學(xué)變換的基礎(chǔ)是集合運(yùn)算。集合的基本運(yùn)算包括交集、并集、補(bǔ)集、差集等,如下圖:名稱

定義 描述法表示交集對于兩個(gè)給定的集合、,由既屬于集合又屬于集合的所有元素組成的集合并集對于兩個(gè)給定的集合、,由集合、的所有元素所組成的集合補(bǔ)集由不屬于集合的所有元素組成的集合差集由屬于集合且不屬于集合的所有元素組成的集合除了以上集合的基本運(yùn)算之外,形態(tài)學(xué)又引入了兩個(gè)新的集合運(yùn)算方法:集合的反射與平移。(1)集合B的反射表示為

,公式如下。假設(shè)集合B描述的是一個(gè)區(qū)域,其任一像素b的坐標(biāo)為(x,y),則集合B是由坐標(biāo)為(-x,-y)的像素構(gòu)成的一個(gè)區(qū)域。(2)集合B平移了

,表示為

,定義為假設(shè)集合B描述的是一個(gè)區(qū)域,其任一像素b的坐標(biāo)為(x,y),則集合

是由坐標(biāo)為

的像素構(gòu)成的一個(gè)區(qū)域。形態(tài)學(xué)變換>形態(tài)學(xué)變換基礎(chǔ)>1.集合運(yùn)算結(jié)構(gòu)元素是一個(gè)形狀和大小已知的像素集合,是用于度量和處理圖像的基本單位,通常是比較小的圖像。在腐蝕、膨脹等形態(tài)學(xué)運(yùn)算過程中,需要使用它來逐像素掃描原圖像,并根據(jù)結(jié)構(gòu)元素和原圖像的關(guān)系來確定腐蝕或膨脹等運(yùn)算的結(jié)果??梢园呀Y(jié)構(gòu)元素看作是一種特殊的“卷積核”。形態(tài)學(xué)變換>形態(tài)學(xué)變換基礎(chǔ)>2.結(jié)構(gòu)元素格式:kernel=cv2.getStructuringElement(shape,ksize[,anchor=(-1,-1)])cv2.adaptiveThreshold()函數(shù)

形態(tài)學(xué)變換>形態(tài)學(xué)變換基礎(chǔ)>2.結(jié)構(gòu)元素kernel表示結(jié)構(gòu)元素,數(shù)據(jù)類型為二維數(shù)組;shape表示結(jié)構(gòu)元素的形狀,其值可以為cv2.MORPH_RECT(矩形)、cv2.MORPH_ELLIPSE(橢圓形)或cv2.MORPH_CROSS(十字形);ksize表示結(jié)構(gòu)元素的大小,須為包含兩個(gè)整數(shù)的元組(寬度,高度);anchor表示結(jié)構(gòu)元素的錨點(diǎn)位置,為可選參數(shù),默認(rèn)為(?1,?1),即錨點(diǎn)位于結(jié)構(gòu)元素的中心。OpenCV可以使用自定義矩陣(NumPy數(shù)組)來定義結(jié)構(gòu)元素,也可以使用cv2.getStrutcuringElement()函數(shù)來創(chuàng)建結(jié)構(gòu)元素。形態(tài)學(xué)變換>腐蝕與膨脹>1.腐蝕腐蝕運(yùn)算能夠消除圖像前景形狀的邊界,使前景形狀沿著邊界向內(nèi)收縮。在腐蝕的過程中,通常會(huì)使用結(jié)構(gòu)元素逐個(gè)像素地掃描被腐蝕的圖像,并根據(jù)結(jié)構(gòu)元素與圖像前景形狀之間的交集關(guān)系確定運(yùn)算結(jié)果。設(shè)

A

為二值圖像,S

為結(jié)構(gòu)元素。使用

S

A

進(jìn)行腐蝕,或A被S腐蝕,記作

,公式如下。000000000011000000111110011111100111111000000000錨點(diǎn)位于中心的3×3結(jié)構(gòu)元素S腐蝕二值圖像A的示例。000000000000000000000000000111000000000000000000

(a)原圖像A

(b)結(jié)構(gòu)元素S

(c)

A!S形態(tài)學(xué)變換>腐蝕與膨脹>1.腐蝕腐蝕結(jié)果跟哪些因素有關(guān)系呢?腐蝕能夠消融圖像中物體的邊界,具體的腐蝕結(jié)果與圖像本身、結(jié)構(gòu)元素的大小和形狀有關(guān)。如果圖像中物體整體上大于結(jié)構(gòu)元素,那么腐蝕的結(jié)果會(huì)使物體“變瘦”一圈。這一圈的大小是由結(jié)構(gòu)元素決定的。如果圖像中物體本身小于結(jié)構(gòu)元素,則圖像中的物體會(huì)在腐蝕后完全消失。如果圖像中物體僅有部分區(qū)域小于結(jié)構(gòu)元素(如細(xì)小的連通),則腐蝕后會(huì)在細(xì)小的連通處斷裂,分離為兩部分。格式:dst=cv2.erode(src,kernel[,anchor[,iterations[,borderType]]])cv2.erode()函數(shù)

形態(tài)學(xué)變換>腐蝕與膨脹>1.腐蝕dst表示輸出圖像,即腐蝕運(yùn)算的結(jié)果圖像;src表示輸入圖像,須為一幅二值圖像(單通道)或灰度圖像(多通道);kernel表示結(jié)構(gòu)元素;anchor表示錨點(diǎn),為可選參數(shù),默認(rèn)為(?1,?1),表示錨點(diǎn)為結(jié)構(gòu)元素中心;iterations表示迭代次數(shù),即進(jìn)行幾次腐蝕運(yùn)算,為可選參數(shù),默認(rèn)為1;borderType表示邊界樣式,即在進(jìn)行腐蝕運(yùn)算時(shí)如何處理圖像邊緣的像素,為可選參數(shù),默認(rèn)為cv2.BORDER_CONSTANT,此時(shí)使用固定值填充邊界。OpenCV提供的cv2.erode()函數(shù)用于實(shí)現(xiàn)腐蝕運(yùn)算?!纠?/p>

6-4】編寫程序,使用

OpenCV

cv2.erode()函數(shù)對圖像“grad.png”(見本書配套素材“例題圖像/grad.png”)進(jìn)行腐蝕運(yùn)算,并顯示原圖像和腐蝕運(yùn)算后的圖像。【參考代碼】importcv2 #導(dǎo)入OpenCV庫image=cv2.imread('grad.png',cv2.IMREAD_GRAYSCALE) #讀取圖像cv2.imshow("Input",image) #顯示原圖像#定義3×3的結(jié)構(gòu)元素kernel1=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))#使用3×3的結(jié)構(gòu)元素進(jìn)行腐蝕運(yùn)算eroded_img1=cv2.erode(image,kernel1)cv2.imshow("Eroded(3*3)",eroded_img1)

#顯示腐蝕后的圖像#定義5×5的結(jié)構(gòu)元素kernel2=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))#使用5×5的結(jié)構(gòu)元素進(jìn)行腐蝕運(yùn)算eroded_img2=cv2.erode(image,kernel2)cv2.imshow("Eroded(5*5)",eroded_img2)

#顯示腐蝕后的圖像cv2.waitKey()

#窗口等待,按任意鍵繼續(xù)cv2.destroyAllWindows()

#釋放所有窗口形態(tài)學(xué)變換>腐蝕與膨脹>1.腐蝕【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如下圖所示。形態(tài)學(xué)變換>腐蝕與膨脹>1.腐蝕

(a)原圖像

(b)使用3×3的結(jié)構(gòu)元素腐蝕后的圖像

(c)使用5×5的結(jié)構(gòu)元素腐蝕后的圖像形態(tài)學(xué)變換>腐蝕與膨脹>2.膨脹膨脹的作用,與腐蝕的作用相反,它能夠擴(kuò)充圖像前景形狀的邊界,使前景形狀沿著邊界向外擴(kuò)張。設(shè)

A

為二值圖像,S

為結(jié)構(gòu)元素。使用

S

A

進(jìn)行腐蝕,或A被S腐蝕,記作

,公式如下。A被S膨脹的結(jié)果,是先對結(jié)構(gòu)元素S做反射運(yùn)算,然后平移到像素z后,與A至少有一個(gè)像素重疊的所有像素z構(gòu)成的集合。000000000011000000111110011111100111111000000000錨點(diǎn)位于中心的3×3結(jié)構(gòu)元素S膨脹二值圖像A的示例。

(a)原圖像A

(b)結(jié)構(gòu)元素S

(c)

011110000111111111111111111111111111111111111111格式:dst=cv2.dilate(src,kernel[,anchor[,iterations[,borderType]]])cv2.dilate()函數(shù)

形態(tài)學(xué)變換>腐蝕與膨脹>2.膨脹dst表示輸出圖像,即腐蝕運(yùn)算的結(jié)果圖像;src表示輸入圖像,須為一幅二值圖像(單通道)或灰度圖像(多通道);kernel表示結(jié)構(gòu)元素;anchor表示錨點(diǎn),為可選參數(shù),默認(rèn)為(?1,?1),表示錨點(diǎn)為結(jié)構(gòu)元素中心;iterations表示迭代次數(shù),即進(jìn)行幾次腐蝕運(yùn)算,為可選參數(shù),默認(rèn)為1;borderType表示邊界樣式,即在進(jìn)行腐蝕運(yùn)算時(shí)如何處理圖像邊緣的像素,為可選參數(shù),默認(rèn)為cv2.BORDER_CONSTANT,此時(shí)使用固定值填充邊界。OpenCV提供的cv2.dilate()函數(shù)用于實(shí)現(xiàn)膨脹運(yùn)算?!纠?/p>

6-5】編寫程序,使用

OpenCV

cv2.dilate()函數(shù)對圖像“grad.png”(見本書配套素材“例題圖像/grad.png”)進(jìn)行腐蝕運(yùn)算,并顯示原圖像和腐蝕運(yùn)算后的圖像?!緟⒖即a】importcv2 #導(dǎo)入OpenCV庫image=cv2.imread('grad.png',cv2.IMREAD_GRAYSCALE)

#讀取圖像cv2.imshow("Input",image)

#顯示原圖像#定義3×3的結(jié)構(gòu)元素kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))#使用3×3的結(jié)構(gòu)元素進(jìn)行一次膨脹運(yùn)算dilated_img1=cv2.dilate(image,kernel,iterations=1)cv2.imshow("1-dilate(3*3)",dilated_img1)#顯示膨脹后的圖像#使用3×3的結(jié)構(gòu)元素進(jìn)行兩次膨脹運(yùn)算dilated_img2=cv2.dilate(image,kernel,iterations=2)cv2.imshow("2-dilate(3*3)",dilated_img2)#顯示膨脹后的圖像cv2.waitKey() #窗口等待,按任意鍵繼續(xù)cv2.destroyAllWindows()

#釋放所有窗口形態(tài)學(xué)變換>腐蝕與膨脹>2.膨脹【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如下圖所示。形態(tài)學(xué)變換>腐蝕與膨脹>2.膨脹

(a)原圖像

(b)膨脹一次后的圖像

(c)膨脹兩次后的圖像形態(tài)學(xué)變換>開運(yùn)算與閉運(yùn)算>1.開運(yùn)算開運(yùn)算可用于平滑形狀輪廓,消除形狀外的噪聲。當(dāng)用于去噪時(shí),開運(yùn)算首先對形狀進(jìn)行腐蝕運(yùn)算,消除邊界和邊界以外的細(xì)小區(qū)域,再進(jìn)行膨脹運(yùn)算,恢復(fù)形狀的原始大小,達(dá)到背景區(qū)域去噪的效果。設(shè)A為二值圖像,S為結(jié)構(gòu)元素。使用S對A進(jìn)行開運(yùn)算,記作

,公式如下:即使用同一結(jié)構(gòu)元素S先對A進(jìn)行腐蝕運(yùn)算,再對結(jié)果圖像進(jìn)行膨脹運(yùn)算。【例

6-6】編寫程序,使用OpenCV的cv2.erode()函數(shù)和cv2.dilate()函數(shù)對圖像“hat.png”(見本書配套素材“例題圖像/hat.png”)進(jìn)行開運(yùn)算,并顯示原圖像和開運(yùn)算后的圖像?!緟⒖即a】importcv2 #導(dǎo)入OpenCV庫image=cv2.imread('hat.png',cv2.IMREAD_GRAYSCALE) #讀取圖像cv2.imshow("Input",image) #顯示原圖像#定義5×5的結(jié)構(gòu)元素kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))image1=cv2.erode(image,kernel)

#先進(jìn)行腐蝕運(yùn)算image2=cv2.dilate(image1,kernel)

#再進(jìn)行膨脹運(yùn)算cv2.imshow("Output",image2) #顯示開運(yùn)算后的圖像cv2.waitKey() #窗口等待,按任意鍵繼續(xù)cv2.destroyAllWindows() #釋放所有窗口形態(tài)學(xué)變換>開運(yùn)算與閉運(yùn)算>1.開運(yùn)算【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如下圖所示。形態(tài)學(xué)變換>開運(yùn)算與閉運(yùn)算>1.開運(yùn)算

(a)原圖像

(b)開運(yùn)算后的圖像形態(tài)學(xué)變換>開運(yùn)算與閉運(yùn)算>2.閉運(yùn)算閉運(yùn)算同樣可以使輪廓變得平滑,但是與開運(yùn)算相反,它可以填充前景區(qū)域中小于結(jié)構(gòu)元素的孔洞或縫隙,或令前景區(qū)域中的孔洞或縫隙變小。閉運(yùn)算首先對形狀進(jìn)行膨脹運(yùn)算,擴(kuò)大形狀的邊界范圍,同時(shí)填補(bǔ)形狀內(nèi)部的噪聲,之后再進(jìn)行腐蝕運(yùn)算,恢復(fù)形狀的原始大小,達(dá)到前景區(qū)域去噪的效果。設(shè)A為二值圖像,S為結(jié)構(gòu)元素。使用S對A進(jìn)行閉運(yùn)算,記作

,公式如下:即使用同一結(jié)構(gòu)元素S先對A進(jìn)行膨脹運(yùn)算,再對結(jié)果圖像進(jìn)行腐蝕運(yùn)算?!纠?/p>

6-7】

編寫程序,使用OpenCV的cv2.erode()函數(shù)和cv2.dilate()函數(shù)對圖像“hat.png”(見本書配套素材“例題圖像/hat.png”)進(jìn)行閉運(yùn)算,并顯示原圖像和閉運(yùn)算后的圖像?!緟⒖即a】importcv2 #導(dǎo)入OpenCV庫image=cv2.imread('hat.png',cv2.IMREAD_GRAYSCALE) #讀取圖像cv2.imshow("Input",image) #顯示原圖像#定義5×5的結(jié)構(gòu)元素kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))image1=cv2.dilate(image,kernel)

#先進(jìn)行膨脹運(yùn)算image2=cv2.erode(image1,kernel)

#再進(jìn)行腐蝕運(yùn)算cv2.imshow("Output",image2)

#顯示閉運(yùn)算后的圖像cv2.waitKey()

#窗口等待,按任意鍵繼續(xù)cv2.destroyAllWindows()

#釋放所有窗口形態(tài)學(xué)變換>開運(yùn)算與閉運(yùn)算>2.閉運(yùn)算【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如下圖所示。形態(tài)學(xué)變換>開運(yùn)算與閉運(yùn)算>2.閉運(yùn)算

(a)原圖像

(b)閉運(yùn)算后的圖像格式:dst=cv2.morphologyEx(src,op,kernel[,anchor=(?1,?1)[,iterations=1[,borderType]]])cv2.morphologyEx()函數(shù)

形態(tài)學(xué)變換>形態(tài)學(xué)其他運(yùn)算dst表示輸出圖像,即形態(tài)學(xué)運(yùn)算的結(jié)果圖像;src表示輸入圖像,須為一幅二值圖像(單通道)或灰度圖像(多通道);op

表示運(yùn)算類型;kernel表示結(jié)構(gòu)元素;anchor表示錨點(diǎn),為可選參數(shù),默認(rèn)為(?1,?1),即錨點(diǎn)為結(jié)構(gòu)元素中心;iterations表示迭代次數(shù),即進(jìn)行幾次形態(tài)學(xué)運(yùn)算,為可選參數(shù),默認(rèn)為

1;borderType表示邊界樣式,為可選參數(shù)。OpenCV提供的cv2.morphologyEx()函數(shù)(該函數(shù)可實(shí)現(xiàn)所有常用的形態(tài)學(xué)運(yùn)算)。形態(tài)學(xué)變換>形態(tài)學(xué)其他運(yùn)算op

表示運(yùn)算類型,其取值和含義如下表所示:

取值 名稱 含義cv2.MORPH_ERODE腐蝕腐蝕cv2.MORPH_DILATE膨脹膨脹cv2.MORPH_OPEN開運(yùn)算先腐蝕再膨脹cv2.MORPH_CLOSE閉運(yùn)算先膨脹再腐蝕cv2.MORPH_GRADIENT形態(tài)學(xué)梯度運(yùn)算膨脹圖像減去腐蝕圖像cv2.MORPH_TOPHAT頂帽運(yùn)算原圖像減去開運(yùn)算圖像cv2.MORPH_BLACKHAT黑帽運(yùn)算閉運(yùn)算圖像減去原圖像形態(tài)學(xué)梯度運(yùn)算是指在原圖像上應(yīng)用膨脹運(yùn)算和腐蝕運(yùn)算,然后將兩個(gè)結(jié)果圖像相減。這個(gè)過程可以得到圖像中物體的邊緣。形態(tài)學(xué)變換>形態(tài)學(xué)其他運(yùn)算>1.形態(tài)學(xué)梯度運(yùn)算【例

6-8】編寫程序,使用OpenCV的

cv2.morphologyEx()函數(shù)對圖像“grad.png”(見本書配套素材“例題圖像/grad.png”)進(jìn)行形態(tài)學(xué)梯度運(yùn)算,并顯示原圖像和形態(tài)學(xué)梯度運(yùn)算后的圖像?!緟⒖即a】importcv2 #導(dǎo)入OpenCV庫image=cv2.imread('grad.png',cv2.IMREAD_GRAYSCALE) #讀取圖像#定義3×3的結(jié)構(gòu)元素kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))#進(jìn)行梯度運(yùn)算gradient=cv2.morphologyEx(image,cv2.MORPH_GRADIENT,kernel)cv2.imshow("Input",image) #顯示原圖像cv2.imshow("Gradient",gradient)

#顯示形態(tài)學(xué)梯度運(yùn)算后的圖像cv2.waitKey() #窗口等待,按任意鍵繼續(xù)cv2.destroyAllWindows()

#釋放所有窗口形態(tài)學(xué)變換>形態(tài)學(xué)其他運(yùn)算>1.形態(tài)學(xué)梯度運(yùn)算【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如下圖所示。邊緣檢測>圖像梯度>3.使用Laplacian算子進(jìn)行邊緣檢測

(a)原圖像

(b)形態(tài)學(xué)梯度運(yùn)算后的圖像頂帽運(yùn)算又稱禮帽運(yùn)算,是原圖像減去圖像開運(yùn)算的結(jié)果圖像,經(jīng)過這個(gè)運(yùn)算后可以得到原圖像的噪聲信息,或者得到比原圖像的邊緣更亮的圖像信息。黑帽運(yùn)算又稱底帽運(yùn)算,是圖像閉運(yùn)算的結(jié)果圖像減去原圖像,經(jīng)過這個(gè)運(yùn)算后可以得到原圖像內(nèi)部的細(xì)節(jié),或者得到比原圖像的邊緣更暗的圖像信息。形態(tài)學(xué)變換>形態(tài)學(xué)其他運(yùn)算>2.頂帽運(yùn)算和黑帽運(yùn)算【例

6-9】編寫程序,使用

OpenCV

cv2.morphologyEx()函數(shù)對圖像“hat.png”(見本書配套素材“例題圖像/hat.png”)進(jìn)行頂帽運(yùn)算和黑帽運(yùn)算,并顯示原圖像、頂帽運(yùn)算后的圖像和黑帽運(yùn)算后的圖像?!緟⒖即a】importcv2 #導(dǎo)入OpenCV庫image=cv2.imread('hat.png',cv2.IMREAD_GRAYSCALE)

#讀取圖像#定義3×3的結(jié)構(gòu)元素kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))#進(jìn)行頂帽運(yùn)算tophat=cv2.morphologyEx(image,cv2.MORPH_TOPHAT,kernel)#進(jìn)行黑帽運(yùn)算blackhat=cv2.morphologyEx(image,cv2.MORPH_BLACKHAT,kernel)cv2.imshow("Input",image) #顯示原圖像cv2.imshow("TopHat",tophat) #顯示頂帽運(yùn)算后的圖像cv2.imshow("BlackHat",blackhat)

#顯示黑帽運(yùn)算后的圖像cv2.waitKey()

#窗口等待,按任意鍵繼續(xù)cv2.destroyAllWindows()

#釋放所有窗口形態(tài)學(xué)變換>形態(tài)學(xué)其他運(yùn)算>2.頂帽運(yùn)算和黑帽運(yùn)算【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如下圖所示。形態(tài)學(xué)變換>形態(tài)學(xué)其他運(yùn)算>2.頂帽運(yùn)算和黑帽運(yùn)算(a)原圖像

(b)頂帽運(yùn)算后的圖像(c)黑帽運(yùn)算后的圖像形態(tài)學(xué)變換>形態(tài)學(xué)其他運(yùn)算>2.頂帽運(yùn)算和黑帽運(yùn)算清華大學(xué)精密儀器系類腦計(jì)算研究中心提出了一種基于視覺原語的互補(bǔ)雙通路類腦視覺感知新范式。該范式借鑒人類視覺系統(tǒng)的基本原理,將開放世界的視覺信息拆解為基于視覺原語的信息表示,并通過有機(jī)組合這些原語,模仿人類視覺系統(tǒng)的特征,形成兩條優(yōu)勢互補(bǔ)、信息完備的視覺感知通路?;谶@一新范式,團(tuán)隊(duì)研制出了世界首款類腦互補(bǔ)視覺芯片“天眸芯”,它可以在極低的帶寬和功耗條件下,實(shí)現(xiàn)每秒

10

000

幀的高速、10

bit

的高精度、130

dB的高動(dòng)態(tài)范圍視覺信息采集。它不僅突破了傳統(tǒng)視覺感知范式的性能瓶頸,還能夠高效應(yīng)對各種極端場景,確保系統(tǒng)的穩(wěn)定性和安全性。該項(xiàng)研究的論文《面向開放世界感知、具有互補(bǔ)通路的視覺芯片》登上《自然》雜志封面,標(biāo)志著中國芯片領(lǐng)域在類腦計(jì)算和類腦感知兩個(gè)重要方向上均已取得基礎(chǔ)性突破。素養(yǎng)之窗03項(xiàng)目實(shí)施項(xiàng)目實(shí)施——紐扣檢測與計(jì)數(shù)>項(xiàng)目分析>第1步第2步第3步圖像預(yù)處理形態(tài)學(xué)變換輪廓查找與計(jì)數(shù)紐扣檢測與計(jì)數(shù)項(xiàng)目實(shí)施——紐扣檢測與計(jì)數(shù)>1.圖像預(yù)處理步驟1導(dǎo)入本項(xiàng)目所需的OpenCV庫。步驟2定義原圖像文件存放位置變量

img_path,然后讀取原圖像文件,并顯示原圖像。步驟3對原圖像進(jìn)行高斯濾波,濾波模板大小為

5×5,濾波模板在水平方向的標(biāo)準(zhǔn)差為0。步驟4調(diào)用cv2.cvtColor()函數(shù)將圖像的色彩空間從BGR轉(zhuǎn)換為GRAY。步驟5對圖像進(jìn)行二值化閾值處理,閾值為

250,最大值為

255,并顯示二值化閾值處理后的圖像。項(xiàng)目實(shí)施——紐扣檢測與計(jì)數(shù)>2.形態(tài)學(xué)變換步驟1調(diào)用

cv2.getStructuringElement()函數(shù)創(chuàng)建結(jié)構(gòu)元素kernel,其形狀為矩形,大小為3×3。使用結(jié)構(gòu)元素

kernel

對預(yù)處理后的圖像先進(jìn)行膨脹運(yùn)算,再進(jìn)行腐蝕運(yùn)算,去除可能影響結(jié)果的噪聲,并顯示膨脹和腐蝕運(yùn)算后的圖像。對膨脹和腐蝕運(yùn)算后的圖像進(jìn)行形態(tài)學(xué)梯度運(yùn)算,以便獲得圖像的邊緣,并顯示形態(tài)學(xué)梯度運(yùn)算后的圖像。步驟2步驟3步驟一步驟二步驟三步驟

溫馨提示

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

評論

0/150

提交評論