OpenCV 从零学习 · 第 10 讲:形态学操作
函数:cv2.erode / cv2.dilate / cv2.morphologyEx | 难度:★★☆☆☆
形态学(Morphology)是一组针对二值图的形状操作:把前景(白色)按一个"小模板"(结构元素)去擦、去补、去连。它是去椒盐噪点、填补空洞、断开粘连、提取边缘的利器,常排在阈值化/轮廓之后使用。本讲讲清腐蚀、膨胀,以及由它们组合出的"开运算 / 闭运算"。
一、结构元素(内核)
所有形态学操作都依赖一个"核"——决定操作的形状和范围,用 cv2.getStructuringElement 生成。
kernel = cv2.getStructuringElement(shape, ksize)
| shape | 形状 |
cv2.MORPH_RECT | 矩形(最常用) |
cv2.MORPH_ELLIPSE | 椭圆 |
cv2.MORPH_CROSS | 十字形 |
例:kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
二、腐蚀与膨胀(基础两招)
dst = cv2.erode(src, kernel, iterations=1)
dst = cv2.dilate(src, kernel, iterations=1)
| 操作 | 效果(前景=白) | 直觉 |
erode 腐蚀 | 白色区域"变瘦" | 去掉小白点、断开细连接 |
dilate 膨胀 | 白色区域"变胖" | 填补小黑洞、连接断开 |
⚠ 关键认知
形态学操作默认把白色当"前景/物体"。如果你的图是"黑字白底",腐蚀会把字加粗、膨胀会把字变细——和直觉相反。处理前确认黑白关系,必要时用
形态学操作默认把白色当"前景/物体"。如果你的图是"黑字白底",腐蚀会把字加粗、膨胀会把字变细——和直觉相反。处理前确认黑白关系,必要时用
THRESH_BINARY_INV 反转。
三、组合运算 cv2.morphologyEx
dst = cv2.morphologyEx(src, op, kernel)
| op | 组成 | 典型用途 |
MORPH_OPEN | 先腐蚀后膨胀 | 去掉前景上的小白点(噪点) |
MORPH_CLOSE | 先膨胀后腐蚀 | 填补前景里的小黑洞 |
MORPH_GRADIENT | 膨胀 − 腐蚀 | 提取物体轮廓边缘 |
MORPH_TOPHAT | 原图 − 开运算 | 提取比背景亮的细节(划痕、纹路) |
MORPH_BLACKHAT | 闭运算 − 原图 | 提取比背景暗的细节 |
场景 A · 开运算去椒盐噪点
一张带白色小噪点的二值图:
一张带白色小噪点的二值图:
cv2.morphologyEx(bin, cv2.MORPH_OPEN, kernel)——先腐蚀把小白点"擦掉",再膨胀把主体恢复原状,噪点没了、主体还在。比中值滤波更"结构化"(中值见第 5 讲)。
场景 B · 闭运算填补文字断口
扫描件里笔画被噪点打断成一段段:
扫描件里笔画被噪点打断成一段段:
MORPH_CLOSE 先膨胀把断口连上,再腐蚀恢复粗细,文字笔画变连贯。
场景 C · 形态学梯度提取边缘
MORPH_GRADIENT = 膨胀图减腐蚀图,正好得到物体"轮廓一圈",可作为轻量边缘提取(弱于 Canny 但快)。
场景 D · 顶帽提取亮纹
在均匀背景上找比周围亮的细线(如指纹、划痕):
在均匀背景上找比周围亮的细线(如指纹、划痕):
MORPH_TOPHAT 把"开运算削掉的小亮结构"凸显出来。
import cv2
bin = cv2.imread('binary.png', cv2.IMREAD_GRAYSCALE)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
opened = cv2.morphologyEx(bin, cv2.MORPH_OPEN, kernel) # 去小白点
closed = cv2.morphologyEx(bin, cv2.MORPH_CLOSE, kernel) # 填小黑洞
grad = cv2.morphologyEx(bin, cv2.MORPH_GRADIENT, kernel) # 边缘
⚠ 新手必踩坑
- 形态学操作吃二值图效果最好;喂灰度图理论上能跑,但语义是"按亮度做形态学",结果不直观。
- 开 / 闭运算顺序别搞反:开=先腐蚀后膨胀(去噪点),闭=先膨胀后腐蚀(填空洞)。
kernel越大、iterations越多,作用越强,但也越容易伤到主体——按需调小。
本讲要点
- 腐蚀(瘦)/ 膨胀(胖)默认作用于白色前景;黑白反了先反转。
- 开运算去噪点、闭运算填空洞;梯度提边缘;顶/黑帽提亮/暗细节。
- 核心参数:结构元素
kernel的形状与大小,决定作用强度。
系列小结:第 1~10 讲覆盖了 OpenCV 入门主干(读显存 → 像素/ROI → 色彩空间 → 几何变换 → 滤波 → 阈值 → 边缘 → 轮廓 → 绘制 → 形态学)。后续可进阶:直方图均衡、模板匹配、特征点(SIFT/ORB)、视频读写、人脸检测等。欢迎在「技术文档」板块继续追更。
