4. 图像分割基础:阈值分割、动态阈值、区域生长、边缘检测(Canny、Sobel)在尺寸测量中的应用
图像分割是尺寸测量流程中承上启下的核心环节——上游承接相机标定与图像预处理,下游直接决定边缘定位、几何拟合与公差点判定的准确性。在HALCON与VC++联合开发的工业视觉项目中,分割算法的选择与参数调优往往占据整个视觉工程师60%以上的调试时间。本章围绕阈值分割、动态阈值、区域生长和边缘检测四大类方法,深入剖析其数学原理、适用场景、HALCON算子实现以及在尺寸测量中的工程化落地要点。
4.1 核心原理:四种分割方法的数学本质与适用边界
图像分割的本质是将像素划分为"目标"与"背景"(或多区域)的决策过程。在尺寸测量场景中,分割质量直接决定边缘提取的精度上限。四种方法分别从不同维度解决"如何区分目标与背景"这一问题。
全局阈值分割基于灰度直方图的分布特性,假设目标与背景在灰度空间上存在显著分离。其数学表达为:对于灰度值 \( f(x,y) \),若 \( f(x,y) \geq T \) 则判为目标,否则为背景。HALCON中的threshold算子直接指定灰度区间,而binary_threshold则自动计算最优阈值(OTSU法或最大熵法)。OTSU的核心思想是最大化类间方差:
σ²_B(t) = ω₀(t)·ω₁(t)·[μ₀(t) - μ₁(t)]²
其中 \( \omega_0, \omega_1 \) 为两类像素占比,\( \mu_0, \mu_1 \) 为两类灰度均值。当直方图呈现明显双峰时,OTSU能快速给出接近最优的分割阈值。
动态阈值分割(也称局部阈值)针对光照不均匀、背景灰度渐变或表面反光等场景。其核心思想是用一个平滑后的背景图像作为参考,将原图与背景图逐像素差分,再对差分图做阈值处理。HALCON中典型实现为:
mean_image (Image, ImageMean, 31, 31) // 大核均值滤波估计背景
dyn_threshold (Image, ImageMean, RegionDyn, 15, 'dark')
滤波核尺寸的选择是动态阈值成败的关键——核太小则背景估计受目标干扰,核太大则无法跟踪快速变化的背景。工程经验上,核尺寸应至少为目标最大尺寸的2~3倍。
区域生长从种子点出发,根据灰度相似性、纹理一致性或边缘约束逐步扩张区域。HALCON的regiongrowing算子采用"先分割后合并"策略:先将图像划分为小区域,再根据相邻区域的灰度差是否小于容差来决定是否合并。该方法适合目标内部灰度均匀但边界不规则的场景,如铸件缺陷检测、细胞分割等。但种子点位置和容差参数对结果敏感,且计算量较大,在高速产线中需谨慎评估实时性。
边缘检测与前三种方法不同,它不直接生成区域,而是提取灰度突变的位置。Sobel算子通过卷积核计算一阶导数:
Gx = [[-1,0,1],[-2,0,2],[-1,0,1]] Gy = [[-1,-2,-1],[0,0,0],[1,2,1]]
梯度幅值 G = √(Gx² + Gy²) 梯度方向 θ = atan2(Gy, Gx)
Canny算子在Sobel基础上增加了非极大值抑制和双阈值滞后连接,能输出单像素宽、连续闭合的边缘。在HALCON中,edges_sub_pix算子进一步输出亚像素精度的边缘轮廓,这是尺寸测量达到微米级精度的关键。
| 方法 | 数学基础 | 输出类型 | 抗噪能力 | 计算开销 | 典型精度 |
|---|---|---|---|---|---|
| 全局阈值 | 直方图统计/类间方差 | 区域 | 中 | 低 | 像素级 |
| 动态阈值 | 局部背景估计+差分 | 区域 | 较高 | 中 | 像素级 |
| 区域生长 | 相似性准则+区域合并 | 区域 | 中高 | 高 | 像素级 |
| Canny/Sobel | 梯度计算+非极大值抑制 | 边缘点/轮廓 | 高(Canny) | 中 | 亚像素级 |
4.2 判断方法与操作流程:从图像特征到算法选型
在实际项目中,选择哪种分割方法不能凭个人偏好,而应基于图像质量、光照条件、目标特征和精度要求进行系统判断。以下是工程化的选型决策流程:
- 第一步:评估图像对比度。计算目标区域与背景区域的灰度均值差。若差值大于50(0~255灰度范围),优先考虑全局阈值;若差值在20~50之间,需尝试动态阈值或边缘检测。
- 第二步:检查光照均匀性。在图像四角与中心分别取ROI计算灰度均值,若标准差超过10,说明存在光照不均,应直接排除全局阈值法。
- 第三步:明确精度需求。若公差要求在±0.05mm以上且视场为50mm×50mm,像素当量约0.05mm/pixel,像素级分割即可满足;若公差在±0.01mm以内,必须使用亚像素边缘检测。
- 第四步:评估实时性预算。区域生长在1920×1080图像上通常需要30~80ms,而阈值分割仅需1~3ms。对于节拍小于500ms的产线,应优先选择阈值+边缘的组合方案。
HALCON中推荐的标准流程为:先使用threshold或dyn_threshold快速获取目标区域,再用reduce_domain缩小处理范围,最后在ROI内使用edges_sub_pix提取亚像素边缘。这种"粗分割+精定位"的两级策略兼顾了速度与精度。
histo_to_thresh配合threshold的交互式直方图工具,实时观察分割结果。对于动态阈值,先用mean_image的核尺寸从大到小扫描,观察差分图的灰度分布,选择使目标与背景差分值最大的核尺寸。
4.3 案例拆解:轴承外圈直径测量的分割方案优化
项目背景:某汽车零部件供应商需在线检测轴承外圈外径,公差要求±0.008mm,产线节拍2.5秒/件。相机为500万像素黑白工业相机,视场40mm×30mm,像素当量约0.012mm/pixel。现场采用环形LED低角度照明,但工件表面存在机加工纹路和轻微油污,导致灰度不均匀。
初始方案与问题:工程师最初直接使用threshold算子,设定灰度阈值120~255提取轴承区域,然后使用smallest_circle拟合外圆。实际测试发现:
- 测量重复性达±0.025mm,远超公差要求;
- 同一工件旋转不同角度测量结果波动明显;
- 油污区域导致阈值分割产生孔洞和毛刺。
分析过程:通过intensity算子检查ROI内灰度分布,发现轴承表面灰度均值约180,但边缘区域因反光降至100~140,背景灰度约60~80,目标与背景灰度差仅40~60,且边缘处存在渐变过渡带。全局阈值无法稳定锁定真实边缘位置。
优化方案:
* 第一步:动态阈值粗分割,克服光照不均
mean_image (Image, ImageMean, 51, 51)
dyn_threshold (Image, ImageMean, RegionDyn, 12, 'dark')
* 第二步:形态学闭运算填充孔洞
closing_circle (RegionDyn, RegionClosed, 5.5)
* 第三步:提取连通域并选择最大区域
connection (RegionClosed, ConnectedRegions)
select_shape_max (ConnectedRegions, SelectedRegion, 'area')
* 第四步:缩小域到目标区域,减少边缘检测计算量
reduce_domain (Image, SelectedRegion, ImageReduced)
* 第五步:亚像素边缘提取
edges_sub_pix (ImageReduced, Edges, 'canny', 1.5, 20, 40)
* 第六步:拟合圆并输出直径
fit_circle_contour_xld (Edges, 'algebraic', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
结果对比:优化后测量重复性提升至±0.006mm,满足公差要求。动态阈值核尺寸51px约为目标直径(约800px)的1/16,既能跟踪背景渐变又不被目标细节干扰。Canny双阈值设为20和40(低/高),在噪声抑制与边缘完整性之间取得平衡。
复盘经验:该案例揭示了尺寸测量中一个常见误区——过度依赖单一分割方法。全局阈值在理想光照下简单高效,但工业现场光照波动、表面状态变化是常态。动态阈值+亚像素边缘的组合方案虽然代码量增加,但鲁棒性显著提升。此外,edges_sub_pix的Sigma参数(高斯平滑尺度)对亚像素精度影响显著,Sigma过小则噪声敏感,过大则边缘位置偏移,需通过标准件校准确定最优值。
4.4 常见误区与总结复盘
在多年HALCON项目交付中,以下误区反复出现,值得每位视觉工程师警惕:
| 误区 | 后果 | 正确做法 |
|---|---|---|
| 盲目使用OTSU自动阈值 | 直方图单峰或重叠时阈值偏移 | 先查看直方图,确认双峰特性后再决定 |
| 动态阈值核尺寸随意设置 | 背景估计不准,分割结果不稳定 | 按目标尺寸的2~3倍设置,并做敏感性测试 |
| 忽略亚像素边缘的Sigma参数 | 边缘位置系统性偏移 | 用标准量块校准,确定最优Sigma |
| 区域生长种子点固定 | 工件位置偏移时分割失败 | 使用阈值分割结果自动生成种子点 |
| 只做像素级分割就拟合 | 精度无法满足微米级公差 | 必须使用edges_sub_pix或亚像素阈值 |
总结:图像分割没有"万能算法",只有"最合适的组合"。在尺寸测量项目中,建议遵循以下原则:
- 先粗后精:用阈值/动态阈值快速锁定ROI,再用亚像素边缘精确定位;
- 鲁棒优先:优先选择对光照变化不敏感的方法(动态阈值优于全局阈值);
- 参数可解释:每个参数都应能解释其物理意义(如核尺寸对应背景变化尺度);
- 验证闭环:每次参数调整后,用标准件做GR&R(重复性与再现性)测试,确保测量系统能力Cgk≥1.33。
在VC++开发环境中,建议将分割参数(阈值、核尺寸、Sigma、双阈值)封装为配置文件,通过界面动态调整,便于现场调试与维护。同时,利用HALCON的get_time与count_seconds监控各步骤耗时,确保整体节拍满足产线要求。