(纯新手教学)计算机视觉(opencv)实战六——图像形态学(腐蚀、膨胀、开运算、闭运算、梯度、顶帽、黑帽)
图像形态学
在图像处理中,形态学(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:迭代次数,越大腐蚀越明显
None
(默认 3×3 矩形)numpy.ndarray
None
src
类型、大小相同。通常不写,函数会返回结果。(-1,-1)
(核中心)(x,y)
坐标1
cv2.BORDER_CONSTANT
BORDER_CONSTANT
常数填充- BORDER_REPLICATE
复制边缘- BORDER_REFLECT
镜像填充0
(黑色)borderType=BORDER_CONSTANT
时使用,表示填充颜色。代码示例
import cv2import 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)
None
(默认 3×3 矩形)numpy.ndarray
None
src
类型、大小相同。通常不写,函数会返回结果。(-1,-1)
(核中心)(x,y)
坐标1
cv2.BORDER_CONSTANT
BORDER_CONSTANT
常数填充- BORDER_REPLICATE
复制边缘- BORDER_REFLECT
镜像填充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
None
(默认 3×3 矩形)numpy.ndarray
None
src
类型、大小相同。通常不写,函数会返回结果。(-1,-1)
(核中心)(x,y)
坐标1
cv2.BORDER_CONSTANT
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 文字识别(加粗或断开笔画)
-
工业检测(焊点检测、缺陷检测)
-
医学图像处理(血管提取)