




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第八章圖像數(shù)學形態(tài)學數(shù)學形態(tài)學(mathematicalmorphology)誕生于1964年,基本思想是用具有一定形態(tài)的結(jié)構(gòu)元素(SE,structuralelement)或內(nèi)核去量度和提取數(shù)字圖像中的對應形狀,以實現(xiàn)對圖像進行分析和識別的目的。形態(tài)學分析是一門建立在集合論基礎上的學科,它是幾何形態(tài)分析和描述的有力工具,是一種新的圖像處理與分析方法。數(shù)學形態(tài)學的基本思想也適應于圖像處理的很多方面,包括圖像增強、邊緣檢測、圖像分割、特征提取、圖像復原、文字識別、醫(yī)學圖像處理、圖像壓縮,以及機器視覺等眾多領(lǐng)域。在工農(nóng)業(yè)生產(chǎn)中,視覺零部件檢測、產(chǎn)品質(zhì)量檢測、食品安全檢測、生物醫(yī)學圖像分析和紋理分析等方面,數(shù)學形態(tài)學取得了非常成功的應用,創(chuàng)造了較好的經(jīng)濟效益和社會效益。數(shù)學形態(tài)學是基于圖像形狀的操作,主要針對的是二值圖像,最基本的操作是腐蝕和膨脹,其他如開運算、閉運算、高帽運算、黑帽運算等都是在腐蝕和膨脹操作的基礎上進行的。膨脹是對圖像中的高亮部分進行膨脹,類似于領(lǐng)域擴張,結(jié)果擁有比原圖更大的高亮區(qū)域;腐蝕是對原圖的高亮部分腐蝕,類似于領(lǐng)域被蠶食,結(jié)果擁有比原圖更小的高亮區(qū)域。從數(shù)學的角度來說,膨脹和腐蝕操作就是將圖像與核進行卷積,核可以是任意形狀和大小的。核大則周圍對其影響大,變化大;核小則周圍對其影響小,變化小。8.1結(jié)構(gòu)元素(卷積核)數(shù)學形態(tài)學處理的核心就是定義結(jié)構(gòu)元素,在OpenCV中,可以使用其自帶的函數(shù)getStructuringElement()創(chuàng)建結(jié)構(gòu)元素,也可以直接使用Numpy庫的ndarray來定義一個結(jié)構(gòu)元素。在Numpy的幫助下,我們可以手動創(chuàng)建了一個矩形、橢圓形、圓形等形狀的結(jié)構(gòu)元素。8.1.1OpenCV生成結(jié)構(gòu)元素OpenCV提供了cv2.getStructuringElement()函數(shù),通過這個函數(shù)可以獲得結(jié)構(gòu)元素內(nèi)核的形狀和大小。函數(shù)語法格式是:kernel=cv2.getStructuringElement(shape,ksize[,anchor])其中輸入?yún)?shù)如下:shape:內(nèi)核的形狀,有三種形狀可以選擇:MORPH_RECT:產(chǎn)生矩形的結(jié)構(gòu)元素;MORPH_ELLIPSEM:產(chǎn)生橢圓形的結(jié)構(gòu)元素;MORPH_CROSS:產(chǎn)生十字交叉形的結(jié)構(gòu)元素。ksize:內(nèi)核的尺寸;anchor:分別是內(nèi)核錨點的位置。對于錨點的位置,有默認值Point(-1,-1),表示錨點位于中心點。在調(diào)用腐蝕(erode)以及膨脹(dilate)函數(shù)之前,需要先定義一個結(jié)構(gòu)元素(卷積核)?!纠?.1】使用cv2.getStructuringElement()函數(shù)生成結(jié)構(gòu)元素,程序代碼如下:
importcv2#矩形內(nèi)核kernel1=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))print(kernel1)
#橢圓內(nèi)核kernel2=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))print(kernel2)#十字內(nèi)核kernel3=cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))print(kernel3)
運行結(jié)果顯示如下:[[11111][11111][11111][11111][11111]][[00100][11111][11111][11111][00100]][[00100][00100][11111][00100][00100]]8.1.2Numpy生成結(jié)構(gòu)元素通過Numpy庫中的數(shù)組創(chuàng)建或矩陣創(chuàng)建來生成結(jié)構(gòu)元素,結(jié)構(gòu)元素要求的數(shù)據(jù)類型是無符號8位整數(shù)?!纠?.2】使用Numpy庫中的函數(shù)生成5×5的正方形和菱形結(jié)構(gòu)元素,程序代碼如下:importnumpyasnp#創(chuàng)建一個5*5的正方形矩陣kernel1=np.ones((5,5),np.uint8)#創(chuàng)建一個5*5的菱形矩陣kernel2=np.array([[0,0,1,0,0],[0,1,1,1,0],[1,1,1,1,1],[0,1,1,1,0],[0,0,1,0,0]],dtype=np.uint8)
print(kernel1)print(kernel2)
程序運行結(jié)果如下所示,第一個矩陣是5ⅹ5的正方形矩陣,第二個矩陣是5ⅹ5的菱形矩陣。[[11111][11111][11111][11111][11111]]
[[00100][01110][11111][01110][00100]]要想得到其它形狀的結(jié)構(gòu)元素,可以通過將上述矩陣中的對應元素設為0或1來實現(xiàn)。8.2腐蝕腐蝕是卷積核沿著圖像滑動,把物體的邊界腐蝕掉。如果卷積核對應的原圖所有像素值為1,那么中心元素就保持原來的值,否則變?yōu)榱?。對于消除小的白噪聲、分離兩個連接的對象等非常有用。腐蝕是和膨脹相反的操作,它將0值擴充到鄰近像素,擴大黑色部分,減小白色部分??捎脕硖崛」歉尚畔ⅲサ裘?,去掉孤立的像素。
8.2.1OpenCV中的腐蝕操作OpenCV中腐蝕函數(shù)cv2.erode()語法格式如下:dst=cv2.erode(src,element[,anchor[,iterations[,borderType[,borderValue]]]])其中輸入?yún)?shù)如表8-1所示:與卷積操作類似,對于邊界處像素的領(lǐng)域有可能會超出圖像邊界,所以需要擴充圖像邊界,邊界擴充類型中鏡像擴充操作效果最好。
【例8.3】使用cv2.erode()函數(shù)實現(xiàn)二值圖像的腐蝕運算。程序代碼如下:
importcv2importnumpyasnpfrommatplotlibimportpyplotaspltimg=cv2.imread('d:/pics/j.png',0)kernel=np.ones((5,5),np.uint8)erosion=cv2.erode(img,kernel,iterations=1)plt.figure('erode',figsize=(8,8))plt.subplot(121)plt.title('originimage')plt.imshow(img,plt.cm.gray)plt.axis('off')plt.subplot(122)plt.title('erodeimage')plt.imshow(erosion,plt.cm.gray)plt.axis('off')程序運行結(jié)果如圖8-1所示,左邊為原圖像,右邊為腐蝕后的圖像,可以看出字體變瘦了。8.2.2skimage中的腐蝕函數(shù)在skimage庫中腐蝕運算函數(shù)語法格式為: dst=skimage.morphology.erosion(image,selem=None)其中selem表示結(jié)構(gòu)元素,用于設定局部區(qū)域的形狀和大小。如果處理圖像為二值圖像(只有0和1兩個值),則函數(shù)調(diào)用格式如下: dst=skimage.morphology.binary_erosion(image,selem=None)用此函數(shù)處理灰度圖像更快?!纠?.4】使用skimage庫函數(shù)實現(xiàn)圖像的腐蝕運算,程序代碼如下:fromskimageimportdataimportskimage.morphologyassmimportmatplotlib.pyplotaspltimg=data.checkerboard()#調(diào)用棋格板#用邊長為5的正方形濾波器進行腐蝕濾波dst1=sm.erosion(img,sm.square(5))#用邊長為15的正方形濾波器進行腐蝕濾波dst2=sm.erosion(img,sm.square(15))plt.figure('morphology',figsize=(8,8))plt.subplot(131)plt.title('originimage')plt.imshow(img,plt.cm.gray)plt.subplot(132)plt.title('5*5erodedimage')plt.imshow(dst1,plt.cm.gray)plt.subplot(133)plt.title('15*15erodedimage')plt.imshow(dst2,plt.cm.gray)程序運行結(jié)果如圖8-2所示。8.3膨脹膨脹的原理是卷積核所對應的原圖像像素值只要有一個是1,中心像素值就是1,即用結(jié)構(gòu)元素的原點遍歷所有原圖像中的背景點,看結(jié)構(gòu)元素與原圖像中的前景點有沒有重疊的部分,若有重疊的部分,則標記原圖像中的該背景點,使之成為新的前景點,它與腐蝕正好相反。一般對二值圖像進行操作,找到像素值為1的點,將它的鄰近像素點都設置成1值(1值表示白,0值表示黑),因此膨脹操作可以擴大白色值范圍,壓縮黑色值范圍,因此它會增加圖像中的白色區(qū)域或增加前景對象的大小。通常,膨脹一般用來擴充邊緣或填充小的孔洞。8.3.1OpenCV中的膨脹函數(shù)OpenCV中膨脹函數(shù)cv2.dilate()語法格式如下:dst=cv2.dilate(src,element[,anchor[,iterations[,borderType[,borderValue]]]])其中函數(shù)的輸入?yún)?shù)如表8-2所示:【例8.5】使用cv2.dilate()函數(shù)實現(xiàn)圖像的膨脹運算,程序代碼如下:importcv2importnumpyasnpfrommatplotlibimportpyplotaspltimg=cv2.imread('d:/pics/j.png',0)kernel=np.ones((5,5),np.uint8)dilation=cv2.dilate(img,kernel,iterations=1)plt.figure('erode',figsize=(8,8))plt.subplot(121)plt.title('originimage')plt.imshow(img,plt.cm.gray)plt.axis('off')plt.subplot(122)plt.title('dilateimage')plt.imshow(dilation,plt.cm.gray)plt.axis('off')程序運行結(jié)果如圖8-3所示:8.3.2skimage中的膨脹函數(shù)在skimage庫中,膨脹運算的函數(shù)語法格式如下:dst=skimage.morphology.dilation(image,selem=None)其中,selem表示結(jié)構(gòu)元素,用于設定局部區(qū)域的形狀和大小。如果處理圖像為二值圖像(只有0和1兩個值),則可以調(diào)用:dst=skimage.morphology.binary_dilation(image,selem=None)用此函數(shù)處理灰度圖像更快?!纠?.6】使用skimage庫函數(shù)實現(xiàn)圖像的膨脹運算,程序代碼如下:fromskimageimportdataimportskimage.morphologyassmimportmatplotlib.pyplotaspltimg=data.checkerboard()#邊長為5的正方形卷積核dst1=sm.dilation(img,sm.square(5))#邊長為15的正方形卷積核dst2=sm.dilation(img,sm.square(15))plt.figure('morphology',figsize=(8,8))plt.subplot(131)plt.title('originimage')plt.imshow(img,plt.cm.gray)plt.subplot(132)plt.title('5*5dilationimage')plt.imshow(dst1,plt.cm.gray)plt.subplot(133)plt.title('15*15dilationimage')plt.imshow(dst2,plt.cm.gray)分別用邊長為5或15的正方形卷積核對棋盤圖片進行膨脹操作,結(jié)果如圖8-4所示,右邊的圖像明顯能看到白色部分膨脹了,黑色部分縮小了??梢娋矸e核的大小,對膨脹結(jié)果的影響非常大。一般設置為奇數(shù),除了正方形的卷積核外,卷積核的形狀還有其他矩形、球形等,如表8-3所示:8.3.3OpenCV形態(tài)學處理原型函數(shù)除了腐蝕和膨脹運算外,還有其他形態(tài)學處理。OpenCV形態(tài)學處理原型函數(shù)為: dst=cv2.morphologyEx(src,op,kernel[,anchor[,iterations[,borderType[,borderValue]]]])其中輸入輸出參數(shù)為:
dst:與原圖像大小和類型相同的輸出目標圖像;
src:原圖像。通道數(shù)可以是任意的;
op:形態(tài)學操作的類型,包括如表8-4所示模式:
kernel:結(jié)構(gòu)元素;
anchor:用kernel錨定位置。負值意味著anchor位于核心中心;
iterations:腐蝕和膨脹的次數(shù);
borderType:像素邊緣處理方法;
borderValue:邊界不變的邊界值。開運算和閉運算均是腐蝕和膨脹的組合,而高帽變換和黑底帽變換是分別以開運算和閉運算為基礎的。這四個操作都可直接使用OpenCV提供的上述函數(shù)來完成。8.4開運算開運算是先腐蝕然后再膨脹的運算,主要用于消除亮度較高的細小區(qū)域,在纖細點處分離物體,對于較大物體,可以在不明顯改變其面積的情況下平滑其邊界。開運算的典型應用是從目標中消除細小的尖刺,并斷開窄小的連接,保持面積大小不變等,它還能使目標輪廓的邊界平滑,對于消除噪音很有用。8.4.1OpenCV中的開運算函數(shù)OpenCV中開運算函數(shù)是利用的形態(tài)學處理原型函數(shù)cv2.morphologyEx()實現(xiàn)的,只是在第2個參數(shù)op設置為cv2.MORPH_OPEN即可。【例8.7】使用cv2.morphologyEx()函數(shù)實現(xiàn)開運算,程序代碼如下:importcv2importnumpyasnpfrommatplotlibimportpyplotaspltimg=cv2.imread('d:/pics/j_noise.png',0)kernel=np.ones((5,5),np.uint8)opening=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)plt.figure('MORPH_OPEN',figsize=(8,8))plt.subplot(121)plt.title('originimage')plt.imshow(img,plt.cm.gray)plt.axis('off')plt.subplot(122)plt.title('openingimage')plt.imshow(opening,plt.cm.gray)plt.axis('off')程序運行結(jié)果如圖8-5所示。8.4.2skimage中的開運算函數(shù)在skimage庫中的開運算函數(shù)語法格式為:dst=skimage.morphology.openning(image,selem=None)其中,selem表示結(jié)構(gòu)元素,用于設定局部區(qū)域的形狀和大小。如果處理圖像為二值圖像(只有0和1兩個值),函數(shù)調(diào)用格式如下:dst=skimage.morphology.binary_opening(image,selem=None)用此函數(shù)處理灰度圖像更快?!纠?.8】使用skimage.morphology.openning()函數(shù)進行開運算,程序代碼如下:fromskimageimportio,colorimportskimage.morphologyassmimportmatplotlib.pyplotaspltimg=color.rgb2gray(io.imread('d:/pics/mor.png’))#用直徑為4的圓形濾波器進行開運算dst=sm.opening(img,sm.disk(4))plt.figure('morphology',figsize=(8,8))plt.subplot(121)plt.title('originimage')plt.imshow(img,plt.cm.gray)plt.axis('off')plt.subplot(122)plt.title('openingimage')plt.imshow(dst,plt.cm.gray)plt.axis('off')程序運行結(jié)果如圖8-6所示。8.5閉運算(closing)閉運算與開運算正好相反,先膨脹然后再腐蝕。主要用于填充白色物體內(nèi)細小黑色空洞的區(qū)域,連接鄰近物體,同一個結(jié)構(gòu)元,多次迭代處理,可以在不明顯改變其面積的情況下平滑其邊界。閉運算的典型應用是填充小孔、連接狹窄的斷裂以及閉合圖像中目標間的間隙而不改變目標的尺寸。它也能平滑目標的輪廓,對消除目標對象內(nèi)部的小孔或消除目標對象上的小黑點很有用。8.5.1OpenCV中的閉運算閉運算函數(shù)cv2.morphologyEx()格式與開運算相同,只是在第2個參數(shù)設置為cv2.MORPH_CLOSE?!纠?.9】使用morphologyEx()函數(shù)實現(xiàn)閉運算,程序代碼如下:importcv2importnumpyasnpfrommatplotlibimportpyplotaspltimg=cv2.imread('d:/pics/j_noise.png',0)kernel=np.ones((5,5),np.uint8)closing=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)plt.figure('MORPH_CLOSE',figsize=(8,8))plt.subplot(121)plt.title('originimage')plt.imshow(img,plt.cm.gray)plt.axis('off')plt.subplot(122)plt.title('closingimage')plt.imshow(closing,plt.cm.gray)plt.axis('off')程序運行結(jié)果如圖8-7所示。8.5.2skimage中的閉運算在skimage庫中的閉運算函數(shù)語法格式為:dst=skimage.morphology.closing(image,selem=None)其中,selem表示結(jié)構(gòu)元素,用于設定局部區(qū)域的形狀和大小。如果處理圖像為二值圖像(只有0和1兩個值),函數(shù)調(diào)用格式如下:dst=skimage.morphology.binary_closing(image,selem=None)用此函數(shù)處理灰度圖像更快?!纠?.10】使用skimage.morphology.closing()函數(shù)進行閉運算,程序代碼如下:fromskimageimportio,colorimportskimage.morphologyassmimportmatplotlib.pyplotaspltimg=color.rgb2gray(io.imread('d:/pics/mor.png’))#用邊長為5的圓形濾波器進行膨脹濾波dst=sm.closing(img,sm.disk(5))plt.figure('morphology',figsize=(8,8))plt.subplot(121)plt.title('originimage')plt.imshow(img,plt.cm.gray)plt.axis('off')plt.subplot(122)plt.title('closingimage')plt.imshow(dst,plt.cm.gray)plt.axis('off')程序運行結(jié)果如圖8-8所示。8.6高帽(tophat)運算
高帽運算是將原圖像減去它的開運算值,開運算可以消除暗背景下的較亮區(qū)域,所以高帽運算可以得到原圖像中灰度較亮的區(qū)域。高帽運算的一個很重要的作用就是校正不均勻光照,返回比結(jié)構(gòu)元素小的白點。8.6.1Opencv中的高帽運算
在OpenCV的cv2.morphologyEx()函數(shù)中進行高帽運算,其op形態(tài)學操作的類型設置為cv2.MORPH_TOPHAT,即相當于dst=tophat(src,element)=src-open(src,element)?!纠?.11】使用cv2.morphologyEx()函數(shù)實現(xiàn)高帽運算,程序代碼如下:importcv2importnumpyasnpfrommatplotlibimportpyplotasplt
img=cv2.imread('d:pics/j.png',0)kernel=np.ones((9,9),np.uint8)tophat=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
plt.figure('MORPH_TOPHAT',figsize=(8,8))plt.subplot(121)plt.title('originimage')plt.imshow(img,plt.cm.gray)plt.axis('off')
plt.subplot(122)plt.title('tophatimage')plt.imshow(tophat,plt.cm.gray)plt.axis('off')程序運行結(jié)果如圖8-9所示。圖8-9OpenCV高帽運算8.6.2skimage中的高帽運算在skimage庫中的高帽運算函數(shù)格式:dst=skimage.morphology.white_tophat(image,selem=None)其中,selem表示結(jié)構(gòu)元素,用于設定局部區(qū)域的形狀和大小。fromskimageimportio,colorimportskimage.morphologyassmimportmatplotlib.pyplotasplt
img=color.rgb2gray(io.imread('d:/pics/mor.png'))dst=sm.white_tophat(img,sm.square(30))
plt.figure('morphology',figsize=(8,8))plt.subplot(121)plt.title('originimage')plt.imshow(img,plt.cm.gray)plt.axis('off')
plt.subplot(122)plt.title('tophatimage')plt.imshow(dst,plt.cm.gray)plt.axis('off')圖像高帽運算的結(jié)果如圖8-10所示。圖8-10skimage高帽運算【例8.12】使用skimage.morphology.white_tophat()函數(shù)實現(xiàn)高帽運算,程序代碼如下:8.7黑帽(blackhat)運算
黑帽就是將原圖像減去它的閉運算值,閉運算可以刪除亮度較高背景下的較暗區(qū)域,所以黑帽運算可以得到原圖片中灰度較暗的區(qū)域,故而又稱黑帽變換。返回比結(jié)構(gòu)元素小的黑點,且將這些黑點反色8.7.1OpenCV中的黑帽運算在OpenCV的cv2.morphologyEx()函數(shù)中進行黑帽運算,其op形態(tài)學操作的類型設置為cv2.MORPH_BLACKHAT,即相當于
dst=blackhat(src,element)=close(src,element)-src。importcv2importnumpyasnpfrommatplotlibimportpyplotasplt
img=cv2.imread('d:/pics/j.png',0)kernel=np.ones((11,11),np.uint8)blackhat=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
plt.figure('MORPH_BLACKHAT',figsize=(8,8))plt.subplot(121)plt.title('originimage')plt.imshow(img,plt.cm.gray)plt.axis('off')
plt.subplot(122)plt.title('blackhatimage')plt.imshow(blackhat,plt.cm.gray)plt.axis('off')圖像黑帽運算的結(jié)果如圖8-11所示?!纠?.13】使用cv2.morphologyEx()函數(shù)實現(xiàn)黑帽運算,核為11ⅹ11的,程序代碼如下:8.7.2skimage中的黑帽運算在skimage庫中的黑帽運算函數(shù)如下:skimage.morphology.black_tophat(image,selem=None)其中,selem表示結(jié)構(gòu)元素,用于設定局部區(qū)域的形狀和大小。fromskimageimportio,colorimportskimage.morphologyassmimportmatplotlib.pyplotasplt
img=io.imread('d:/pics/mor.png')img_gray=color.rgb2gray(img)dst=sm.black_tophat(img_gray,sm.square(30))
plt.figure('morphology',figsize=(8,8))plt.subplot(121)plt.title('originimage')plt.imshow(img,plt.cm.gray)plt.axis('off')plt.subplot(122)plt.title('blackhatimage')plt.imshow(dst,plt.cm.gray)plt.axis('off')圖像黑帽運算的結(jié)果如圖8-12所示。圖8-12skimage黑帽運算【例8.14】使用skimage.morphology.black_tophat函數(shù)進行黑帽運算,程序代碼如下:8.8形態(tài)學梯度形態(tài)學梯度(MorphologicalGradient)是形態(tài)學梯度實為膨脹圖與腐蝕圖之差,來實現(xiàn)增強結(jié)構(gòu)元素領(lǐng)域中像素的強度,突出高亮區(qū)域的外圍。所以形態(tài)學梯度的處理結(jié)果是圖像中物體的邊界,處理結(jié)果看起來像目標對象的輪廓。在OpenCV的cv2.morphologyEx()函數(shù)中進行梯度運算,其op形態(tài)學操作的類型設置為cv2.MORPH_GRADIENT,即相當于dst=morph_grad(src,element)=dilate(src,element)-erode(src,element)計算圖像的形態(tài)學梯度是形態(tài)學重要操作,常常將膨脹和腐蝕基礎操作組合起來一起使用實現(xiàn)一些復雜的圖像形態(tài)學梯度??梢杂嬎愕奶荻瘸R娙缦滤姆N:(1)基本梯度——基本梯度是用膨脹后的圖像減去腐蝕后的圖像得到差值圖像,稱為梯度圖像也是OpenCV中支持的計算形態(tài)學梯度的方法,而此方法得到的梯度稱為基本梯度。(2)內(nèi)部梯度——是用原圖像減去腐蝕之后的圖像得到差值圖像,稱為圖像的內(nèi)部梯度。(3)外部梯度——是用圖像膨脹之后再減去原來的圖像得到的差值圖像,稱為圖像的外部梯度。(4)方向梯度——方向梯度是使用X方向與Y方向的直線作為結(jié)構(gòu)元素之后得到圖像梯度,用X方向的直線做結(jié)構(gòu)元素,分別做膨脹與腐蝕操作之后得到的圖像,再與原圖像求差值得到X方向梯度;用Y方向的直線做結(jié)構(gòu)元素,分別做膨脹與腐蝕操作之后得到的圖像,再與原圖像求差值得到Y(jié)方向梯度。
【例8.15】使用cv2.morphologyEx()函數(shù)實現(xiàn)形態(tài)學基本梯度、內(nèi)部梯度、外部梯度、X方向與Y方向梯度運算,卷積核為3×3。程序代碼如下:importcv2importnumpyasnp
defgradient_basic(image):#基本梯度gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)ret,binary=cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))dst=cv2.morphologyEx(binary,cv2.MORPH_GRADIENT,kernel)cv2.imshow("gradient",dst)defgradient_in_out(image):kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))dm=cv2.dilate(image,kernel)em=cv2.erode(image,kernel)dst1=cv2.subtract(image,em)#內(nèi)部梯度dst2=cv2.subtract(dm,image)#外部梯度cv2.imshow("internal",dst1)cv2.imshow("external",dst2)
defgradient_X(image):kernel_x=np.array([[0,0,0],[1,1,1],[0,0,0]],dtype=np.uint8)dmx=cv2.dilate(image,kernel_x)emx=cv2.erode(image,kernel_x)dstx=cv2.subtract(dmx,emx)#X方向梯度cv2.imshow("X-direction",dstx)
defgradient_Y(image):kernel_y=np.array([[0,1,0],[0,1,0],[0,1,0]],dtype=np.uint8)dmy=cv2.dilate(image,kernel_y)emy=cv2.erode(image,kernel_y)dsty=cv2.subtract(dmy,emy)#Y方向梯度cv2.imshow("Y-direction",dsty)
src=cv2.imread("d:/pics/lena.jpg")dWindow("original",cv2.WINDOW_AUTOSIZE)cv2.imshow("original",src)gradient_basic(src)gradient_in_out(src)gradient_X(src)gradient_Y(src)cv2.waitKey(0)cv2.destroyAllWindows()圖像梯度運算的結(jié)果如圖8-13所示。(a)原圖像(b)基本梯度圖像(c)內(nèi)部梯度圖像
(d)外部梯度圖像(c)X方向梯度圖像(d)Y方向梯度圖像【例8.16】創(chuàng)建滑動條,調(diào)整r結(jié)構(gòu)元素(卷積核)大小和迭代次數(shù)i實現(xiàn)梯度運算,程序代碼如下:importcv2defnothing(*args):#設置回調(diào)函數(shù)pass#創(chuàng)建窗口dWindow('morphology',cv2.WINDOW_FREERATIO)r,MAX_R=0,20#結(jié)構(gòu)元素初始半徑,最大半徑i,MAX_I=0,20#初始迭代次數(shù),最大迭代次數(shù)#創(chuàng)建滑動條,分別為半徑和迭代次數(shù)cv2.createTrackbar('r','morphology',r,MAX_R,nothing)cv2.createTrackbar('i','morphology',i,MAX_I,nothing)
src=cv2.imread('d:/pics/mor.png',flags=0)whileTrue:r=cv2.getTrackbarPos('r','morphology')#獲得進度條上當前的r值i=cv2.getTrackbarPos('i','morphology')#獲得進度條上當前的i值#創(chuàng)建結(jié)構(gòu)元素kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(2*r+1,2*r+1))#形態(tài)學處理:形態(tài)梯度result=cv2.morphologyEx(src,cv2.MORPH_GRADIENT,kernel,iterations=i)#顯示效果cv2.imshow('morphology',result)ch=cv2.waitKey(1)ifch==27:#按Esc退出breakcv2.destroyAllWindows()結(jié)構(gòu)元素不同大?。╮值)和迭代次數(shù)(i值)變化的圖像梯度運算結(jié)果如圖8-14所示。圖8-14結(jié)構(gòu)元素不同大小和迭代次數(shù)變化的圖像梯度運算8.9灰度形態(tài)學形態(tài)學運算應用到灰度圖像中,用于提取描述和表示圖像的某些特征,如圖像邊緣提取、平滑處理等。與二值形態(tài)學不同的是灰度形態(tài)學運算中的操作對象不再是集合而是圖像函數(shù)。例如輸入圖像為f(x,y),結(jié)構(gòu)元素為se(x,y),且結(jié)構(gòu)元素可以為一個子圖像。8.9.1灰度圖像腐蝕運算腐蝕是取領(lǐng)域內(nèi)的最小值,從而減小高亮度區(qū)域的面積?!纠?.17】通過對灰度圖像進行腐蝕運算,提取出圖像的邊緣。程序代碼如下:importcv2
img=cv2.imread('d:/pics/lena.jpg',cv2.IMREAD_GRAYSCALE)#創(chuàng)建矩形結(jié)構(gòu)元se=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))#腐蝕圖像,迭代次數(shù)采用默認值1r=cv2.erode(img,se,iterations=1)e=img-r#邊界提取
#顯示原圖和腐蝕后的結(jié)果cv2.imshow('origin',img)cv2.imshow('erode_image',r)#顯示邊界提取的效果cv2.imshow('edge',e)cv2.waitKey(0)cv2.destroyAllWindows()輸出結(jié)果如圖12-15所示:(a)原始圖像(b)腐蝕后的圖像(c)提取的邊緣圖像8.9.2灰度圖像膨脹運算膨脹是取領(lǐng)域內(nèi)的最大值從而增大高亮度區(qū)域的面積?!纠?.18】應用橢圓結(jié)構(gòu)元素,對灰度圖像進行膨脹運算,程序代碼如下:importcv2
img=cv2.imread('d:/pics/lena.jpg',cv2.IMREAD_GRAYSCALE)cv2.imshow('origin',img)#顯示原圖
defnothing(*args):pass#顯示膨脹效果的窗口dWindow('dilate',6)r,MAX_R=1,20#結(jié)構(gòu)元半徑#調(diào)整結(jié)構(gòu)元半徑cv2.createTrackbar('r','dilate',r,MAX_R,nothing)
whileTrue:r=cv2.getTrackbarPos('r','dilate')#得到當前的r值s=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(2*r+1,2*r+1))#創(chuàng)建結(jié)構(gòu)元d=cv2.dilate(img,s)cv2.imshow('dilate',d)#顯示膨脹效果ch=cv2.waitKey(1)ifch==27:#按Esc退出循環(huán)breakcv2.destroyAllWindows()程序運行結(jié)果如圖8-16所示,可以調(diào)節(jié)結(jié)構(gòu)元素r的大小來改變膨脹的力度,觀察膨脹的效果。(a)原圖像
(b)膨脹圖像圖8-16灰度圖像的膨脹8.9.3灰度圖像開運算和閉運算【例8.19】應用橢圓結(jié)構(gòu)元素,對灰度圖像進行開運算,程序代碼如下:importcv2
#設置回調(diào)函數(shù)defnothing(*args):pass
img=cv2.imread('d:/pics/lena.jpg',flags=0)dWindow('morphology',6)#創(chuàng)建窗口r,MAX_R=1,20#結(jié)構(gòu)元初始半徑,最大半徑i,MAX_I=1,20#初始迭代次數(shù),最大迭代次數(shù)#創(chuàng)建滑動條,分別為半徑和迭代次數(shù)cv2.createTrackbar('r','morphology',r,MAX_R,nothing)cv2.createTrackbar('i','morphology',i,MAX_I,nothing)
whileTrue:r=cv2.getTrackbarPos('r','morphology')#得到進度條上當前的r值i=cv2.getTrackbarPos('i','morphology')#得到進度條上當前的i值#創(chuàng)建卷積核kernel=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(2*r+1,2*r+1))#形態(tài)學處理:開運算result=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel,iterations=i)cv2.imshow('morphology',result)#顯示效果
ch=cv2.waitKey(1)ifch==27:#按Esc退出breakcv2.destroyAllWindows()程序運行結(jié)果如圖8-17所示,可以調(diào)節(jié)上面的結(jié)構(gòu)元素r、迭代次數(shù)i來改變開運算的力度,觀察開運算的效果。圖8-17灰度形態(tài)學開運算【例8.20】應用矩形結(jié)構(gòu)元素,對灰度圖像進行閉運算importcv2
#設置回調(diào)函數(shù)defnothing(*args):pass
img=cv2.imread('d:/pics/lena.jpg',flags=0)
dWindow('morphology',6)#創(chuàng)建窗口r,MAX_R=1,20#結(jié)構(gòu)元初始半徑,最大半徑i,MAX_I=1,20#初始迭代次數(shù),最大迭代次數(shù)#創(chuàng)建滑動條,分別為半徑和迭代次數(shù)cv2.createTrackbar('r','morphology',r,MAX_R,nothing)cv2.createTrackbar('i','morphology',i,MAX_I,nothing)
whileTrue:r=cv2.getTrackbarPos('r','morphology')#得到進度條上當前的r值i=cv2.getTrackbarPos('i','morphology')#得到進度條上當前的i值
#創(chuàng)建卷積核kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(2*r+1,2*r+1))#形態(tài)學處理:開運算result=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel,iterations=i)cv2.imshow('morphology',result)#顯示效果
ch=cv2.waitKey(1)ifch==27:#按Esc退出breakcv2.destroyAllWindows()程序運行結(jié)果如圖8-18所示,可以調(diào)節(jié)上面的結(jié)構(gòu)元素r、迭代次數(shù)i來改變閉運算的力度,觀察閉運算的效果。圖8-18灰度圖像閉運算8.10形態(tài)學運算檢測圖像的邊緣和角點形態(tài)學算子中的膨脹和腐蝕,將它們有效組合可以實現(xiàn)檢測圖像中的邊緣和拐角。8.10.1檢測圖像邊緣形態(tài)學檢測邊緣的原理:膨脹時圖像中的物體會向周圍“擴張”,腐蝕時圖像中的物體會“收縮”。由于這兩幅圖像其變化的區(qū)域只發(fā)生在邊緣,所以將兩幅圖像相減,得到的就是圖像中物體的邊緣?!纠?.21】利用膨脹和腐蝕,對圖像進行邊緣檢測,程序代碼如下:importcv2
image=cv2.imread("d:/pics/jianzhu.jpg",cv2.IMREAD_GRAYSCALE)kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))dilate_img=cv2.dilate(image,kernel)erode_img=cv2.erode(image,kernel)
absdiff_img=cv2.absdiff(dilate_img,erode_img);#將兩幅圖像相減獲得邊緣#上面得到的結(jié)果是灰度圖,將其二值化以便觀察結(jié)果retval,threshold_img=cv2.threshold(absdiff_img,40,255,cv2.THRESH_BINARY);#反色,對二值圖每個像素取反result=cv2.bitwise_not(threshold_img)cv2.imshow("origin_img",image)cv2.imshow("dilate_img",dilate_img)cv2.imshow("erode_img",erode_img)cv2.imshow("absdiff_img",absdiff_img)cv2.imshow("threshold_img",threshold_img)cv2.imshow("result",result)cv2.waitKey(0)cv2.destroyAllWindows()輸出結(jié)果如圖8-19所示。(a)原圖像(b)膨脹圖像(c)腐蝕圖像
(e)相減圖像(f)閾值化圖像(g)邊緣圖像8.10.2檢測圖像角點圖像角點的檢測原理:1)先用十字形的結(jié)構(gòu)元素膨脹像素,這種情況下只會在邊緣處“擴張”,角點不發(fā)生變化;2)接著用菱形的結(jié)構(gòu)元素腐蝕原圖像,導致只有在角點處才會“收縮”,而直線邊緣都未發(fā)生變化;3)再用X形膨脹原圖像,角點膨脹的比邊要多;4)再用方形結(jié)構(gòu)元素腐蝕時,角點恢復原狀,而邊緣部分腐蝕的多;5)當兩幅圖像相減時,只保留了角點處?!纠?.22】使用十字形、菱形、方形和X型的結(jié)構(gòu)元素檢測出圖像拐角,程序代碼如下:importcv2importnumpyasnpimportskimage.morphologyassmimage=cv2.imread("d:/pics/jianzhu.jpg",0)original_image=image.copy()#構(gòu)造5×5的結(jié)構(gòu)元素cross=cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))#十字形結(jié)構(gòu)元素diamond=sm.diamond(2)#菱形結(jié)構(gòu)元素#X形結(jié)構(gòu)元素x=np.array([[1,0,0,0,1],[0,1,0,1,0],[0,0,1,0,0],[0,1,0,1,0],[1,0,0,0,1]],dtype=np.uint8)square=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))#方形結(jié)構(gòu)元素dilate_cross_img=cv2.dilate(image,cross)#使用十字形膨脹圖像erode_diamond_img=cv2.erode(dilate_cross_img,diamond)#使用菱形腐蝕圖像
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 榆林市榆陽區(qū)2025年五年級數(shù)學第二學期期末考試模擬試題含答案
- 江蘇省啟東市長江中學2025屆高考沖刺七歷史試題含解析
- 內(nèi)蒙古鄂爾多斯市鄂托克旗2024-2025學年初三期末熱身聯(lián)考英語試題含答案
- 玉柴職業(yè)技術(shù)學院《搜索引擎系統(tǒng)應用實踐》2023-2024學年第二學期期末試卷
- 四川華新現(xiàn)代職業(yè)學院《大學英語III》2023-2024學年第二學期期末試卷
- 上海海事大學《科技檔案管理》2023-2024學年第一學期期末試卷
- 天津美術(shù)學院《診斷學(二)》2023-2024學年第二學期期末試卷
- 寧夏工業(yè)職業(yè)學院《生物醫(yī)藥與新材料化工科研創(chuàng)新訓練》2023-2024學年第二學期期末試卷
- 山西省晉中學市榆社縣2024-2025學年初三中考考前輔導生物試題含解析
- 南通職業(yè)大學《臨床檢驗設備與技術(shù)實驗》2023-2024學年第二學期期末試卷
- 委托選礦加工合同協(xié)議
- 食堂應急預案管理制度
- CISP-PTE培訓課件教學課件
- 2025年新高考歷史預測模擬試卷黑吉遼蒙卷(含答案解析)
- 2025年醫(yī)院文化節(jié)活動策劃
- 部隊防雷電暴雨安全知識
- 2025年消防文員類面試題及答案
- 重慶市名校聯(lián)盟2024-2025學年高二上學期第一次聯(lián)合考試物理試題(解析版)
- 船舶駕駛培訓虛擬場景構(gòu)建-深度研究
- 手術(shù)患者預防跌倒
- 《特斯拉汽車供應鏈管理》課件
評論
0/150
提交評論