cv2.getStructuringElement()函數及開、閉、腐蝕、膨脹原理講解

cv2.getStructuringElement()函數的作用是返回一個結構元素(卷積核),具體解析如下:

kernel = cv2.getStructuringElement(a,b,c): # 得到一個結構元素(卷積核)。主要用於後續的腐蝕、膨脹、開、閉等運算。
因為這些運算都是依賴於卷積核的,不同的卷積核(形狀、大小)對圖形的腐蝕、膨脹操作效果不一樣

輸入參數:
         a設定卷積核的形狀、b設定卷積核的大小、c表示描點的位置,一般 c = 1,表示描點位於中心。(下文細說)
返回值:
         返回指定形狀和尺寸的結構元素(一般是返回一個矩形)、也就是腐蝕/膨脹用的核的大小。(下文細說)

a取不同的參數會導致卷積核有不同的形狀,a參數有三個:

①:MORPH_RECT(函數返回矩形卷積核)

②:MORPH_CROSS(函數返回十字形卷積核)

③:MORPH_ELLIPSE(函數返回橢圓形卷積核)

b:用一個(x,y)的形式表示,表示卷積核有x行,y列。

腐蝕操作

①:腐蝕操作的對象是二值化圖像,二值圖像前景物體為1,背景為0,卷積核也是隻含有0和1。

②:比如這是圖像A和一個卷積核(結構元素):

(註意A的像素點(方格)不是0就是1。B的描點(中心點)就是我們通過getStructuringElement函數中的參數c來確定的,也可以設立在其他地方)

腐蝕的步驟就是用卷積核B的描點(此處就是中心點),來對齊A中的每一個小方格,然後選取卷積核B的方格中的數據的最小值,意思就是當B的描點對齊A的邊界方格的時候,那麼B的其他四個方格可能位於A圖像中的0像素點,那麼最小值就是0,那麼就把卷積核B的描點對應的A中的小方格設為0,這就導致使用腐蝕操作後,我我們能看到的白色區域減少的原因。

kernel = cv2.getStructuringElement(a,b,c)
cv2.erode(img, kernel, iteration = 1)# 腐蝕操作

膨脹操作

原理與腐蝕操作一樣,隻不過是取最大像素值,其他地方沒差別。

kernel = cv2.getStructuringElement(a,b,c)
cv2.dilate(img, kernel, iteration = 1)# 膨脹操作

開、閉

開:先進行腐蝕運算,再進行膨脹運算。

閉:先進行膨脹運算,再進行腐蝕運算。

kernel = cv2.getStructuringElement(a,b,c)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN,kernel) # 開運算
opening = cv2.morphologyEx(ima,cv2.MORPH_CLOSE,lernel) # 閉運算

開運算和閉運算都是處理噪點用的:

開:消去一個黑圖中的很多小白點

閉:小區一個白圖中的很多小黑點 如:

原圖:

開運算:

閉運算:

總結

到此這篇關於cv2.getStructuringElement()函數及開、閉、腐蝕、膨脹原理講解的文章就介紹到這瞭,更多相關cv2.getStructuringElement()函數內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: