圖像形態學
在圖像處理中,形態學(Morphology) 是一種基于圖像中物體形狀的處理方法,通常用于二值圖像和灰度圖像。它通過腐蝕、膨脹等基本操作,結合開運算、閉運算、梯度運算、頂帽、黑帽等派生操作,來實現去噪、邊緣檢測、連接或斷開物體等目的。
在 OpenCV 中,常用函數有:
cv2.erode()
—— 腐蝕cv2.dilate()
—— 膨脹cv2.morphologyEx()
—— 各類高級形態學操作(開運算、閉運算、梯度、頂帽、黑帽)
準備圖片:
sun.png
wenzi.png
zhiwen.png
zhiwen_duan.png
1. 圖像腐蝕(Erosion)
原理
腐蝕操作的本質是:取局部最小值。
在二值圖像中,腐蝕會“侵蝕”白色區域(前景),使得物體的邊界縮小,細小的高亮噪點被去除。
公式:
即:結構元素 B 在圖像 A 上滑動,若完全落在前景內,則該像素保留,否則被侵蝕。
OpenCV 函數
cv2.erode(src, kernel, dst, anchor, iterations, borderType, borderValue)
src:輸入圖像
kernel:卷積核(結構元素),默認為 3×3 矩形
iterations:迭代次數,越大腐蝕越明顯
參數名 | 默認值 | 類型 / 取值 | 作用說明 |
---|---|---|---|
src | 必填 | 圖像對象 | 輸入圖像,可以是二值圖、灰度圖或彩色圖。 |
kernel | None (默認 3×3 矩形) | numpy.ndarray | 卷積核(結構元素),決定腐蝕范圍和形狀。 |
dst | None | 圖像對象 | 輸出圖像,和 src 類型、大小相同。通常不寫,函數會返回結果。 |
anchor | (-1,-1) (核中心) | (x,y) 坐標 | 核的參考點位置。默認在中心。 |
iterations | 1 | 整數 | 腐蝕迭代次數,數值越大,腐蝕越嚴重。 |
borderType | cv2.BORDER_CONSTANT | OpenCV 邊界模式 | 邊界擴展方式。- BORDER_CONSTANT 常數填充- BORDER_REPLICATE 復制邊緣- BORDER_REFLECT 鏡像填充 |
borderValue | 0 (黑色) | 數值 | 當 borderType=BORDER_CONSTANT 時使用,表示填充顏色。 |
代碼示例
import cv2
import numpy as npsun = cv2.imread('sun.png')
cv2.imshow('sun', sun)
cv2.waitKey(0)kernel = np.ones((3,3), np.uint8) # 3×3核
erosion_1 = cv2.erode(sun, kernel, iterations=2) # 腐蝕2次
cv2.imshow('sun_erode', erosion_1)
cv2.waitKey(0)
說明:
如果
kernel
改為5×5
,腐蝕會更明顯。如果
iterations
改為5
,物體會被“蠶食”得更多。
2. 圖像膨脹(Dilation)
原理
膨脹操作的本質是:取局部最大值。
在二值圖像中,膨脹會“擴張”白色區域,使得物體邊界擴大,細小的黑洞被填充。
公式:
OpenCV 函數
cv2.dilate(img, kernel, iterations)
參數名 | 默認值 | 類型 / 取值 | 作用說明 |
---|---|---|---|
src | 必填 | 圖像對象 | 輸入圖像,可以是二值圖、灰度圖或彩色圖。 |
kernel | None (默認 3×3 矩形) | numpy.ndarray | 卷積核(結構元素),決定膨脹范圍和形狀。 |
dst | None | 圖像對象 | 輸出圖像,和 src 類型、大小相同。通常不寫,函數會返回結果。 |
anchor | (-1,-1) (核中心) | (x,y) 坐標 | 核的參考點位置。默認在中心。 |
iterations | 1 | 整數 | 膨脹迭代次數,數值越大,膨脹越明顯。 |
borderType | cv2.BORDER_CONSTANT | OpenCV 邊界模式 | 邊界擴展方式。- BORDER_CONSTANT 常數填充- BORDER_REPLICATE 復制邊緣- BORDER_REFLECT 鏡像填充 |
borderValue | 0 (黑色) | 數值 | 當 borderType=BORDER_CONSTANT 時使用,表示填充顏色。 |
代碼示例
wenzi = cv2.imread('wenzi.png')
cv2.imshow('wenzi', wenzi)
cv2.waitKey(0)kernel = np.ones((2,2), np.uint8)
wenzi_new = cv2.dilate(wenzi, kernel, iterations=2)
cv2.imshow('wenzi_dilate', wenzi_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
說明:
kernel
越大,膨脹效果越明顯。常用于加粗文字、填補小空洞。
morphologyEx函數
cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst
參數名 | 默認值 | 類型 / 取值 | 作用說明 |
---|---|---|---|
src | 必填 | 圖像對象 | 輸入圖像,可以是二值、灰度或彩色圖。 |
op | 必填 | 整數常量 | 指定形態學操作類型(見下表)。 |
kernel | None (默認 3×3 矩形) | numpy.ndarray | 卷積核(結構元素),決定操作范圍和形狀。 |
dst | None | 圖像對象 | 輸出圖像,與 src 類型、大小相同。通常不寫,函數會返回結果。 |
anchor | (-1,-1) (核中心) | (x,y) 坐標 | 核的參考點位置。默認在中心。 |
iterations | 1 | 整數 | 操作迭代次數,數值越大效果越強。 |
borderType | cv2.BORDER_CONSTANT | OpenCV 邊界模式 | 邊界擴展方式。 |
borderValue | 0 (黑色) | 數值 | 當 borderType=BORDER_CONSTANT 時使用,表示填充值。 |
3. 開運算與閉運算
(1)開運算(Opening)
先腐蝕后膨脹。
作用:去除小噪點、分離粘連物體。
kernel = np.ones((2,2), np.uint8)
zhiwen = cv2.imread('zhiwen.png')
zhiwen_new = cv2.morphologyEx(zhiwen, cv2.MORPH_OPEN, kernel)
cv2.imshow('zhiwen_OPEN', zhiwen_new)
(2)閉運算(Closing)
先膨脹后腐蝕。
作用:填補小黑洞、連接相鄰物體。(指紋斷點被連接)
kernel = np.ones((4,4), np.uint8)
zhiwen_duan = cv2.imread('zhiwen_duan.png')
zhiwen_new = cv2.morphologyEx(zhiwen_duan, cv2.MORPH_CLOSE, kernel)
cv2.imshow('zhiwen_duan_CLOSE', zhiwen_new)
4. 形態學梯度(Gradient)
原理
梯度 = 膨脹 - 腐蝕
它突出顯示物體的邊緣區域,常用于邊緣檢測。
代碼示例
wenzi = cv2.imread('wenzi.png', 0)
cv2.imshow('wenzi', wenzi)
cv2.waitKey(0)kernel = np.ones((2, 2), np.uint8) # 設置kernel大小
# 膨脹
pz_wenzi = cv2.dilate(wenzi, kernel, iterations=1)
cv2.imshow('wenzi_dilate', pz_wenzi)
cv2.waitKey(0)# 腐蝕
fs_wenzi = cv2.erode(wenzi, kernel, iterations=1)
cv2.imshow('wenzi_erode', fs_wenzi)
cv2.waitKey(0)# 膨脹 - 腐蝕
bianyuan = cv2.morphologyEx(wenzi, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('wenzi_GRADIENT', bianyuan)
cv2.waitKey(0)
cv2.destroyAllWindows()
以下三張圖為:原圖膨脹后;原圖腐蝕后;原圖梯度后
5. 頂帽與黑帽運算
(1)頂帽(Top Hat)
頂帽 = 原始圖像 - 開運算結果
突出圖像中比周圍亮的部分(亮斑檢測)。
(2)黑帽(Black Hat)
黑帽 = 閉運算結果 - 原始圖像
突出圖像中比周圍暗的部分(暗斑檢測)。
代碼示例
sun = cv2.imread('sun.png', 0)
cv2.imshow('sun', sun)
cv2.waitKey(0)kernel = np.ones((2, 2), np.uint8) # 設置kernel大小
# 開運算
open_sun = cv2.morphologyEx(sun, cv2.MORPH_OPEN, kernel)
cv2.imshow('sun_OPEN', open_sun)
cv2.waitKey(0)# 頂帽運算
tophat = cv2.morphologyEx(sun, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('sun_TOPHAT', tophat)
cv2.waitKey(0)# 閉運算
close_sun = cv2.morphologyEx(sun, cv2.MORPH_CLOSE, kernel)
cv2.imshow('sun_CLOSE', close_sun)
cv2.waitKey(0)# 黑帽運算
blackhat = cv2.morphologyEx(sun, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('sun_BLACKHAT', blackhat)
cv2.waitKey(0)
cv2.destroyAllWindows()
以下圖片為:開運算、頂帽、閉運算、黑帽
總結
腐蝕:縮小白色區域,去噪點。
膨脹:擴大白色區域,填洞。
開運算:去噪、斷開。
閉運算:填洞、連接。
梯度:提取邊緣。
頂帽:突出亮斑。
黑帽:突出暗斑。
形態學操作廣泛應用于:
圖像預處理(去噪、增強特征)
OCR 文字識別(加粗或斷開筆畫)
工業檢測(焊點檢測、缺陷檢測)
醫學圖像處理(血管提取)