《Halcon图像分割与特征提取讲义》

3. 图像分割基础概念

3.1 图像分割的定义与数学表述

图像分割(Image Segmentation)是数字图像处理中从像素级理解走向对象级分析的关键桥梁。其核心目标是将图像划分为若干互不重叠、内部具有一致性的子区域,使得同一区域内的像素在某种特征(灰度、颜色、纹理、梯度等)上高度相似,而不同区域之间的特征差异显著。在Halcon的工程实践中,分割结果直接决定了后续特征提取、模板匹配、缺陷检测等环节的输入质量。

从数学角度,图像分割可严格表述为:设整幅图像对应的像素集合为 R,分割过程将其划分为 n 个子区域 R₁, R₂, …, Rₙ,需同时满足以下四个条件:

  1. 完备性:所有子区域的并集等于原图像,即 R₁ ∪ R₂ ∪ … ∪ Rₙ = R,确保没有像素被遗漏。
  2. 互不重叠:任意两个不同子区域没有公共像素,即 Rᵢ ∩ Rⱼ = ∅(当 i ≠ j 时)。
  3. 区域内部连通性:每个子区域内的像素是连通的,不存在孤立散点。
  4. 区域内部一致性:同一子区域内的像素满足某种预定义的相似性准则(如灰度方差小于阈值)。

工程提示:在Halcon中,分割结果通常以区域(Region)对象表示。区域是像素坐标的集合,而非浮点精度的轮廓。理解这一点有助于后续使用 reduce_domain、connection 等算子时建立正确的数据流认知。

3.2 图像分割的主要分类

根据分割所依据的图像特征和算法策略,Halcon中常用的分割方法可分为三大类:阈值分割、边缘分割和区域分割。此外还有基于聚类、图论等更高级的方法,但在工业视觉中前三者占据了绝大多数应用场景。

3.2.1 阈值分割(Thresholding)

阈值分割是最基础、计算效率最高的方法。其原理是设定一个或多个灰度阈值,将图像中的像素按灰度值归类到不同区域。Halcon中典型的算子包括 threshold(全局阈值)、dyn_threshold(动态阈值,适用于光照不均)以及 binary_threshold(自动选择阈值方法,如Otsu、熵法等)。

适用场景:目标与背景灰度差异明显、光照相对稳定的环境,如暗场下的金属表面缺陷检测、印刷品上的深色字符提取。

3.2.2 边缘分割(Edge-based Segmentation)

边缘分割基于图像灰度值的剧烈变化来定位区域边界。首先通过梯度算子(如Sobel、Canny)提取边缘点,再通过连接、闭合等操作形成封闭轮廓,最终将轮廓内部填充为区域。Halcon中常用 edges_sub_pix 提取亚像素精度轮廓,再配合 split_contours_xld 和 select_contours_xld 进行轮廓处理。

适用场景:目标与背景灰度接近但形状规则、需要亚像素精度定位的场景,如精密机械零件的尺寸测量。

3.2.3 区域分割(Region-based Segmentation)

区域分割从种子点或初始区域出发,依据相似性准则向周围扩张(区域生长),或不断分裂与合并(分裂合并法)。Halcon中的 regiongrowing 算子即实现了基于灰度相似性的区域生长算法,而 watersheds 算子则实现了分水岭变换,适用于粘连物体的分离。

适用场景:纹理复杂、目标边界模糊但内部灰度均匀的图像,如细胞显微图像、卫星遥感地物分类。

对比维度 阈值分割 边缘分割 区域分割
核心依据 灰度值范围 灰度梯度变化 区域内部一致性
计算速度 极快 中等 较慢
抗噪能力 弱 中等(依赖滤波) 较强
输出精度 像素级 可达亚像素级 像素级
典型Halcon算子 threshold, dyn_threshold edges_sub_pix, hough_lines regiongrowing, watersheds

3.3 分割方法的评价标准

在实际项目中,选择哪种分割方法并非凭直觉,而应基于可量化的评价指标。以下是工业视觉中最常用的四个评价维度:

  • 准确率(Accuracy):分割结果与真实目标(Ground Truth)的重合度。常用指标为IoU(Intersection over Union),即预测区域与真实区域的交集面积除以并集面积。IoU > 0.9 通常视为优秀。
  • 鲁棒性(Robustness):在光照变化、噪声干扰、目标位置偏移等条件下,分割结果保持稳定的能力。可通过在测试集中加入不同干扰因素来评估。
  • 计算效率(Efficiency):单帧图像的处理时间。对于在线检测场景(如流水线),通常要求单帧处理时间小于节拍时间(如 50 ms)。
  • 参数敏感性(Parameter Sensitivity):算法对阈值、滤波器尺寸等参数的敏感程度。参数越敏感,现场调试成本越高,越不利于工程部署。

常见误区:很多初学者只关注分割结果的视觉效果,而忽略了定量评价。在Halcon开发中,建议使用 intersection 和 union2 算子计算IoU,并建立标准测试图像集,用脚本批量评估分割算法的稳定性,而非仅凭一两张图像下结论。

3.4 分割方法的选择原则

在Halcon项目实践中,选择分割方法应遵循“由简到繁、由快到慢”的决策路径。以下是一套经过验证的选择流程:

  1. 第一步:灰度直方图分析。使用 gray_histo 观察目标与背景的灰度分布。若存在明显的双峰且峰谷清晰,优先选择全局阈值分割。
  2. 第二步:光照均匀性评估。若图像存在渐晕或局部阴影,尝试 dyn_threshold 或先进行 illuminate 光照校正。
  3. 第三步:目标形状特征考量。若目标具有规则的几何形状(如矩形、圆形),且边缘清晰,可考虑边缘分割配合 fit_rectangle2_contour_xld 进行拟合。
  4. 第四步:粘连与重叠处理。若目标相互接触或重叠,分水岭变换(watersheds)通常是首选,但需注意过分割问题,可结合 merge_regions 进行后处理。
  5. 第五步:实时性验证。在目标硬件上测试实际运行时间,若无法满足节拍要求,需回退到更简单的算法或采用图像金字塔(zoom_image_factor)加速。

3.5 案例:PCB焊点缺陷检测中的分割方法选择

以PCB板上焊点的桥连缺陷检测为例,说明上述选择原则的实际应用。焊点在灰度图像中通常呈现为亮色圆形区域,而桥连缺陷表现为两个焊点之间的异常连接。

初步分析:焊点与基板背景灰度差异较大,直方图呈双峰分布,因此首先尝试全局阈值分割。但实际采集的图像存在环形光源造成的中心亮、边缘暗的不均匀光照,导致单一阈值无法同时正确分割中心和边缘的焊点。

改进方案:改用 dyn_threshold 结合高斯滤波(gauss_filter)计算局部背景,成功提取所有焊点区域。随后使用 opening_circle 去除微小噪声,再通过 connection 将连通域分离。最后计算每个区域的圆形度(circularity),若圆形度低于0.8,则判定为桥连缺陷。

// Halcon伪代码示例
read_image (Image, 'pcb_board.png')
gauss_filter (Image, ImageGauss, 9)
dyn_threshold (Image, ImageGauss, RegionDyn, 15, 'dark')
opening_circle (RegionDyn, RegionOpen, 3.5)
connection (RegionOpen, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 500, 99999)
circularity (SelectedRegions, Circularity)
defect_regions := SelectedRegions.select_by_index(find(Circularity < 0.8))

该方案在2000帧测试图像上实现了99.2%的缺陷检出率,单帧处理时间约35ms,满足产线50ms节拍要求。

3.6 常见误区与复盘

在多年Halcon教学与项目评审中,以下误区出现频率最高,值得反复强调:

  • 误区一:盲目追求亚像素精度。亚像素边缘分割(edges_sub_pix)虽然精度高,但对噪声敏感且计算量大。对于仅需判断“有无缺陷”的场景,像素级阈值分割往往更稳定。
  • 误区二:忽略预处理的重要性。分割算法的效果上限由图像质量决定。中值滤波(median_image)、灰度拉伸(scale_image)等预处理步骤应被视为分割流程的一部分,而非可选项。
  • 误区三:参数固定不变。现场光照会随时间漂移,固定阈值必然导致误检。应定期采集新样本重新标定,或使用 binary_threshold 的自动阈值模式。
  • 误区四:混淆区域与轮廓。区域(Region)是像素集合,轮廓(XLD)是亚像素精度的几何曲线。两者之间的转换(gen_contour_region_xld)会丢失精度,反之亦然,需根据下游需求选择合适的数据类型。

复盘建议:每完成一个分割项目,建议记录以下信息——图像采集条件(光源角度、曝光时间)、预处理参数、分割算法及参数、后处理步骤、最终评价指标(IoU、耗时)。建立这样的“分割案例库”后,新项目可直接检索相似案例,大幅缩短开发周期。