contribute上次修改:2026-09-29

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))

它们不是“去除竖线/横线”的万能按钮,究竟保留还是连接哪个方向,要结合腐蚀、膨胀和前景定义判断。

五、核与迭代次数怎样调

核越大 / 迭代越多
        ↓
形状改变越强
        ↓
噪声更容易去掉,但目标也更容易粘连或消失

调参顺序:

  1. 从 (3, 3)、iterations=1 开始;
  2. 观察二值图中的断裂或噪点有多大;
  3. 缝没连上再增大,目标粘在一起就减小;
  4. 横竖方向问题明显时再换成长条核;
  5. 最终用轮廓数量、面积稳定性验证。

一个对照示例

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。