9、形態學操作: 腐蝕、膨脹、開運算、閉運算、頂帽、黑帽
利用一種特殊的結構(卷積核)來測量或提取輸入圖像中對應的形狀或特征以便進一步圖像分析和識別,基本都是對二進制圖像進行處理。
基本操作:膨脹和腐蝕,開運算、閉運算、頂帽、黑帽
腐蝕操作 ,用卷積核掃描圖像,一般都為1,如果圖像內卷積核范圍內全是白的(255),那255保留,如果卷積核范圍內有黑的(0),那么該范圍都變為黑的(0)。
膨脹操作 ,與腐蝕操作相反,只要保證卷積核的錨點是非0值(255),周邊無論是0還是非0,都變成非0值(255)。
開運算 :腐蝕+膨脹,去除外部噪聲,去除白點。
閉運算 :膨脹+腐蝕,去除內部噪聲,去除黑點。
頂帽操作 :原圖-開運算,得到外部去掉的噪聲。
因為開運算帶來的結果是放大了裂縫或者局部低亮度的區域,因此,從原圖中減去開運算后的圖,得到的效果圖突出了比原圖輪廓周圍的區域更明亮的區域,且這一操作和選擇的核的大小相關。
頂帽運算往往用來分離比鄰近點亮一些的斑塊。當一幅圖像具有大幅的背景的時候,而微小物品比較有規律的情況下,可以使用頂帽運算進行背景提取。
黑帽操作 :原圖-閉運算,得到內部去掉的噪聲。
黑帽運算后的效果圖突出了比原圖輪廓周圍的區域更暗的區域,且這一操作和選擇的核的大小相關。
所以,黑帽運算用來分離比鄰近點暗一些的斑塊??梢缘玫捷喞Ч麍D。
形態學梯度 :圖像膨脹與腐蝕的差別。結果看上去就像前景物體的輪廓。
基本梯度 :膨脹后圖像減去腐蝕后圖像得到的差值圖像。
內部梯度 :用原圖減去腐蝕圖像得到的差值圖像。
外部梯度 :膨脹后圖像減去原圖像得到的差值圖像。
morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst
src:輸入圖像
op:操作類型
MORTH_OPEN:函數做開運算
MORTH_CLOSE:函數做閉運算
MORTH_GRADIENT:函數做形態學梯度運算
MORTH_TOPHAT:函數做頂帽運算
MORTH_BLACKHAT:函數做黑帽運算
MORTH_DILATE :函數做膨脹運算
MORTH_ERODE:函數做腐蝕運算
kernel :內核類型,用getStructuringElement函數得到
def Morphology():
# morphology 形態學
# 利用一種特殊的結構(卷積核)來測量或提取輸入圖像中對應的形狀或特征
# 以便進一步圖像分析和識別,基本都是對二進制圖像進行處理
# 基本操作:膨脹和腐蝕,開運算、閉運算、頂帽、黑帽
# 圖像全局二值化,將每個像素轉換為兩種值(0,255)
img = cv2.imread('./images/bank.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 返回兩個值,閾值和處理后的圖片,大于thresh(127)全是白的255
# THRESH_BINARY 二進制閾值化 -> 大于閾值為1,小于閾值為0
# THRESH_BINARY_INV 反二進制閾值化 -> 大于閾值為0,小于閾值為1
# THRESH_TRUNC 截斷閾值化 -> 大于閾值為閾值,小于閾值不變
# THRESH_TOZERO 閾值化為0 -> 大于閾值的不變,小于閾值的全為0
# THRESH_TOZERO_INV 反閾值化為0 -> 大于閾值為0,小于閾值不變
# thresh,img_bw = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
# 自適應閾值二值化 閾值是根據圖像上的每一個小區域計算與其對應的閾值。
# ADAPTIVE_THRESH_MEAN_C(通過平均的方法取得平均值)———閾值取自相鄰區域的平均值)
# ADAPTIVE_THRESH_GAUSSIAN_C(通過高斯取得高斯值)———閾值取自相鄰區域的加權和
# blockSize Int類型的,這個值來決定像素的鄰域塊有多大。
# C:偏移值調整量,計算adaptiveMethod用到的參數。
img_bw = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,0)
# 獲取形態學卷積核
# cv2.MORPH_ELLIPSE 橢圓,cv2.MORPH_RECT 矩形,cv2.MORPH_CROSS 十字架
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(7,7))
# kernel = np.ones((3, 3), np.uint8)
# 腐蝕操作,用卷積核掃描圖像,一般都為1,如果圖像內卷積核范圍內全是白的,那掃后為白的
# iterations 為迭代次數
img_erode = cv2.erode(img_bw,kernel,iterations=2)
# 膨脹操作,與腐蝕操作相反,只要保證卷積核的錨點是非0值(白的),周邊無論是0還是非0,都變成非0值
img_dilate = cv2.dilate(img_bw,kernel)
# 開運算:腐蝕?膨脹,去除外部噪聲,去除白點
# 閉運算:膨脹?腐蝕,去除內部噪聲,去除黑點
open_operate = cv2.morphologyEx(img_bw,cv2.MORPH_OPEN,kernel,iterations=2)
close_operate = cv2.morphologyEx(img_bw,cv2.MORPH_CLOSE,kernel,iterations=2)
# 形態學的梯度,:原圖-腐蝕,得到腐蝕掉的部分,即邊
img_grad = cv2.morphologyEx(img_bw,cv2.MORPH_GRADIENT,kernel)
# 頂帽操作:原圖-開運算,得到外部去掉的噪聲
img_tophat = cv2.morphologyEx(gray,cv2.MORPH_TOPHAT,kernel)
# 黑帽操作:原圖-閉運算,得到內部去掉的噪聲
img_blackhat = cv2.morphologyEx(gray,cv2.MORPH_BLACKHAT,kernel)
cv2.imshow("imshow",img_tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()
運行結果
原圖&二值化
腐蝕&膨脹
開運算&閉運算
-
matlab
+關注
關注
185文章
2979瀏覽量
230662 -
圖像處理
+關注
關注
27文章
1295瀏覽量
56807 -
計算機視覺
+關注
關注
8文章
1698瀏覽量
46033 -
OpenCV
+關注
關注
31文章
635瀏覽量
41393
發布評論請先 登錄
相關推薦
評論