1. 程式人生 > >Python影象處理:影象腐蝕與影象膨脹!

Python影象處理:影象腐蝕與影象膨脹!

本篇文章主要講解Python呼叫OpenCV實現影象腐蝕和影象膨脹的演算法,基礎性知識希望對您有所幫助。

1.基礎理論

2.影象腐蝕程式碼實現

3.影象膨脹程式碼實現

一. 基礎知識

(注:該部分參考作者論文《一種改進的Sobel運算元及區域擇優的身份證智慧識別方法》)

影象的膨脹(Dilation)和腐蝕(Erosion)是兩種基本的形態學運算,主要用來尋找影象中的極大區域和極小區域。其中膨脹類似於“領域擴張”,將影象中的高亮區域或白色部分進行擴張,其執行結果圖比原圖的高亮區域更大;腐蝕類似於“領域被蠶食”,將影象中的高亮區域或白色部分進行縮減細化,其執行結果圖比原圖的高亮區域更小。

1.影象膨脹

膨脹的運算子是“⊕”,其定義如下:

 

Python影象處理:影象腐蝕與影象膨脹!

 

 

該公式表示用B來對影象A進行膨脹處理,其中B是一個卷積模板或卷積核,其形狀可以為正方形或圓形,通過模板B與影象A進行卷積計算,掃描影象中的每一個畫素點,用模板元素與二值影象元素做“與”運算,如果都為0,那麼目標畫素點為0,否則為1。從而計算B覆蓋區域的畫素點最大值,並用該值替換參考點的畫素值實現膨脹。下圖是將左邊的原始影象A膨脹處理為右邊的效果圖A⊕B。

進群:548377875  即可獲取大禮包一整套哦!

Python影象處理:影象腐蝕與影象膨脹!

 

 

2.影象腐蝕

腐蝕的運算子是“-”,其定義如下:

 

Python影象處理:影象腐蝕與影象膨脹!

 

 

該公式表示影象A用卷積模板B來進行腐蝕處理,通過模板B與影象A進行卷積計算,得出B覆蓋區域的畫素點最小值,並用這個最小值來替代參考點的畫素值。如圖所示,將左邊的原始影象A腐蝕處理為右邊的效果圖A-B。

 

Python影象處理:影象腐蝕與影象膨脹!

 

 

處理結果如下圖所示:

 

Python影象處理:影象腐蝕與影象膨脹!

 

 

二. 影象腐蝕程式碼實現

1.基礎理論

形態學轉換主要針對的是二值影象(0或1)。影象腐蝕類似於“領域被蠶食”,將影象中的高亮區域或白色部分進行縮減細化,其執行結果圖比原圖的高亮區域更小。其主要包括兩個輸入物件:

(1)二值影象

(2)卷積核

卷積核是腐蝕中的關鍵陣列,採用numpy庫可以生成。卷積核的中心點逐個畫素掃描原始影象,如下圖所示:

 

Python影象處理:影象腐蝕與影象膨脹!

 

 

被掃描到的原始影象中的畫素點,只有當卷積核對應的元素值均為1時,其值才為1,否則其值修改為0。換句話說,遍歷到的黃色點位置,其周圍全部是白色,保留白色,否則變為黑色,影象腐蝕變小。

 

Python影象處理:影象腐蝕與影象膨脹!

 

 

2.函式原型

影象腐蝕主要使用的函式為erode,其原型如下:

dst = cv2.erode(src, kernel, iterations)

引數dst表示處理的結果,src表示原影象,kernel表示卷積核,iterations表示迭代次數。下圖表示5*5的卷積核,可以採用函式 np.ones((5,5), np.uint8) 構建。

 

Python影象處理:影象腐蝕與影象膨脹!

 

 

注意:迭代次數預設是1,表示進行一次腐蝕,也可以根據需要進行多次迭代,進行多次腐蝕。

3.程式碼實現

完整程式碼如下所示:

 

Python影象處理:影象腐蝕與影象膨脹!

 

 

輸出結果如下圖所示:

 

Python影象處理:影象腐蝕與影象膨脹!

 

 

由圖可見,干擾的細線被進行了清洗,但仍然有些輪廓,此時可設定迭代次數進行腐蝕。

erosion = cv2.erode(src, kernel,iterations=9)

輸出結果如下圖所示:

 

Python影象處理:影象腐蝕與影象膨脹!

 

 

三. 影象膨脹程式碼實現

1.基礎理論

影象膨脹是腐蝕操作的逆操作,類似於“領域擴張”,將影象中的高亮區域或白色部分進行擴張,其執行結果圖比原圖的高亮區域更大,線條變粗了,主要用於去噪。

(1) 影象被腐蝕後,去除了噪聲,但是會壓縮影象。

(2) 對腐蝕過的影象,進行膨脹處理,可以去除噪聲,並且保持原有形狀。

 

Python影象處理:影象腐蝕與影象膨脹!

 

 

它也包括兩個輸入物件:

(1)二值影象或原始影象

(2)卷積核

卷積核是腐蝕中的關鍵陣列,採用numpy庫可以生成。卷積核的中心點逐個畫素掃描原始影象,如下圖所示:

 

Python影象處理:影象腐蝕與影象膨脹!

 

 

被掃描到的原始影象中的畫素點,當卷積核對應的元素值只要有一個為1時,其值就為1,否則為0。

2.函式原型

影象膨脹主要使用的函式為dilate,其原型如下:

dst = cv2.dilate(src, kernel, iterations)

引數dst表示處理的結果,src表示原影象,kernel表示卷積核,iterations表示迭代次數。下圖表示5*5的卷積核,可以採用函式 np.ones((5,5), np.uint8) 構建。

 

Python影象處理:影象腐蝕與影象膨脹!

 

 

注意:迭代次數預設是1,表示進行一次膨脹,也可以根據需要進行多次迭代,進行多次膨脹。通常進行1次膨脹即可。

3.程式碼實現

完整程式碼如下所示:

 

Python影象處理:影象腐蝕與影象膨脹!

 

 

輸出結果如下所示:

 

Python影象處理:影象腐蝕與影象膨脹!

 

 

影象去噪通常需要先腐蝕後膨脹,這又稱為開運算,下篇文章將詳細介紹。如下圖所示:

erosion = cv2.erode(src, kernel)

result = cv2.dilate(erosion, kernel)

 

Python影象處理:影象腐蝕與影象膨脹!