圖像的膨脹(Dilation)和腐蝕(Erosion)是兩種基本的形态學運算,主要用來尋找圖像中的極大區域和極小區域。其中膨脹類似于“領域擴張”,将圖像中的高亮區域或白色部分進行擴張,其運作結果圖比原圖的高亮區域更大;腐蝕類似于“領域被蠶食”,将圖像中的高亮區域或白色部分進行縮減細化,其運作結果圖比原圖的高亮區域更小。
1.圖像膨脹膨脹的運算符是“⊕”,其定義如下:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicWZwpmLlhDNjBjZhNGZlVTYyYDN4MDMhZWNhVmM2AjYxUmN3EDN4EjZiZGOl9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.jpeg)
該公式表示用B來對圖像A進行膨脹處理,其中B是一個卷積模闆或卷積核,其形狀可以為正方形或圓形,通過模闆B與圖像A進行卷積計算,掃描圖像中的每一個像素點,用模闆元素與二值圖像元素做“與”運算,如果都為0,那麼目标像素點為0,否則為1。進而計算B覆寫區域的像素點最大值,并用該值替換參考點的像素值實作膨脹。下圖是将左邊的原始圖像A膨脹處理為右邊的效果圖A⊕B。
腐蝕的運算符是“-”,其定義如下:
該公式表示圖像A用卷積模闆B來進行腐蝕處理,通過模闆B與圖像A進行卷積計算,得出B覆寫區域的像素點最小值,并用這個最小值來替代參考點的像素值。如圖所示,将左邊的原始圖像A腐蝕處理為右邊的效果圖A-B。
處理結果如下圖所示:
äº.Â
圖像腐蝕代碼實作 1.基礎理論形态學轉換主要針對的是二值圖像(0或1)。圖像腐蝕類似于“領域被蠶食”,将圖像中的高亮區域或白色部分進行縮減細化,其運作結果圖比原圖的高亮區域更小。其主要包括兩個輸入對象:
(1)二值圖像
(2)卷積核
卷積核是腐蝕中的關鍵數組,采用numpy庫可以生成。卷積核的中心點逐個像素掃描原始圖像,如下圖所示:
被掃描到的原始圖像中的像素點,隻有當卷積核對應的元素值均為1時,其值才為1,否則其值修改為0。換句話說,周遊到的黃色點位置,其周圍全部是白色,保留白色,否則變為黑色,圖像腐蝕變小。
圖像腐蝕主要使用的函數為erode,其原型如下:
dst = cv2.erode(src, kernel, iterations)
參數dst表示處理的結果,src表示原圖像,kernel表示卷積核,iterations表示疊代次數。下圖表示5*5的卷積核,可以采用函數 np.ones((5,5), np.uint8) 建構。
注意:疊代次數預設是1,表示進行一次腐蝕,也可以根據需要進行多次疊代,進行多次腐蝕。
3.代碼實作完整代碼如下所示:
輸出結果如下圖所示:
由圖可見,幹擾的細線被進行了清洗,但仍然有些輪廓,此時可設定疊代次數進行腐蝕。
erosion = cv2.erode(src, kernel,iterations=9)
圖像膨脹是腐蝕操作的逆操作,類似于“領域擴張”,将圖像中的高亮區域或白色部分進行擴張,其運作結果圖比原圖的高亮區域更大,線條變粗了,主要用于去噪。
(1) 圖像被腐蝕後,去除了噪聲,但是會壓縮圖像。
(2) 對腐蝕過的圖像,進行膨脹處理,可以去除噪聲,并且保持原有形狀。
它也包括兩個輸入對象:
(1)二值圖像或原始圖像
被掃描到的原始圖像中的像素點,當卷積核對應的元素值隻要有一個為1時,其值就為1,否則為0。
圖像膨脹主要使用的函數為dilate,其原型如下:
dst = cv2.dilate(src, kernel, iterations)
注意:疊代次數預設是1,表示進行一次膨脹,也可以根據需要進行多次疊代,進行多次膨脹。通常進行1次膨脹即可。
輸出結果如下所示:
圖像去噪通常需要先腐蝕後膨脹,這又稱為開運算,下篇文章将詳細介紹。如下圖所示:
erosion = cv2.erode(src, kernel)
result = cv2.dilate(erosion, kernel)