Otsu分割出来的掩码,总有噪点和空洞。
开运算去白噪点,闭运算填黑空洞。
一、为什么需要形态学优化
分割掩码的常见问题:
| 问题 | 表现 | 影响 |
|---|---|---|
| 噪点 | 孤立的白点或黑点 | 面积计算偏大 |
| 空洞 | 物相内部的小黑点 | 面积计算偏小 |
| 边界锯齿 | 边缘不光滑 | 视觉差 |
二、形态学基础
| 操作 | 公式 | 效果 |
|---|---|---|
| 腐蚀 | A ⊖ B | 白色区域缩小 |
| 膨胀 | A ⊕ B | 白色区域扩大 |
| 开运算 | (A ⊖ B) ⊕ B | 先腐蚀后膨胀,去白噪点 |
| 闭运算 | (A ⊕ B) ⊖ B | 先膨胀后腐蚀,填黑空洞 |
三、优化流程
text
分割掩码 → 开运算(去噪点)→ 闭运算(填空洞)→ 优化后掩码
为什么先开后闭:先去掉外部噪点,再填充内部空洞。顺序反了会把噪点连到物相上。
四、核心代码
python
import cv2
import numpy as np
def morphological_optimization(masks):
optimized_masks = {}
kernel_open = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
kernel_close = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
for phase_name, mask in masks.items():
opened = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel_open)
closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel_close)
optimized_masks[phase_name] = closed
return optimized_masks
五、结构元素选择
| 形状 | OpenCV常量 | 特点 | 适用 |
|---|---|---|---|
| 矩形 | MORPH_RECT | 各向异性 | 文字、直线 |
| 十字 | MORPH_CROSS | 仅十字方向 | 特殊需求 |
| 椭圆 | MORPH_ELLIPSE | 各向同性,圆滑 | 自然图像、颗粒 |
本项目用椭圆核,因为物相是不规则的颗粒状。
| 操作 | 核大小 | 作用 |
|---|---|---|
| 开运算 | 3×3 | 去小噪点,保留细节 |
| 闭运算 | 5×5 | 填空洞,平滑边界 |
六、调参指南
| 问题 | 调整 |
|---|---|
| 白噪点多 | 开运算核改5×5 |
| 黑洞多 | 闭运算核改7×7 |
| 小物相被误删 | 减小开运算核 |
下篇预告
下一篇写面积计算与像素标定:像素计数、面积换算、标定流程。