數(shù)字圖像處理與深度學習技術應用 課件 第8、9章 圖像形態(tài)學處理、圖像分割與測量_第1頁
數(shù)字圖像處理與深度學習技術應用 課件 第8、9章 圖像形態(tài)學處理、圖像分割與測量_第2頁
數(shù)字圖像處理與深度學習技術應用 課件 第8、9章 圖像形態(tài)學處理、圖像分割與測量_第3頁
數(shù)字圖像處理與深度學習技術應用 課件 第8、9章 圖像形態(tài)學處理、圖像分割與測量_第4頁
數(shù)字圖像處理與深度學習技術應用 課件 第8、9章 圖像形態(tài)學處理、圖像分割與測量_第5頁
已閱讀5頁,還剩338頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第8章圖像形態(tài)學處理8.1概述基本思想:用一定形態(tài)的結構元素去量度和提取圖像中的對應形狀,達到分析和識別目的??捎糜趫D像處理的各個方面,包括圖像分割、特征抽取、邊界檢測等。對圖像處理的理論和技術產(chǎn)生了重大影響,已經(jīng)構成一種新的圖像處理方法和理論,成為一個重要研究領域。8.1形態(tài)學基本概念這門學科在計算機文字識別,計算機顯微圖像分析,醫(yī)學圖像處理,工業(yè)檢測等方面都取得了非常成功的應用。形態(tài)學方法已成為圖像應用領域工程技術人員的必備工具。目前,有關數(shù)學形態(tài)學的技術和應用正在不斷地研究和發(fā)展。形態(tài)學作用數(shù)學形態(tài)學的數(shù)學基礎和所用語言是集合論,具有完備的數(shù)學基礎。數(shù)學形態(tài)學的應用可以簡化圖像數(shù)據(jù),保持它們基本的形狀特性,并除去不相干的結構。元素和集合:形態(tài)學數(shù)學基礎形態(tài)學數(shù)學基礎2)交集、并集和補集3)

包含、擊中與擊不中形態(tài)學作用結構元素:形態(tài)學變換中的基本元素,是為了探測圖像的某種結構信息而設計的特定形狀和尺寸的圖像,稱為收集圖像結構信息的探針。結構元素有多種類型:如圓形、方形、線型等,可攜帶知識(形態(tài)、大小、灰度和色度信息)來探測、研究圖像的結構特點。形態(tài)學基本方法

二值形態(tài)學中的運算對象是集合。設X為圖像集合,B為結構元素,數(shù)學形態(tài)學運算是用B對X進行操作。需要指出,實際上結構元素本身也是一個圖像集合。形態(tài)學基本方法形態(tài)學運算包括:二值腐蝕和膨脹、二值開閉運算、骨架抽取、擊中擊不中變換等。

形態(tài)學4個基本算子:膨脹、腐蝕、開啟和閉合組成。這些基本運算還可推導和組合成各種數(shù)學形態(tài)學實用算法。形態(tài)學算子腐蝕:是將圖像X中每一與結構元素B全等的子集B+x收縮為點x。腐蝕作用:消除物體邊界點,使邊界向內(nèi)部收縮,可以把小于結構元素的物體去除。選取不同的大小的結構元素,去除不同大小的物體。如兩個物體間有細小的連通,通過腐蝕可將兩個物體分開。腐蝕運算S=

S--腐蝕后的二值圖像集合;B--腐蝕的結構元素,每一個元素取值為0或1,它可以組成任何一種形狀的圖形,在B圖形中有一個中心點;X--經(jīng)過二值化后的像素集合。用B來腐蝕X得到的集合S,S是由B完全包括在X中時B的當前位置的集合?;痉椒ㄍǔJ峭蟿咏Y構元素在X域移動,在每一個位置上,當結構元素B的中心點平移到X圖像上的某一點(x,y)。如果結構元素內(nèi)的每一個像素都與以(x,y)為中心的相同鄰域中對應像素完全相同,那么就保留(x,y)像素點;對于不滿足條件的像素點則全部刪除,達到邊界向內(nèi)收縮效果?;痉椒˙+x的三種可能的狀態(tài):

M1說明B+x與X相關最大,M3說明B+x與X不相關,而M2說明B+x與X只是部分相關。腐蝕運算滿足M1的點x的全體構成結構元素與圖像最大相關點集,這個點集稱為B對X的腐蝕,X用B腐蝕的結果:B完全包括在X中時B的原點位置的集合。腐蝕運算(a)原圖

(b)結構元素圖

(c)腐蝕示意圖腐蝕作用腐蝕作用腐蝕作用腐蝕:消除物體邊界點。結構元素取3×3塊,使邊界減少一個像素。小于結構元素的物體(毛刺、小凸起)去除。選取不同大小結構元素,在原圖像中去掉不同大小的物體。如果兩個物體之間有細小的連通,當結構元素足夠大時,可以將兩個物體分開。

腐蝕作用作用:與腐蝕相反。對二值化物體邊界點擴充,將與物體接觸的所有背景點合并到該物體中,使邊界向外部擴張。如果兩個物體之間的距離比較近,會把兩個物體連通到一起。對填補圖像分割后物體中的空洞有用。膨脹如果結構元素為一個圓盤:膨脹:填充圖像中的小孔(比結構元素小的孔洞)及圖像邊緣處的小凹陷部分。腐蝕:消除圖像邊緣小的成分,并將圖像縮小,從而使其補集擴大。膨脹和腐蝕:并不互為逆運算,可以級連結合使用。膨脹作用

S=X

通常是拖動結構元素在X圖像域移動,在每一個位置上,當結構元素B的中心點平移到X圖像上的某一點(x,y),如果結構元素的像素與目標物體至少有一個像素相交,保留(x,y)像素點,達到邊界向外擴張。膨脹算子將X中的每一個點x擴大為B+x:膨脹作用(a)原圖(b)結構元素圖(c)膨脹示意圖膨脹作用膨脹作用8.2圖像腐蝕8.2.1水平腐蝕8.2.1水平腐蝕水平腐蝕的原理同上面介紹的相同,使用的結構元素不同,水平腐蝕所用的結構元素:1)得圖像的首地址及寬和高,并二值化。2)開辟緩沖區(qū),初始化為255。3)由于使用1×3的結構元素結構[0,0,0],從第1行第2列開始,將像素點賦為0,檢查這個像素點,判斷該像素點的前一點和后一點中是否有背景點,有則將檢查的像素點值賦為255,否則保持不變。4)循環(huán)步驟3,直到處理全部像素點。實現(xiàn)步驟函數(shù)說明(1)retval=cv2.getStructuringElement(shape,ksize,anchor=None)retval:返回構造的特定結構;shape:代表形狀類型,其中類型有以下三種:

cv2.MORPH_RECT,矩形結構元素,所有元素值都是1;

cv2.MORPH_CROSS,十字形結構元素,對角線元素值都是1;

cv2.MORPH_ELLIPSE,橢圓形結構元素;ksize:代表形狀元素的大小,寫法為元組(width,height);anchor:坐標(x,y),元素內(nèi)的錨定位置。默認值為(-1,-1)即結構化元素的中心。函數(shù)說明(2)retval=cv2.erode(src,k[,anchor[,iterations[,boderType[,boderValue]]]])retval:表示返回的腐蝕處理結果;src:表示原始圖像,即需要被腐蝕的圖像;k:表示腐蝕操作時所要采取的結構類型;anchor:表示錨點的位置,默認為(-1,-1),表示在結構元素的中心;iterations:表示腐蝕擦操作的迭代次數(shù);boderType:表示邊界樣式,一般默認使用BORDER_CONSTANT;boderValue:表示邊界值,一般使用默認值。效果圖效果展示8.2.2垂直腐蝕8.2.2垂直腐蝕垂直腐蝕所用的結構元素:,

(1)得原圖像的首地址及寬和高。(2)開辟緩沖區(qū),并初始化為255。(3)由于使用3×1的結構元素結構,從第2行第1列開始,將像素點賦為0,檢查這個像素點,判斷該像素點的上一點和下一點中是否有背景點,有則將檢查的像素點賦為255,否則保持不變。(4)循環(huán)步驟3,直到處理全部像素。實現(xiàn)步驟效果圖效果展示8.2.3全方向腐蝕8.2.3全方向腐蝕全方向腐蝕所用的結構元素:(1)得原圖像的首地址及寬和高。(2)辟緩沖區(qū),并初始化為255。(3)為用到3×3的結構元素,定義一個一維數(shù)組S[9];(4)從第2行第2列開始,利用結構元素數(shù)組判斷除中心點外,四個為0的位置中是否有背景點,有則將檢查的像素點賦為255,否則保持不變。(5)循環(huán)步驟4,直到處理完全部像素點。

實現(xiàn)步驟效果圖作用:圖像的邊界點消除,使圖像沿著邊界向內(nèi)收縮。操作過程:使用一個結構元對像素進行逐個遍歷,每一次判定的點都是與結構元中心點所對應的點。根據(jù)結構元與被腐蝕圖像的關系來確定腐蝕的結果。

與結構元完全相同時,結構元對應的中心點為1,與結構元不完全相同時,結構元對應的中心點為0。常見的結構元有:

矩形結構、橢圓形結構、十字交叉形結構和線性結構等。

腐蝕---小結

Python實現(xiàn)dst=cv2.erode(src,k[,anchor[,iterations[,boderType[,boderValue]]]])·dst表示返回的腐蝕處理結果?!rc表示原始圖像,即需要被腐蝕的圖像?!表示腐蝕操作時所要采取的結構類型。兩種方式.1.通過自定義得到,2.通過cv2.getStructuringElement()函數(shù)得到·anchor表示錨點的位置,默認為(-1,-1),表示在結構元的中心?!terations表示腐蝕操作的迭代次數(shù)。·boderType表示邊界樣式,一般默認使用BORDER_CONSTANT?!oderValue表示邊界值,一般使用默認值。

【例1】使用cv2.erode()函數(shù)實現(xiàn)圖像的腐蝕操作。importcv2ascvimportnumpyasnpimage=cv.imread("F:/picture/aaa.jpg")#讀取一幅圖像cv.imshow("image",image)#顯示原始圖像k=np.ones((3,3),np.uint8)#構建3×3的矩形結構元img=cv.erode(image,k,iterations=3)

#腐蝕操作,迭代3次cv.imshow("erode",img)#顯示腐蝕后的圖像cv.waitKey()cv.destroyAllWindows()

a是原始圖像;b是迭代1次的腐蝕結果;c是迭代2次的腐蝕結果;d是迭代3次的結果。在iterations=3時,腐蝕效果最好。

腐蝕程度隨迭代次數(shù)而加劇

效果展示8.3圖像膨脹8.3.1水平膨脹理論基礎水平膨脹所用的結構元素如圖8-11所示

圖8-11水平膨脹結構元素示意圖實現(xiàn)步驟(1)retval=cv2.dilate(src,k[,anchor[,iterations[,boderType[,boderValue]]]])retval:表示返回的膨脹處理結果;src:表示原始圖像,即需要被膨脹的圖像;k:表示膨脹操作時所要采取的結構類型;anchor:表示錨點的位置,默認為(-1,-1),表示在結構元素的中心;iterations:表示膨脹操作的迭代次數(shù);boderType:表示邊界樣式,一般默認使用BORDER_CONSTANT;boderValue:表示邊界值,一般使用默認值。效果展示

圖8-12水平膨脹處理效果圖8.3.2垂直膨脹理論基礎垂直膨脹所用的結構元素如圖8-13所示.圖8-13垂直膨脹結構元素示意圖效果展示8.3.3全方向膨脹膨脹操作與腐蝕操作剛好相反,它是由圖像的邊界點處向外部擴張。與腐蝕操作一樣,在圖像的膨脹操作過程中也是逐個像素地遍歷待膨脹圖像,并且根據(jù)結構元與待膨脹圖像的關系來決定膨脹的效果。與結構元完全相同時,結構元對應的中心點為1,與結構元有部分相同時,結構元對應的中心點為1。膨脹

Python實現(xiàn)dst=cv2.dilate(src,k[,anchor[,iterations[,boderType[,boderValue]]]])?dst表示返回的膨脹處理結果。?src表示原始圖像,即需要被膨脹的圖像。?k表示膨脹操作時所要采取的結構類型。它由兩種方式得到,第一種是通過自定義得到,第二種是通過cv2.getStructuringElement()函數(shù)得到?anchor表示錨點的位置,默認為(-1,-1),表示在結構元的中心。?iterations表示膨脹操作的迭代次數(shù)。?iterations表示膨脹操作的迭代次數(shù)。?boderType表示邊界樣式,一般默認使用BORDER_CONSTANT。?boderValue表示邊界值,一般使用默認值。

【例2】使用cv2.dilate()函數(shù)實現(xiàn)圖像的膨脹操作。importcv2ascvimportnumpyasnpimage=cv.imread("F:/picture/shortA.jpg")#讀取一幅圖像cv.imshow("image",image)#顯示原始圖像k=np.ones((3,3),np.uint8)#構建3×3的矩形結構元img1=cv.dilate(image,k,iterations=1)

#膨脹操作,迭代1次img2=cv.dilate(image,k,iterations=2)#膨脹操作,迭代2次img3=cv.dilate(image,k,iterations=3)#膨脹操作,迭代3次cv.imshow("dilate1",img1)#顯示膨脹后的圖像cv.imshow("dilate2",img2)#顯示膨脹后的圖像cv.imshow("dilate3",img3)#顯示膨脹后的圖像cv.waitKey()cv.destroyAllWindows()a是原始圖像;b是迭代1次;c是迭代2次;d是迭代3次。膨脹程度隨迭代次數(shù)而加劇。理論基礎全方向膨脹所用的結構元素如圖8-15所示效果展示圖8-16全方位膨脹處理效果圖8.4圖像開運算與閉運算由膨脹和腐蝕兩個運算的復合與集合操作(并、交、補等)組合成的所有運算構成。開運算:先對圖像腐蝕后膨脹。閉運算:先對圖像膨脹后腐蝕。使用同一個結構元素。8.4圖像開啟與閉合8.4.1圖像開運算開運算:能夠去除孤立的小點,毛刺和小橋(即連通兩塊區(qū)域的小點),消除小物體、平滑較大物體的邊界,同時并不明顯改變其面積。不過這一恢復不是信息無損的,即它們通常不等于原始圖像。8.4.1圖像開運算開運算:先對圖像腐蝕后膨脹。腐蝕運算:如果B上的所有點都在X的范圍內(nèi),則該點保留,否則將該點去掉。膨脹運算:如果B上有一個點落在X的范圍內(nèi),則該點就為黑。開運算開運算和閉運算依據(jù)腐蝕和膨脹的不可逆性,演變而來的。開運算:能夠去除孤立的小點,毛刺和小橋(即連通兩塊區(qū)域的小點),消除小物體、平滑較大物體的邊界,同時并不明顯改變其面積。不過這一恢復不是信息無損的,即它們通常不等于原始圖像。開運算B的中心點和X上的點一個一個地對比。開運算經(jīng)過開運算后,能夠去除孤立的小點,毛刺和小橋(即連通兩塊區(qū)域的小點),平滑較大物體的邊界,同時并不明顯改變面積。開運算作用(1)獲得原圖的首地址及圖像的高和寬。(2)調(diào)用腐蝕函數(shù)對圖像進行腐蝕處理。(3)調(diào)用膨脹函數(shù)對腐蝕后的圖像進行膨脹處理。實現(xiàn)步驟效果圖函數(shù)說明retval=cv2.morphologyEx(src,op,k[,anchor[,iterations[,boderType[,boderValue]]]])retval:表示返回運算的結果;src:表示原始圖像;op:表示操作類型,當設置為cv2.MORPH_GRADIENT時,表示對圖像進行梯度運算,當設置為cv2.MORPH_OPEN和cv2.MORPH_CLOSE時,可以對圖像實現(xiàn)開運算與閉運算的操作;參數(shù)k、anchor、iterations、boderType和boderValue與cv2.dilate()函數(shù)的參數(shù)用法一致。效果展示圖8-18開運算處理效果圖8.4.2圖像閉運算閉運算是通過對腐蝕和膨脹的另一種不同次序的執(zhí)行而得到的。閉運算:先膨脹后腐蝕,其功能是用來填充物體內(nèi)細小空洞、連接鄰近物體、平滑其邊界,同時不明顯改變其面積。

8.4.2圖像閉運算膨脹運算:如果B上有一個點落在X的范圍內(nèi),則該點就為黑。腐蝕運算:如果B上的所有點都在X的范圍內(nèi),則該點保留,否則將該點去掉。閉運算閉運算是通過對腐蝕和膨脹的另一種不同次序的執(zhí)行而得到的,閉運算是先膨脹后腐蝕的過程,其功能是用來填充物體內(nèi)細小空洞、連接鄰近物體、平滑其邊界,同時不明顯改變其面積。閉運算作用B的中心點和X上的點一個一個地對比。閉運算經(jīng)過閉運算后,斷裂的地方被彌合了。閉運算能夠填平小孔,彌合小裂縫,而總的位置和形狀不變。閉運算作用閉運算作用(1)獲得原圖像的首地址及圖像的高和寬。(2)調(diào)用膨脹函數(shù)對原圖像進行膨脹處理。(3)調(diào)用腐蝕函數(shù)對膨脹后的圖像進行腐蝕處理。實現(xiàn)步驟效果展示圖8-20閉運算處理效果圖開運算和閉運算是以腐蝕和膨脹為基礎操作的一種形態(tài)學處理方法。開運算與閉運算都以腐蝕和膨脹操作為基礎。開運算是先將圖像腐蝕,再膨脹。閉運算是先將圖像膨脹,再腐蝕。開運算與閉運算---小結小結1.開運算:

先腐蝕后膨脹可以消除亮度較高的細小區(qū)域、在纖細點處分離物體。對于較大物體,在不明顯改變面積下平滑邊界。2.閉運算:圖像先膨脹后腐蝕,與開運算相反可以填充白色物體內(nèi)細小黑色空洞的區(qū)域、連接臨近物體等。Python實現(xiàn)可以利用cv2.erode()函數(shù)和cv2.dilate()函數(shù)來實現(xiàn)開運算與閉運算OpenCV提供cv2.morphologyEx()實現(xiàn)開運算與閉運算。openimg=cv.morphologyEx(image,cv.MORPH_OPEN,k)closeimg=cv.morphologyEx(image,cv.MORPH_CLOSE,k)

op參數(shù)設置為cv2.MORPH_OPEN:開運算cv2.MORPH_CLOSE時:閉運算importcv2ascvimportnumpyasnpimage=cv.imread("F:/picture/aaa.jpg")#讀取一幅圖像k=np.ones((10,10),np.uint8)#構建10×10的矩形結構元openimg=cv.morphologyEx(image,cv.MORPH_OPEN,k)#設置參數(shù),實現(xiàn)圖像的開運算cv.imshow("image",image)#顯示原始圖像cv.imshow("openimg",openimg)#顯示開運算圖像cv.waitKey()cv.destroyAllWindows()a為原始圖像;b為對a進行開運算的結果??梢钥闯?,圖像的毛邊被消除了?!纠?/p>

5】用cv2.erode()函數(shù)和cv2.dilate()函數(shù)來實現(xiàn)圖像的開運算importcv2ascvimportnumpyasnpimage=cv.imread("F:/picture/aaa.jpg")#讀取一幅圖像k=np.ones((10,10),np.uint8)#構建10×10的結構元erod_n=cv.erode(image,k)#實現(xiàn)圖像的腐蝕操作dilate_n=cv.dilate(erod_n,k)#實現(xiàn)圖像的膨脹操作cv.imshow("image",image)#顯示原始圖像cv.imshow("image",image)#顯示原始圖像cv.imshow("open",dilate_n)#顯示經(jīng)過先腐蝕后膨脹的圖像cv.waitKey()cv.destroyAllWindows()a為原始圖像,b為對a進行先腐蝕后膨脹的結果??梢钥闯?,先腐蝕后膨脹的結果與開運算的結果基本一樣。2.閉運算演示【例

6】用cv2.morphologyEx()函數(shù)實現(xiàn)圖像的閉運算importcv2ascvimportnumpyasnpimage=cv.imread("F:/picture/love.png")#讀取一幅圖像k=np.ones((10,10),np.uint8)#構建10×10的矩形結構元closeimg=cv.morphologyEx(image,cv.MORPH_CLOSE,k)#設置參數(shù),實現(xiàn)圖像的閉運算cv.imshow("image",image)#顯示原始圖像cv.imshow("closeimg",closeimg)#顯示開運算圖像cv.waitKey()cv.destroyAllWindows()a原始圖像,b為對a進行閉運算的結果??梢钥闯?,前景圖像的黑點被消除了?!纠?】用cv2.erode()函數(shù)和cv2.dilate()函數(shù)來實現(xiàn)圖像的閉運算importcv2ascimportnumpyasnpimage=cv.imread("F:/picture/love.png")#讀取一幅圖像k=np.ones((10,10),np.uint8)#構建10×10的結構元dilate_n=cv.dilate(image,k)#實現(xiàn)圖像的膨脹操作erod_n=cv.erode(dilate_n,k)#實現(xiàn)圖像的腐蝕操作cv.imshow("image",image)#顯示原始圖像cv.imshow("close",erod_n)#顯示經(jīng)過先膨脹后腐蝕的圖像cv.waitKey()cv.destroyAllWindows()a為原始圖像,b為對a進行先膨脹后腐蝕的結果??梢钥闯?,先膨脹后腐蝕的結果與閉運算的結果基本上一樣8.5形態(tài)學梯度運算理論基礎梯度運算是利用圖像的膨脹圖像減去腐蝕圖像的一種形態(tài)學操作,這種操作可以獲得圖像的邊緣信息。形態(tài)學梯度的定義:函數(shù)說明dst=cv2.morphologyEx(src,op,k[,anchor[,iterations[,boderType[,boderValue]]]])dst:表示返回梯度運算的結果。src:表示原始圖像。op:表示操作類型,當設置為cv2.MORPH_GRADIENT時,表示對圖像進行梯度運算。參數(shù)k、anchor、iterations、boderType和boderValue與cv2.dilate()函數(shù)的參數(shù)用法一致。效果展示(a)是原始圖像;(b)是結構元k=2×2的梯度運算結果;(c)是結構元k=5×5的梯度運算結果,隨著結構元k的增大,掃描到的邊緣會越來越粗,以至于無法分辨出邊緣。圖8-21形態(tài)學梯度運算利用圖像的膨脹圖像減去腐蝕圖像的一種形態(tài)學操作,可以獲得圖像的邊緣信息。梯度運算的過程就是膨脹結果減去腐蝕結果。梯度運算---小結Python實現(xiàn)dst=cv2.morphologyEx(src,op,k[,anchor[,iterations[,boderType[,boderValue]]]])dst表示返回梯度運算的結果。src表示原始圖像。op表示操作類型,當設置為cv2.MORPH_GRADIENT時,表示對圖像進行梯度運算。參數(shù)k、anchor、iterations、boderType和boderValue與cv2.dilate()函數(shù)的參數(shù)用法一致。importcv2ascvimportnumpyasnpimage=cv.imread("F:/picture/contours.png")#讀取一幅圖像k1=np.ones((2,2),np.uint8)

#構建一個2×2的結構元k2=np.ones((5,5),np.uint8)#構建一個5×5的結構元r1=cv.morphologyEx(image,cv.MORPH_GRADIENT,k1)#實現(xiàn)圖像的梯度運算r2=cv.morphologyEx(image,cv.MORPH_GRADIENT,k2)#實現(xiàn)圖像的梯度運算cv.imshow("image",image)#顯示原圖cv.imshow("r1",r1)#顯示梯度運算后的結果圖cv.imshow("r2",r2)#顯示梯度運算后的結果圖cv.waitKey()cv.destroyAllWindows()a是原始圖像;b是結構元k=2*2的梯度運算結果;c是結構元k=5*5的梯度運算結果。隨著結構元k的增大,掃描到的邊緣會越來越粗,以至于無法分辨出邊緣。8.6黑帽與禮帽運算理論基礎黑帽與禮帽運算建立在開運算與閉運算的基礎上。(1)黑帽運算黑帽運算是用原始圖像減去閉運算的結果,即它可以獲得比原始圖像邊緣更加黑暗的邊緣部分,或者獲得圖像內(nèi)部的小孔。(2)禮帽運算禮帽運算是用原始圖像減去開運算的結果,即它可以獲得圖像的噪聲信息或者比原始圖像邊緣更亮的邊緣部分。函數(shù)說明在OpenCV中提供了比較方便的函數(shù)cv2.morphologyEx()來直接實現(xiàn)圖像的黑帽運算與禮帽運算。當將op參數(shù)設置為cv2.MORPH_BLACKHAT和cv2.MORPH_TOPHAT時,可以對圖像進行黑帽運算與禮帽運算的操作。黑帽運算效果展示圖8-22黑帽運算(b)為對圖8-22(a)進行黑帽運算的結果。可以看出,黑帽運算可以將目標內(nèi)部暗的部分提取出來。禮帽運算效果展示圖8-33禮帽運算(b)為對圖8-23(a)進行禮帽運算的結果。可以看出,禮帽運算可以將目標邊緣部分提取出來。黑帽與禮帽運算建立在開運算與閉運算的基礎上。1.黑帽運算:原始圖像—閉運算

可以獲得比原始圖像邊緣更加黑暗的邊緣部分,或者獲得圖像內(nèi)部的小孔。2.禮帽運算:原始圖像—圖像開運算可以獲得圖像的噪聲信息或者比原始圖像邊緣更亮的邊緣部分。黑帽與禮帽運算---小結Python實現(xiàn)cv2.morphologyEx()來直接實現(xiàn)圖像的黑帽運算與禮帽運算。當將op參數(shù)設置為openimg=cv.morphologyEx(image,cv.MORPH_OPEN,k)closeimg=cv.morphologyEx(image,cv.MORPH_CLOSE,k)

op參數(shù)設置為cv2.MORPH_OPEN:開運算cv2.MORPH_CLOSE時:閉運算cv2.MORPH_BLACKHAT:黑帽運算cv2.MORPH_TOPHAT時:禮帽運算的操作。importcv2ascvimportnumpyasnpimage=cv.imread("F:/picture/love.png")#讀取一幅圖像k=np.ones((10,10),np.uint8)#構建10×10的矩形結構元bhimg=cv.morphologyEx(image,cv.MORPH_BLACKHAT,k)#設置參數(shù),實現(xiàn)圖像的黑帽運算cv.imshow("image",image)#顯示原始圖像cv.imshow("bhimg",bhimg)#顯示黑帽運算圖像cv.waitKey()cv.destroyAllWindows()a為原始圖像,b為對a進行黑帽運算的結果??梢钥闯?,黑帽運算可以將圖像內(nèi)部和邊緣中比原始圖像暗的部分提取出來。【例

9】

用cv2.morphologyEx()函數(shù)實現(xiàn)圖像的禮帽運算importcv2ascvimportcv2ascvimportnumpyasnpimage=cv.imread("F:/picture/love.png")

#讀取一幅圖像k=np.ones((10,10),np.uint8)#構建10×10的矩形結構元bhimg=cv.morphologyEx(image,cv.MORPH_TOPHAT,k)#設置參數(shù),實現(xiàn)圖像的禮帽運算cv.imshow("image",image)#顯示原始圖像cv.imshow("bhimg",bhimg)#顯示禮帽運算圖像cv.waitKey()cv.destroyAllWindows()a為原始圖像,b為對a進行禮帽運算的結果??梢钥闯?,禮帽運算可以將圖像內(nèi)部和邊緣中比原始圖像亮的部分提取出來。8.7圖像細化細化技術:把一個平面區(qū)域簡化成圖的結構形狀表示法。骨架:一種細化結構,它是目標的重要拓撲描述,具有非常廣泛的應用。在圖像識別或數(shù)據(jù)壓縮時,經(jīng)常用細化結構,例如,在識別字符之前,往往要先對字符作細化處理,求出字符的細化結構。8.5圖像細化細化:目的是將圖像的骨架提取出來的同時,保持圖像細小部分的連通性,特別是在文字識別,地質識別,工業(yè)零件識別或圖像理解中,先對被處理的圖像進行細化有助于突出形狀特點和減少冗余信息量。細化細化技術:把一個平面區(qū)域簡化成圖的結構形狀表示法。骨架:一種細化結構,它是目標的重要拓撲描述,具有非常廣泛的應用。在圖像識別或數(shù)據(jù)壓縮時,經(jīng)常用細化結構,例如,在識別字符之前,往往要先對字符作細化處理,求出字符的細化結構。骨架抽取細化過程:求一圖像骨架的過程。骨架:重要拓撲描述,指骨骼部分。長方形骨架:長方向上的中軸線;正方形骨架:中心點;圓骨架:圓心;直線骨架:自身;孤立點骨架:自身。細化細化細化算法:采取逐次去除邊界的方法來進行的,不能破壞圖像的連通性。在細化一幅圖像X時應滿足兩個條件:第一,在細化的過程中,X應該有規(guī)律地縮??;第二,在X逐步縮小的過程中,應當使X的連通性質保持不變。細化實際應用:通常選擇一組結構元素對,不斷在這些結構對中循環(huán),如果所得結果不再變化,則終止迭代過程,隨著迭代的進行,集合也不斷細化。結構對的選擇:僅受結構元素不相交的限制。事實上,每一個Bi(i=1,2,…,N)都可以是相同的結構對,即在不斷重復的迭代細化過程使用同一個結構對。。細化設置一個5*5的鄰域S模板;S模板中各個位置上的取值取決于模板所對應圖像中不同位置的像素,如果S模板某一個位置上所對應的像素值為白,模板上該位置賦為0,否則賦為1。細化s[0][0]s[0][1]s[0][2]s[0][3]s[0][4]s[1][0]s[1][1]s[1][2]s[1][3]s[1][4]s[2][0]s[2][1]s[2][2]s[2][3]s[2][4]s[3][0]s[3][1]s[3][2]s[3][3]s[3][4]s[4][0]s[4][1]s[4][2]s[4][3]s[4][4]N(s[2][2])表示以s[2][2]為中心的3×3鄰域內(nèi)目標像素(即黑點)的個數(shù)。取其中的3×3鄰域以s[2][2]為中心點,則T(s[2][2])表示序列:s[1][2]-》s[1][2]0->1的變化次數(shù)。取其中的3×3鄰域以s[1][2]為中心點,則T(s[1][2])表示序列:s[0][2]-》s[0][2]0->1的變化次數(shù)。取其中的3×3鄰域以s[2][1]為中心點,則T(s[2][1])表示序列:s[1][1]-》s[1][1]0->1的變化次數(shù)。細化條件1:2≦N(s[2][2])≦6;條件2:T(s[2][2]))=1;條件3:s[1][2]*s[2][1]*s[2][3]=0同時T(s[1][2])!=1;條件4:s[1][2]*s[2][1]*s[3][2]=0同時T(s[2][1])!=1。同時滿足以上4個條件,則刪除該點,否則保留,重復判斷像素點直至沒有點可以刪除。細化細化過程就是判斷每一個二值化的圖像像素點是否滿足以上4個條件,滿足則刪除該點,重復判斷直至所有點都不能刪除為止。細化(1)獲得原圖像的首地址及圖像的高和寬。(2)開辟一塊內(nèi)存緩沖區(qū),并初始化為255。(3)如果當前像素為白,是背景則跳過該像素。(4)如果當前像素為黑,是物體,則定義一個5×5的結構元素,計算5×5的結構元素中各個位置上的值,將S模板中心覆蓋在欲判斷的像素上,如果S模板所覆蓋的位置下,像素值為白,則置0,否則置1。(5)依次判斷S模板點是否同時滿足4個判斷條件,是則刪除該點,否則判斷下一個像素點,直至所有的像素點處理完一遍。(6)循環(huán)執(zhí)行5直至沒有點可以刪除為止。實現(xiàn)步驟效果圖小結對圖像細化的過程實際上是求圖像骨架的過程。在細化一幅圖像X的過程中應滿足兩個條件:第一,在細化的過程中,X應該有規(guī)律地縮??;第二,第二,在X逐步縮小的過程中,應當使X的連通性質保持不變。每幅小圖的中心點不能刪設置一個5×5的鄰域S模板,如果S模板某一個位置上所對應的像素值為白,模板上該位置賦為0,否則賦為1。小結(1)N(s[2][2])表示以s[2][2]為中心的3×3鄰域內(nèi)目標像素點(即黑點)的個數(shù),取其中的3×3鄰域以s[2][2]為中心點,則T(s[2][2])表示序列:s[1][2],s[1][1],s[2][1],s[3][1],s[3][2],s[3][3],s[2][3],s[1][3],s[1][2]中0→1的變化次數(shù)。(2)取其中的3×3鄰域以s[1][2]為中心點,則T(s[1][2])表示序列:s[0][2],s[0][1],s[1][1],s[2][1],s[2][2],s[2][3],s[1][3],s[0][3],s[0][2]中0→1的變化次數(shù)。(3)取其中的3×3鄰域以s[2][1]為中心點,則T(s[2][1])表示序列:s[1][1],s[1][0],s[2][0],s[3][0],s[3][1],s[3][2],s[2][2],s[1][2],s[1][1]中0→1的變化次數(shù)。小結4個條件來判斷像素點是否可以刪除,當像素點同時滿足這4個條件時,這個點就可以刪除。條件1:2≤N(s[2][2])≤6;條件2:T(s[2][2]))=1;條件3:s[1][2]*s[2][1]*s[2][3]=0同時T(s[1][2])!=1;條件4:s[1][2]*s[2][1]*s[3][2]=0同時T(s[2][1])!=1。效果展示作者楊淑瑩敬上謝謝!第9章圖像分割與測量9.1概述圖像分析過程圖像圖像識別圖像預處理圖像理解圖像分割圖像分割與測量是圖像識別工作的基礎。圖像分割將圖像分為一些有意義的區(qū)域,然后可以對這些區(qū)域進行描述,相當于提取出某些目標區(qū)域圖像的特征,判斷圖像中是否有感興趣的目標。圖像分割的基礎是像素間的相似性和跳變性。圖像分割的概念分成若干個互不相交的小區(qū)域的過程,小區(qū)域是某種意義下具有共同屬性的像素的連通集合。各區(qū)域對某種性質,如灰度,紋理等有相似性。區(qū)域內(nèi)部是連通的,沒有過多小孔。區(qū)域邊界是明確的,相鄰區(qū)域對分割所依據(jù)的性質有明顯的差異。圖像分割的概念圖像分割圖像分割:把圖像分成各具特性的區(qū)域,如目標或前景與背景,選擇性地定位感興趣目標在圖像中的位置和范圍,提取出感興趣目標的技術和過程。

人的視覺系統(tǒng)對圖像分割是十分復雜的,也是相當有效的。但分割原理和模型都未搞清楚。圖像分割的基本思路:從簡到難,逐級分割控制背景環(huán)境,降低分割難度把焦點放在增強感興趣對象,縮小不相干圖像成分的干擾上。圖像分割邊緣檢測:檢測出邊緣,再將邊緣像素連接,構成邊界形成分割,找出目標物體的輪廓,進行目標的分析、識別、測量等。閾值分割:最常用法。有直方圖門限選擇,半閾值選擇圖像分割,迭代閾值。邊界方法:直接確定區(qū)域邊界,實現(xiàn)分割;有邊界跟蹤法,輪廓提取法。區(qū)域法:將各像素劃歸到相應物體或區(qū)域的像素聚類方法;有區(qū)域增長法等。圖像分割四種不同的方法概述分割的目的是將圖像分為一些有意義的區(qū)域,如目標或前景,然后可以對這些區(qū)域進行描述。圖像分割的基本思路:從簡到難,逐級分割;控制背景環(huán)境,降低分割難度,把焦點放在增強感興趣的對象,縮小不相干圖像成分的干擾上。圖像分割的方法有多種,依據(jù)工作對像來分,可分為點相關分割和區(qū)域相關分割;按算法分類,可分為閥值法,界限檢測法,匹配法,跟蹤法等。9.2閾值法分割154基本原理原始圖像——f(x,y)灰度閾值——T閾值運算得二值圖像——g(x,y)閾值分割9.2.1直方圖門限選擇法9.2.1直方圖閾值選擇

閾值T可通過分析邊緣檢測輸出的直方圖來確定。假設,一幅圖像只有物體和背景兩部分組成,其灰度級直方圖成明顯的雙峰值。255f(i,j)158人工閾值人工選擇法是通過人眼的觀察,應用人對圖像的知識,在分析圖像直方圖的基礎上,人工選出合適的閾值。也可以在人工選出閾值后,根據(jù)分割效果,不斷的交互操作,從而選擇出最佳的閾值。159直方圖閾值選擇閾值選擇直接影響分割效果,利用灰度直方圖求兩峰之間的谷底作為閾值。160T=70的二值化圖像原始圖像直方圖人工閾值255如果f(i,j)≥Tf(i,j)=

0如果f(i,j)<T或:

0如果f(i,j)≥Tf(i,j)=

255如果f(i,j)<T直方圖閾值選擇

若直方圖呈現(xiàn)多個明顯的峰值,如三個峰值,可取兩個峰谷處的灰度值T1,T2作為閾值。同樣,可將閾值化后的圖像變成二值化圖像。

f(i,j)T1T22550直方圖閾值選擇其數(shù)學表達式為:

0如果T1≤f(i,j)≤T2f(i,j)=

255其它或

255如果T1≤f(i,j)≤T2f(i,j)=

0其它

直方圖閾值選擇1)獲得原圖像的首地址,圖像的寬和高。2)開辟一塊內(nèi)存空間,初始化為255。3)圖像灰度統(tǒng)計,顯示灰度直方圖。4)通過對話框選取一個峰谷作為閾值。5)像素灰度值小于閾值,將像素置為0,否則置為255。6)將結果復制到原圖像數(shù)據(jù)區(qū)。實現(xiàn)步驟效果圖(a)根據(jù)直方圖選擇閾值(b)原圖(c)二值化效果展示根據(jù)直方圖9-3所示,將兩峰之間的谷底140作為閾值。

圖9-3直方圖19.2.2半閾值選擇法9.2.2半閾值選擇分割不論圖像的直方圖具有雙峰還是多峰值,閾值化后將原多值圖像變成二值圖像,若希望只把圖像的背景表示成二值圖像(即背景不是最白就是最黑),而物體為多值圖像。此時,可采用半閾值技術,把物體從背景中分離出來。半閾值化表示為:

f(i,j)如果f(i,j)≥Tf(i,j)=

0或者255如果f(i,j)<T

f(i,j)如果f(i,j)≤Tf(i,j)=

0或者255其它半閾值選擇分割1)獲得原圖像的首地址,圖像的寬和高。2)開辟一塊內(nèi)存空間,并初始化為255。3)進行圖像灰度統(tǒng)計,顯示灰度直方圖。4)選取一個峰谷作為閾值。5)像素灰度值小于閾值,將像素置為0,否則保持灰度值不變。實現(xiàn)步驟(a)根據(jù)直方圖選擇閾值

(b)半閾值選擇分割效果圖cv2.calcHist()函數(shù)用于統(tǒng)計圖像直方圖信息hist=cv2.calcHist(image,channel,mask,histSize,range,accumulate)hist:表示返回的統(tǒng)計直方圖,數(shù)組內(nèi)的元素是各個灰度級的像素個數(shù);image:表示原始圖像,該圖像需要用“[]”括起來;channel:表示指定通道編號,通道編號需要用“[]”括起來;mask:表示掩模圖像,當統(tǒng)計整幅圖像的直方圖時,將這個值設為None;當統(tǒng)計圖像某一部分的直方圖時,需要用到掩模圖像;histSize:表示BINS的值,該值需要用“[]”括起來;range:表示像素值范圍;accumulate:表示累計標識,默認值為False。如果被設置為True,則直方圖在開始計算時不會被清零,計算的是多個直方圖的累計結果,用于對一組圖像計算直方圖。該參數(shù)是可選的,一般情況下不需要設置。函數(shù)說明效果展示根據(jù)直方圖9-5所示,將兩峰之間的谷底140作為閾值。

圖9-5直方圖2效果展示

圖9-6半閾值選擇圖像分割處理效果圖9.2.3迭代閾值法176基本思想:選擇一個閾值作為初始值,按某種策略不斷地迭代改進,直到滿足給定的準則。自動輸出一個閾值。在迭代過程中,關鍵是閾值改進策略,閾值改進策略要求:快速收斂,新產(chǎn)生閾值優(yōu)于上一次的閾值。9.2.3迭代閾值分割迭代閾值法

1)選擇圖像灰度的中值作為初始閾值Ti=T0。2)利用閾值Ti把圖像分割成兩部分區(qū)域,R1和R2,并計算其灰度均值。3)計算新的閾值Ti+14)重復步驟2、3,直到Ti+1和Ti的閾值差別小于某個給定值。1)獲得原圖像的首地址,圖像的高和寬。2)進行直方圖統(tǒng)計。3)設定初始閾值T=127。4)分別計算圖像中小于T和大于T的兩組平均灰度值。5)迭代計算閾值,直至兩個閾值相等。7)根據(jù)計算出的閾值,對圖像進行二值化處理。實現(xiàn)步驟179原始圖像迭代閾值二值化效果圖函數(shù)說明matplotlib模塊可以使用其中的hist()函數(shù)來直接繪制圖像的直方圖。n,bins,patches=matplotlib.pyplot.hist(src,bins=10,normed=False,histtype=u'bar',**kwargs)返回值:

n:直方圖向量,是否歸一化由參數(shù)normed設定。當normed取默認值時,n即為直方圖各組內(nèi)元素的數(shù)量(各組頻數(shù));

bins:返回各個bin的區(qū)間范圍;

patches:返回每個bin里面包含的數(shù)據(jù),是一個list;參數(shù):

src:表示原始圖像數(shù)據(jù),必須將其轉換為一維數(shù)據(jù);

bins:直方圖的柱數(shù),可選項,默認為10;

normed:是否將得到的直方圖向量歸一化。默認為0;

histtype:直方圖類型,這些類型有:'bar','barstacked','step','stepfilled'。效果展示9.2.4Otsu閾值法小結Otsu算法主要采用最大類間方差法,將圖像分成背景和前景兩部分,要求這兩個部分的類內(nèi)離散度最小,類間離散度最大,使兩類間方差最大來確定最佳閾值。根據(jù)閾值T將圖像中的像素點分為C1和C2兩類,則:ω0=N0/M×Nω1=N1/M×NN0+N1=M×Nω0+ω1=1μ=ω0*μ0+ω1*μ1(9-12)

g=ω0(μ0-μ)^2+ω1(μ1-μ)^2(9-13)

將式(9-12)代入式(9-13),得到等價公式:

g=ω0ω1(μ0-μ1)^2在從0到255的范圍內(nèi),不斷調(diào)整閾值T;分別計算上式,找到上述最大的g(T),則對應的T即為Otsu算法自動選取的閾值。函數(shù)說明在threshold()函數(shù)傳遞type參數(shù)時,多傳遞一個參數(shù)cv2.THRESH_OTSU即可,必須把閾值設置為0。retval,dst=cv2.threshold(src,thresh,maxval,type)retval:表示返回的閾值;dst:表示輸出的圖像;src:表示要進行閾值分割的圖像,可以是多通道的圖像;thresh:表示設定的閾值;maxval:表示type參數(shù),cv2.THRESH_OTSU;效果展示圖像Ostu算法閾值處理效果如圖9-8所示。左側為原始圖像,右側為處理后的圖像。圖9-8Ostu算法閾值處理效果圖9.2.5自適應閾值法小結自適應閾值可以看成一種局部性的閾值,通過規(guī)定一個區(qū)域大小,比較處理像素點與區(qū)域大小里面像素點的平均值—閾值(或者其他特征)的大小關系確定這個像素點是黑還是白。理想的情況下,色彩均衡的圖像,對整個圖像使用單個閾值進行閾值化就會成功。但是,受到多種因素的影響,圖像的色彩并不會很均衡,在這種情況下,使用局部值(又稱自適應值)進行分割可以產(chǎn)生好的結果。函數(shù)說明在OpenCV中提供函數(shù)cv2.adaptiveThreshold()來實現(xiàn)自適應閾值處理,其一般格式為:dst=cv2.adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,c)dst:輸出的圖像;src:輸入圖,只能輸入單通道圖像,通常來說為灰度圖;maxval:當像素值超過了閾值(或者小于閾值,根據(jù)type來決定)時,所賦予的值adaptiveMethod:閾值的計算方法,包含以下2種類型:

cv2.ADAPTIVE_THRESH_MEAN_C:區(qū)域內(nèi)均值;

cv2.ADAPTIVE_THRESH_GAUSSIAN_C:區(qū)域內(nèi)像素點加權和,權重為一個高斯窗口;thresholdType:二值化操作的類型BlockSize:圖片中區(qū)域的大小;C:閾值計算方法中的常數(shù)項。效果展示圖像自適應閾值分割處理效果如圖9-9所示。圖9-9(a)為原始圖像,圖9-9(b)為采用權重相等方式的局部閾值處理;圖9-9(c)為采用權重為高斯分布的局部閾值處理。可以看出圖9-9(c)相對于圖9-9(b)保留了大量的細節(jié)信息。9.2.6分水嶺算法是一種分割方法;在分割中,與鄰近相似性作為參考依據(jù);將空間位置上相近和灰度值相近的像素點,連接起來構成一個封閉的輪廓;比喻為地理學上的地形表面實現(xiàn)分割。9.1分水嶺算法9.1.1算法原理灰度值高的區(qū)域看成山峰,灰度值低的區(qū)域看成山谷。由于噪聲,存在過度分割的現(xiàn)象;為了解決過度分割的問題,使用基于標記(mark)圖像的分水嶺算法。通常的mark圖像都是在某個區(qū)域定義了一些灰度層級,在這個區(qū)域的洪水淹沒過程中,水平面都是從定義的高度開始的,這樣可以避免一些很小的噪聲極值區(qū)域的分割。9.1.2OpenCV中的相關函數(shù)完成分水嶺分割還需要:對灰度圖進行OTSU二值化閾值處理;形態(tài)學函數(shù);距離變換函數(shù)cv2.distanceTransform();計算結果進行閾值化處理,得到圖像內(nèi)子圖的一些形狀信息;對目標進行標注,函數(shù)cv2.connectedComponent()使用cv2.watershed()函數(shù)實現(xiàn)分水嶺算法。1.形態(tài)學函數(shù)開運算:先腐蝕后膨脹的操作。去除圖像內(nèi)的噪聲。在用分水嶺算法處理圖像前,要先使用開運算去除圖像內(nèi)的噪聲,以避免噪聲對圖像分割可能造成的干擾。2.距離變換函數(shù)distanceTransform二值圖像內(nèi)任意點到最近背景點的距離。一般計算非零值像素點到最近的零值像素點的距離。其計算結果反映了各個像素與背景(值為0的像素點)的距離關系。如果對上述計算結果進行閾值化處理,就可以得到圖像內(nèi)子圖的一些形狀信息。距離變換函數(shù)實現(xiàn)步驟①將輸入圖片轉換為二值圖像,前景設置為1,背景設置為0②先遍歷圖像:左,左上,上,左下公式計算:D表示距離包括歐式距離,棋盤距離和麥哈頓距離;掩膜模板mask為maskL;f(p)為像素點p的像素值;③再次遍歷圖像,右,右上,右下,下;④根據(jù)模板maskL和maskR的掃描,得到最終的距離變換圖像。為了減少計算了量,采用了一種倒角模版的算法,只需要對圖像進行兩次掃描,可以實現(xiàn)距離變換,該方法被稱為chamfer倒角距離變換,該模版如下:距離變換函數(shù)實現(xiàn)步驟函數(shù)介紹dst=cv2.distanceTransform(src,distanceType,maskSize[,dstType])·dst表示計算得到目標函數(shù)圖像?!rc表示原始圖像,必須是8通道的二值圖像?!istanceType表示距離類型。·maskSize表示掩模的尺寸大小?!stType表示目標函數(shù)的類型,默認為CV_F。distanceType表示的是選取距離的類型,可以設置為CV_DIST_L1,CV_DIST_L2,CV_DIST_C等,具體如下:DIST_L1=1,distance=|x1-x2|+|y1-y2|DIST_L2=2,thesimple歐式distanceDIST_C=3,distance=max(|x1-x2|,|y1-y2|)DIST_L12=4,L1-L2metric:distance=2(sqrt(1+x*x/2)-1))DIST_FAIR=5,distance=c^2(|x|/c-log(1+|x|/c)),c=1.3998DIST_WELSCH=6,distance=c^2/2(1-exp(-(x/c)^2)),c=2.9846DIST_HUBER=7distance=|x|<c?x^2/2:c(|x|-c/2),c=1.345maskSize表示的是距離變換的掩膜模板,可以設置為3,5或CV_DIST_MASK_PRECISE,對CV_DIST_L1或CV_DIST_C的情況,參數(shù)值被強制設定為3,因為3×3mask給出5×5mask一樣的結果,而且速度還更快。labels表示可選輸出2維數(shù)組;labelType表示的是輸出二維數(shù)組的類型;defcalcEuclideanDistance(x1,y1,x2,y2): returnmath.sqrt(float((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));defdistanceTrans(src,x1):rows=src.shape[0]cols=src.shape[1]#第一遍遍歷圖像,使用左模板foriinrange(1,rows-1):forjinrange(1,cols-1):ifi==x1:disPara=calcEuclideanDistance(i,j,i,j-1)fDisMin=min(float(src[i][j]),src[i][j-1]+disPara)disPara=calcEuclideanDistance(i,j,i-1,j-1)fDisMin=min(fDisMin,src[i-1][j-1]+disPara)disPara=calcEuclideanDistance(i,j,i-1,j)fDisMin=min(fDisMin,src[i-1][j]+disPara)disPara=calcEuclideanDistance(i,j,i-1,j+1)fDisMin=min(fDisMin,src[i-1][j+1]+disPara)src[i][j]=fDisMin

#第二遍使用右模板,從右下角開始foriinrange(rows-2,0,-1):forjinrange(cols-2,0,-1):ifi==x1:disPara=calcEuclideanDistance(i,j,i,j+1)fDisMin=min(float(src[i][j]),src[i][j+1]+disPara)disPara=calcEuclideanDistance(i,j,i+1,j+1)fDisMin=min(fDisMin,src[i+1][j+1]+disPara)disPara=calcEuclideanDistance(i,j,i+1,j)

fDisMin=min(fDisMin,src[i+1][j]+disPara)disPara=calcEuclideanDistance(i,j,i+1,j-1)fDisMin=min(fDisMin,src[i+1][j-1]+disPara)src[i][j]=fDisMinreturnsrc[[000000][02552552552550][02552552552550][02552552552550][02552552552550][000000]][[000000][011110][02552552552550][02552552552550][02552552552550][000000]][[000000][011110][012210][02552552552550][02552552552550][000000]][[000000][011110][012210][012210][02552552552550][000000]]9-1-0觀察距離變換函數(shù)cv2.distanceTransform()

[[000000][011110][012210][012210][011110][000000]]1.原圖2.第一行距離3.第二行距離4.第三行距離5.第四行距離img=cv2.imread("F:/picture/coin.jpg")imageGray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)#對灰度圖進行OTSU閾值處理ret,thresh=cv.threshold(imageGray,0,255,cv.THRESH_BINARY_INV+cv.THRESH_OTSU)kernel=np.ones((3,3),np.uint8)#設定開運算的卷積核#對二值圖像進行開運算imageOpen=cv.morphologyEx(thresh,cv.MORPH_OPEN,kernel,iterations=2)distTransform=cv.distanceTransform(im

溫馨提示

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

評論

0/150

提交評論