自學python-opencv(8)膨脹與腐蝕
阿新 • • 發佈:2020-10-07
dilate()
函式可以對輸入影象用特定結構元素進行膨脹操作,該結構元素確定膨脹操作過程中的鄰域的形狀,各點畫素值將被替換為對應鄰域上的最大值:
跟卷積操作類似,假設有影象A和結構元素B,結構元素B在A上面移動,其中B定義其中心為錨點,計算B覆蓋下A的最大畫素值用來替換錨點的畫素,其中B作為結構體可以是任意形狀。我們回憶一下中值平滑操作——取每一個位置的矩形領域內值的中值作為該位置的輸出灰度值,影象的膨脹操作與中值平滑操作類似,它是取每一個位置的矩形領域內值的最大值作為該位置的輸出灰度值。不同的是,這裡的領域不再單純是矩形結構的,也可以是橢圓形結構的、十字交叉形結構的等,其中紅色是參考點,也稱為錨點(anchor point),如下所示:
最大值替換中心畫素
腐蝕操作與膨脹操作類似,只是它取結構元所指定的領域內值的最小值作為該位置的輸出灰度值。因為取每個位置領域內最小值,所以腐蝕後輸出影象的總體亮度的平均值比起原圖會有所降低,影象中比較亮的區域的面積會變小甚至消失,而較暗物體的尺寸會擴大,即最小值替換中心畫素。
動畫顯示:https://www.bilibili.com/video/BV1sK4y187jA/?spm_id_from=333.788.b_7265636f5f6c697374.4
----------------------------------------------------
import cv2
import numpy
def erode_demo(image):
#圖片通道
print(image.shape)
#灰度圖片
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#閾值
ret,binary=cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)
cv2.imshow("binary_demo", binary)
# 對於錨點的位置
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
#腐蝕
dst=cv2.erode(binary,kernel)
#cv2.imshow("gray_demo", gray)
cv2.imshow("erode_demo",dst)
def dilate_demo(image):
#圖片通道
print(image.shape)
#灰度圖片
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#閾值INV是取反
ret,binary=cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)
cv2.imshow("binary_demo", binary)
# 對於錨點的位置
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
#膨脹
dst=cv2.dilate(binary,kernel)
#cv2.imshow("gray_demo", gray)
cv2.imshow("dilate_demo",dst)
print("-----------hi python-------------")
img=cv2.imread("./images/timg.bmp")
cv2.namedWindow("imput images",cv2.WINDOW_AUTOSIZE)
cv2.imshow("imput images",img)
#dilate_demo(img)
# 卷積核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
# 膨脹 後顯示的膨脹畫素
dst = cv2.dilate(img, kernel)
cv2.imshow("img",dst)
cv2.waitKey()
cv2.destroyWindow('all')
------------------------------
cv2.getStructuringElement
這個函式的第一個引數表示核心的形狀,有三種形狀可以選擇。
矩形:MORPH_RECT;
交叉形:MORPH_CROSS;
橢圓形:MORPH_ELLIPSE;
第二和第三個引數分別是核心的尺寸以及錨點的位置。一般在呼叫erode以及dilate函式之前,先定義一個Mat型別的變數來獲得
getStructuringElement函式的返回值: 對於錨點的位置,有預設值Point(-1,-1),表示錨點位於中心點。element形狀唯一依賴錨點位置,其他情況下,錨點只是影響了形態學運算結果的偏移。
--------------------------------------