opencv 腐蝕與膨脹(形態學變換)

 形態變換是一些基於圖像形狀的簡單操作。通常在二進制圖像上執行。它需要兩個輸入,一個是我們的原始圖像,第二個是決定操作性質的結構元素或內核。兩種基本的形態學算子是侵蝕和膨脹。然後,它的變體形式(如“打開”,“關閉”,“漸變”等)也開始起作用

二值形態學

一、腐蝕

  對圖像的邊緣進行侵蝕,原始圖像中的一個像素(無論是1還是0)只有當內核下的所有像素都是1時才被認爲是1,否則它就會被侵蝕(變成0)
  這種方法是對物體邊緣向內部收縮,並消除一些離羣噪點

#kernel爲卷積核
erosion = cv.erode(img,kernel,iterations = 1)

二、擴張

  它與侵蝕正好相反,對圖片的邊緣。如果內核下的至少一個像素爲“ 1”,則像素元素爲“ 1”。因此,它會增加圖像中的白色區域或增加前景對象的大小。通常,在消除噪音的情況下,腐蝕後會膨脹。因爲腐蝕會消除白噪聲,但也會縮小物體
  這種方法是對物體邊緣向外擴張,並連接一些距離較近的離羣點

dilation = cv.dilate(img,kernel,iterations = 1) 

三、開啓

  對圖像先進行腐蝕操作,再進行擴張操作,它對於消除噪音很有用

opening = cv.morphologyEx(img, cv.MORPH_OPEN, kernel) 

四、關閉

  對圖像先進行擴張操作,在進行腐蝕操作,在關閉前景對象內部的小孔或對象上的小黑點時很有用。

closing = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel) 

對如下圖進行操作:在這裏插入圖片描述

import cv2
import numpy as np
img = cv2.imread(r'123.png',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)
dilation = cv2.dilate(img,kernel,iterations = 1)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) #這裏也可以對dilation進行erode運算
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) #同理可對erode進行dilation運算
展示效果:
cv2.imshow("img",erosion )
cv2.waitKey()
cv2.imshow("img",dilation )
cv2.waitKey()
cv2.imshow("img",opening )
cv2.waitKey()
cv2.imshow("img",closing )
cv2.waitKey()
腐蝕

在這裏插入圖片描述

擴張

在這裏插入圖片描述

開啓

在這裏插入圖片描述

關閉

在這裏插入圖片描述
五. 形態學梯度

  梯度用於刻畫目標邊界或邊緣位於圖像灰度級劇烈變化的區域,形態學梯度根據膨脹或者腐蝕與原圖作差組合來實現增強結構元素領域中像素的強度,突出高亮區域的外圍。計算圖像的形態學梯度是形態學重要操作,常常將膨脹和腐蝕基礎操作組合起來一起使用實現一些複雜的圖像形態學梯度

計算的梯度常見如下四種:

  • 基本梯度
    ————基本梯度是用膨脹後的圖像減去腐蝕後的圖像得到差值圖像,稱爲梯度圖像也是OpenCV中支持的計算形態學梯度的方法,而此方法得到梯度有被稱爲基本梯度。
  • 內部梯度
    ————是用原圖像減去腐蝕之後的圖像得到差值圖像,稱爲圖像的內部梯度。
  • 外部梯度
    ————是用圖像膨脹之後再減去原來的圖像得到的差值圖像,稱爲圖像的外部梯度。
  • 方向梯度
    ————方向梯度是使用X方向與Y方向的直線作爲結構元素之後得到圖像梯度,用X方向直線做結構元素分別膨脹與腐蝕之後得到圖像求差值之後稱爲X方向梯度,用Y方向直線做結構元素分別膨脹與腐蝕之後得到圖像求差值之後稱爲Y方向梯度。

以下爲基本梯度的使用方式

gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
cv2.imshow("img",gradient )
cv2.waitKey()

在這裏插入圖片描述
六、 頂帽

  它是輸入圖像和圖像開運算之差

kernel = np.ones((5,5),np.uint8)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) 

在這裏插入圖片描述
七、黑帽

  這是輸入圖像和圖像閉運算之差

blackhat = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel) 

在這裏插入圖片描述
八、不同形狀的卷積核
  我們上面使用的卷積核均爲正方形的卷積核,我們也可能需要圓形,橢圓等其他卷積核,我們可以通過numpy來實現我們需要的卷積核。當然也可以使用OpenCV自帶的卷積核生成器cv.getStructuringElement(),不過由於使用需要記住這些名字,我還是推薦大家手動使用numpy實現

# 矩形內核
>>> cv.getStructuringElement(cv.MORPH_RECT,(5,5))
array([[1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1]], dtype=uint8)
# 橢圓內核
>>> cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
array([[0, 0, 1, 0, 0],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [0, 0, 1, 0, 0]], dtype=uint8)
# 十字內核
>>> cv.getStructuringElement(cv.MORPH_CROSS,(5,5))
array([[0, 0, 1, 0, 0],
       [0, 0, 1, 0, 0],
       [1, 1, 1, 1, 1],
       [0, 0, 1, 0, 0],
       [0, 0, 1, 0, 0]], dtype=uint8)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章