【opencv】(4) 形态学处理:腐蚀膨胀、梯度运算、礼帽黑帽
各位同學好,今天和大家分享一下圖像的形態學處理方法。內容有:
膨脹腐蝕、開運算和閉運算、梯度運算、禮帽和黑帽
(1)腐蝕:cv2.erode();(2)膨脹:cv2.dilate();(3)形態學函數:cv2.morphologyEx();
那我們開始吧。
我們先導入接下來操作需要的庫文件和圖像數據
import cv2
import numpy as np
# 指定圖片所在文件夾
filepath = 'C:\\...\\img\\changed'
# 獲取文件夾中的某張圖
img = cv2.imread(filepath+'\\wiseman.jpg')
# 顯示圖片
cv2.imshow('wiseman',img)
cv2.waitKey(0) # 設置圖片不會自動消失
cv2.destroyAllWindows() # 任意鍵關閉圖像
1. 腐蝕操作
腐蝕操作,一般處理二值化圖像,黑白圖像,白色區域減少。簡單理解為,卷積核在圖像上移動的過程中,如果卷積核所框住的部分全為黑或全為白,圖像不變;如果既有黑又有白,那么按一定策略將白變黑。
腐蝕函數:?cv2.erode(img, kernel, iterations)
img為輸入的圖像。kernel為卷積核大小,卷積核越小,腐蝕越慢,需要的迭代次數越多。
iterations為迭代次數。iterations=2,表示在完成第一次腐蝕的結果圖像上再進行腐蝕。
# 5*5的全1卷積核;uint8是專門用于存儲各種圖像的(包括RGB,灰度圖像等),范圍是從0–255
kernel = np.ones((5,5),np.uint8)
# 參數為:輸入圖像,卷積核,迭代次數=1
img2 = cv2.erode(img, kernel, iterations=1)
# 顯示圖片
cv2.imshow('wiseman2',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
下圖左側為原圖,右圖為腐蝕后的圖
? ? ? ? ? ??
2. 膨脹操作?
膨脹操作,一般處理二值化圖像,白色區域增大。和腐蝕相反,卷積核在圖像上移動的過程中,如果既有黑又有白,那么按一定策略將黑變白。
腐蝕函數:?cv2.dilate(img, kernel, iterations)
參數同上,img為輸入的圖像。kernel為卷積核大小。iterations為迭代次數。
#(2)膨脹操作
# 設置卷積核3*3全1
kernel = np.ones((3,3),np.uint8)
# 傳入圖像,卷積核,迭代次數
img3 = cv2.dilate(img, kernel, iterations=1)
# 顯示圖片
cv2.imshow('wiseman3',img3)
cv2.waitKey(0)
cv2.destroyAllWindows()
下圖左側為原圖,右圖為膨脹后的圖
? ? ? ? ??
3. 形態學函數
cv2.morphologyEx(img, op, kernel)
img代表輸入圖像;kernel代表卷積核;op代表形態學處理參數,如下
MORPH_ERODE: 腐蝕(黑變多),與腐蝕函數cv2.erode效果相同
MORPH_DILATE: 膨脹(白變多),與膨脹函數cv2.dilate效果相同
MORPH_OPEN: 開運算,先腐蝕后膨脹。平滑邊界,去除凸起,移除小白點
MORPH_CLOSE: 閉運算,先膨脹再腐蝕。填充圖像內部小黑洞,填充圖像凹陷
MORPH_GRADIENT: 梯度計算,用膨脹圖減腐蝕圖。獲得圖像的邊緣輪廓
MORPH_TOPHAT: 禮帽,用原圖像減去開運算后的圖像。獲得原圖像中比周圍亮的區域
MORPH_BLACKHAT: 黑帽,閉運算圖像減去原圖像。獲取原圖像中比周圍暗的區域
4. 開運算
先腐蝕后膨脹,白色區域先變小后擴張,平滑邊界(去掉凸起)、移除白點
cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
#(3)開運算:先腐蝕后膨脹
# 定義卷積核
kernel = np.ones((3,3),np.uint8)
# 形態學函數:圖像,開運算,卷積核
img4 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
# 顯示圖片
cv2.imshow('opening',img4)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果圖在下面。
5. 閉運算
先膨脹后腐蝕,白色區域先變大后縮小,閉運算用于填充圖像內部的小黑洞、填充圖像的凹陷等,排除小黑洞,連接被誤分為許多小塊的對象
#(4)閉運算:先膨脹后腐蝕
# 定義卷積核
kernel = np.ones((3,3),np.uint8)
# 形態學函數:圖像,閉運算,卷積核
img4 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
# 顯示圖片
cv2.imshow('closing',img4)
cv2.waitKey(0)
cv2.destroyAllWindows()
第一張為原圖,第二張為開運算,第三張為閉運算
6. 梯度計算
梯度圖,用膨脹圖減腐蝕圖。可以用于獲得圖像中物體的輪廓,可以突出團塊的邊緣,保留物體的邊緣輪廓。
# ==2== 梯度運算,膨脹圖像減去腐蝕圖像,得到輪廓信息
# 卷積核
kernel = np.ones((3,3),np.uint8)
# 形態學處理函數,輸入圖像,梯度計算參數,卷積核
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
# 繪圖,查看邊界信息
cv2.imshow('gradient',gradient)
cv2.waitKey(0)
cv2.destoryAllWindows()
下圖第一張是膨脹圖像,第二張是腐蝕圖像,第三張是梯度圖
7. 禮帽
禮帽 = 原始輸入 - 開運算結果
可以用于獲得原圖像中比周圍亮的區域,去除白色重疊部分
# ==1== 禮帽
# 獲取圖像
img = cv2.imread(filepath+'\\wiseman.jpg')
# 卷積核
kernel = np.ones((8,8),np.uint8)
# 形態學處理函數,輸入圖像,梯度計算參數,卷積核
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
# 繪圖,查看邊界信息
cv2.imshow('tophat',tophat)
cv2.waitKey(0)
cv2.destoryAllWindows()
第一張為原圖,第二張為開運算,第三張是禮帽
8. 黑帽
黑帽 = 閉運算-原始輸入
可以用于獲取原圖像中比周圍暗的區域,保留白色重疊部分
# ==2== 黑帽
# 獲取圖像
img = cv2.imread(filepath+'\\wiseman.jpg')
# 卷積核
kernel = np.ones((8,8),np.uint8)
# 形態學處理函數,輸入圖像,梯度計算參數,卷積核
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
# 繪圖,查看邊界信息
cv2.imshow('blackhat',blackhat)
cv2.waitKey(0)
cv2.destoryAllWindows()
第一張是閉運算,第二張是原圖,第三張是黑帽
總結
以上是生活随笔為你收集整理的【opencv】(4) 形态学处理:腐蚀膨胀、梯度运算、礼帽黑帽的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【opencv】(3) 图像滤波:均值、
- 下一篇: 【opencv】(6) 图像轮廓处理