通過閾值分割可以得到二值圖,但往往會出現圖像中物體形態不完整,變的殘缺,或者有很多噪聲點。可以通過形態學處理,使其變得豐滿,或者去除掉多餘的像素。常用的形態學處理算法包括:腐蝕,膨脹,開運算,閉運算,形態學梯度,頂帽運算和底帽運算。
0. 結構元素
opencv中可用的結構元素有三種:矩陣,橢圓形,十字架
kernel = cv2.getStructuringElement(shape,ksize,anchor)
shape:核的形狀
cv2.MORPH_RECT: 矩形
cv2.MORPH_CROSS: 十字形(以矩形的錨點爲中心的十字架)
cv2.MORPH_ELLIPSE:橢圓(矩形的內切橢圓)
ksize: 核的大小,格式爲(width,height)
anchor: 核的錨點,默認值爲(-1,-1),即核的中心點
注:也可以使用numpy.ndarray來自定義自己想要的各種結構元素
1. 腐蝕
- 作用:減小前景(白色)面積
- 原理:取結構元素當前位置中像素值的最小值代替錨點位置的像素值,這樣就會使圖像中較暗的區域面積增大,較亮的的區域面積減小。如果是一張黑底,白色前景的二值圖,就會使白色的前景物體顏色變小,就像被腐蝕了一樣。
- 代碼
dst = cv2.erode(src,kernel,anchor,iterations,borderType,borderValue):
參數:
src: 輸入圖像對象矩陣,爲二值化圖像
kernel:進行腐蝕操作的核,可以通過函數getStructuringElement()獲得
anchor:錨點,默認爲(-1,-1)
iterations:腐蝕操作的次數,默認爲1
borderType: 邊界種類,有默認值
borderValue:邊界值,有默認值
2. 膨脹
- 作用:增加前景面積
- 原理:取結構元素當前位置中像素值的最大值代替錨點位置的像素值
- 代碼
dst = cv2.dilate(src,kernel,anchor,iterations,borderType,borderValue)
參數:
src: 輸入圖像對象矩陣,爲二值化圖像
kernel:進行腐蝕操作的核,可以通過函數getStructuringElement()獲得
anchor:錨點,默認爲(-1,-1)
iterations:腐蝕操作的次數,默認爲1
borderType: 邊界種類
borderValue:邊界值
3. 開運算
- 作用:主要用於去除圖像上的噪音斑點,毛刺和小橋,而總的位置和形狀不便
- 原理:先腐蝕,後膨脹
- 代碼
dst = cv2.morphologyEx(src,op,kernel,anchor,iterations,borderType,borderValue)
參數:
src: 輸入圖像對象矩陣,爲二值化圖像
op: 形態學操作類型
cv2.MORPH_OPEN 開運算
cv2.MORPH_CLOSE 閉運算
cv2.MORPH_GRADIENT 形態梯度
cv2.MORPH_TOPHAT 頂帽運算
cv2.MORPH_BLACKHAT 底帽運算
kernel: 結構元素
anchor:錨點,默認爲(-1,-1)
iterations:腐蝕操作的次數,默認爲1
borderType: 邊界種類
borderValue:邊界值
4. 閉運算
- 作用:主要用來連接被誤分爲許多小塊的前景對象,能夠填平小孔,彌合小裂縫,而總的位置和形狀不變。
- 原理:先膨脹,後腐蝕
5. 形態學梯度
- 原理:膨脹運算結果 減去 腐蝕運算結果
- 作用:獲取輪廓信息
6. 頂帽運算
- 原理:原圖像 減去 開運算
7. 底帽運算
- 原理:原圖 減去 閉運算