2.6 形态学处理
总目录:1.1 OpenCV介绍与学习路线 | 第二章:基础图像处理 | 编号:2.6
← 上一节:2.5 二值化与阈值 | 下一节:2.7 HSV颜色检测 →
2.6 形态学处理
二值图出来后,目标可能带着小白点、小黑洞和断裂边缘。形态学不关心“这是什么物体”,它只按结构元素的形状去扩张或收缩白色前景。
一、形态学操作的是前景形状
默认把非零区域理解为前景:
白色 255 → 前景
黑色 0 → 背景
所以同一个腐蚀操作,在“白目标黑背景”和“黑目标白背景”上看起来会完全相反。先确认谁是白色前景。
二、腐蚀与膨胀
erode:腐蚀
白色区域收缩:
eroded = cv2.erode(binary, kernel, iterations=1)
常用于:
- 去掉小白点;
- 断开细小白色连接;
- 让前景边界向内收。
dilate:膨胀
白色区域扩张:
dilated = cv2.dilate(binary, kernel, iterations=1)
常用于:
- 连接靠得很近的白色区域;
- 填补细小断裂;
- 让前景边界向外扩。
三、开运算与闭运算
开运算:先腐蚀,后膨胀
opened = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
先把小白噪点腐蚀掉,再把主要目标恢复一些。常用于“去小白点”。
闭运算:先膨胀,后腐蚀
closed = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)
先把小缝和小黑洞合上,再把外边界恢复一些。常用于“补小黑洞、连断边”。
开:腐 → 膨,打开细连接、去白噪点
闭:膨 → 腐,关闭小缺口、补黑洞
四、结构元素的形状
rect = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
cross = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))
ellipse = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
| 形状 | 直观特点 | 常见方向 |
|---|---|---|
| 矩形 | 各方向作用明显 | 通用去噪、补洞 |
| 十字 | 主要沿水平和竖直 | 文字、栅格、正交结构 |
| 椭圆 | 边界较圆滑 | 圆形目标、自然轮廓 |
方向性长条核:
horizontal = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 1))
vertical = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 9))
它们不是“去除竖线/横线”的万能按钮,究竟保留还是连接哪个方向,要结合腐蚀、膨胀和前景定义判断。
五、核与迭代次数怎样调
核越大 / 迭代越多
↓
形状改变越强
↓
噪声更容易去掉,但目标也更容易粘连或消失
调参顺序:
- 从
(3, 3)、iterations=1开始; - 观察二值图中的断裂或噪点有多大;
- 缝没连上再增大,目标粘在一起就减小;
- 横竖方向问题明显时再换成长条核;
- 最终用轮廓数量、面积稳定性验证。
一个对照示例
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
eroded = cv2.erode(binary, kernel, iterations=1)
dilated = cv2.dilate(binary, kernel, iterations=1)
opened = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
closed = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)
← 上一节:2.5 二值化与阈值 | 下一节:2.7 HSV颜色检测 →
留言区
不收集任何个人信息;昵称只绑定浏览器里的随机 Cookie。