數字圖像處理(12): 形態學處理——圖像腐蝕與圖像膨脹

目錄

1 形態學操作

2 圖像腐蝕

3 圖像膨脹

參考資料


1 形態學操作

形態學morphology)一詞通常表示生物學的一個分支,該分支主要研究動植物的形態和結構。這裏,我們使用同一詞語表示數學形態學的內容,將數學形態學作爲工具從圖像中提取表達和描繪區域形狀的有用圖像分量,如邊界、骨架和凸殼等。

形態學處理主要針對的是二值圖像(0或1)。

形態學通常使用圖像腐蝕圖像膨脹兩個操作,這些操作是形態學處理的基礎。


2 圖像腐蝕

作爲{{Z}^{2}}中的集合AB,表示爲A\ominus BBA的腐蝕定義爲:

                                                                              A\ominus B=\left\{ z\left| {{(B)}_{z}}\subseteq A \right. \right\}

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

 

圖像腐蝕的效果如下圖所示:

 

圖像腐蝕類似於“鄰域被蠶食”,將圖像中的高亮區域或白色部分進行縮減細化,其運行結果圖比原圖的高亮區域更小。其主要包括兩個輸入對象:

(1) 二值圖像

(2 )卷積核

 

卷積核是腐蝕中的關鍵數組,採用numpy庫可以生成。卷積核的中心點逐個像素掃描原始圖像,腐蝕的過程如下圖所示:

被掃描到的原始圖像中的像素點,只有當卷積覈對應的元素值均爲1時,其值才爲1,否則其值修改爲0。換句話說,遍歷到的黃色點位置,其周圍全部是白色,保留白色,否則變爲黑色,圖像腐蝕變小。如下圖所示:

 

圖像腐蝕主要使用的函數爲 erode(),其函數形式如下:

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

其中,參數:

dst 表示處理的結果;

src 表示原圖像;

kernel 表示卷積核;

iterations 表示迭代次數。

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

例如:下圖表示5\times5的卷積核,可以採用函數 np.ones((5,5), np.uint8) 構建。

 

(1)卷積核大小爲5\times5 ,迭代次數爲1

代碼如下所示:

#encoding:utf-8
import cv2
import numpy as np

#讀取圖片
src = cv2.imread('test1.bmp', cv2.IMREAD_UNCHANGED)

#設置卷積核
kernel = np.ones((5,5), np.uint8)

#圖像腐蝕處理
erosion = cv2.erode(src, kernel)

#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", erosion)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

運行結果如下圖所示:

 

 

(2)卷積核大小爲5\times5,迭代次數爲9

代碼如下所示:

#encoding:utf-8
import cv2
import numpy as np

#讀取圖片
src = cv2.imread('test1.bmp', cv2.IMREAD_UNCHANGED)

#設置卷積核
kernel = np.ones((5,5), np.uint8)

#圖像腐蝕處理
erosion = cv2.erode(src, kernel,iterations=10)

#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", erosion)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

運行結果如下圖所示:

 

(2)卷積核大小爲39\times39,迭代次數爲1

代碼如下所示:

#encoding:utf-8
import cv2
import numpy as np

#讀取圖片
src = cv2.imread('test1.bmp', cv2.IMREAD_UNCHANGED)

#設置卷積核
kernel = np.ones((39,39), np.uint8)

#圖像腐蝕處理
erosion = cv2.erode(src, kernel)

#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", erosion)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

運行結果如下圖所示:

 


3 圖像膨脹

作爲{{Z}^{2}}中的集合AB,表示爲A\oplus BBA膨脹定義爲:

                                                                        A\oplus B=\left\{ z\left| {{(\widehat{B})}_{z}}\bigcap{A\ne \varnothing } \right. \right\}

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

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

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

它也包括兩個輸入對象:

(1)二值圖像或原始圖像

(2)卷積核

圖像膨脹的效果如下圖所示:

 

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

 

 

被掃描到的原始圖像中的像素點,當卷積覈對應的元素值只要有一個爲1時,其值就爲1,否則爲0

 

圖像膨脹主要使用的函數爲 dilate(),其原型如下:

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

其中,參數:

dst 表示處理的結果;

src 表示原始圖像;

kernel 表示卷積核;

iterations 表示迭代次數。

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

例如,下圖表示5\times5的卷積核,可以採用函數 np.ones((5,5), np.uint8) 構建。

 

(1)卷積核大小爲3\times3 ,迭代次數爲1

代碼如下所示:

#encoding:utf-8
import cv2
import numpy as np

#讀取圖片
src = cv2.imread('test2.bmp', cv2.IMREAD_UNCHANGED)

#設置卷積核
kernel = np.ones((3,3), np.uint8)

#圖像膨脹處理
erosion = cv2.dilate(src, kernel)

#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", erosion)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

運行結果如下圖所示:

 

(1)卷積核大小爲5\times5 ,迭代次數爲1

代碼如下所示:

#encoding:utf-8
import cv2
import numpy as np

#讀取圖片
src = cv2.imread('test2.bmp', cv2.IMREAD_UNCHANGED)

#設置卷積核
kernel = np.ones((5,5), np.uint8)

#圖像膨脹處理
erosion = cv2.dilate(src, kernel)

#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", erosion)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

運行結果如下圖所示:

 


 

參考資料

[1] https://blog.csdn.net/Eastmount/article/details/83581277

[2] Python+OpenCV圖像處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章