阈值分割方法:全局阈值、自适应阈值、动态阈值、多阈值分割的原理与实现
阈值分割是图像分割中最基础、应用最广泛的一类方法。其核心思想是:根据图像像素灰度值的分布特性,选取一个或多个灰度阈值,将图像中的像素划分为不同的类别。在Halcon中,阈值分割算子家族(threshold、binary_threshold、dyn_threshold等)为开发者提供了从简单到复杂的完整解决方案。本章将系统讲解四类阈值分割方法的原理、适用场景及Halcon实现细节。
4.1 全局阈值分割(Global Thresholding)
4.1.1 原理与数学表达
全局阈值分割使用单一阈值T对整个图像进行二值化处理。对于输入图像f(x,y),输出图像g(x,y)满足:
g(x,y) = 255(或1),当 f(x,y) ≥ T
g(x,y) = 0,当 f(x,y) < T
该方法的有效性取决于图像直方图是否呈现明显的双峰或多峰分布。当目标与背景灰度差异显著、光照均匀时,全局阈值能取得良好效果。其数学本质是寻找一个最优阈值T,使得类间方差最大化(Otsu准则)或类内方差最小化。
4.1.2 Halcon中的threshold算子
threshold算子是Halcon中最基础的全局阈值分割工具,其参数结构如下:
threshold(Image : Region : MinGray, MaxGray : )
该算子将灰度值在[MinGray, MaxGray]区间内的像素提取为前景区域。实际使用时,需要根据直方图分析确定合适的灰度范围。例如,对于灰度范围0-255的图像,若目标灰度集中在100-180,则调用:
threshold(Image, Region, 100, 180)
4.1.3 全局阈值的局限性
全局阈值对以下情况极为敏感:光照不均匀导致图像背景灰度漂移;目标与背景灰度重叠时无法通过单一阈值分离;噪声干扰使直方图峰值模糊。在这些场景下,需要引入更高级的阈值分割策略。
4.2 自适应阈值分割(Adaptive Thresholding)
4.2.1 原理与核心思想
自适应阈值分割的核心思想是:为图像中的每个像素或局部区域计算独立的阈值,而非使用全局统一阈值。其数学表达为:对于像素(x,y),其分割阈值T(x,y)由该像素邻域内的灰度统计特征决定,通常采用邻域均值或高斯加权均值作为基准,再减去一个偏移量C:
T(x,y) = mean(Neighborhood(x,y)) - C
当像素灰度值大于T(x,y)时判为目标,否则判为背景。这种方法能够有效应对光照渐变、阴影等全局阈值难以处理的情况。
4.2.2 Halcon中的binary_threshold算子
Halcon的binary_threshold算子封装了多种自适应阈值算法,其参数结构为:
binary_threshold(Image : Region : Method, LightDark : UsedThreshold : )
其中Method参数支持'max_separability'(最大可分性,即Otsu方法)、'smooth_histo'(直方图平滑)等方法。LightDark参数指定提取亮目标还是暗目标。该算子会自动分析直方图并计算最优阈值,适合快速原型验证。
对于更精细的自适应控制,Halcon提供了local_threshold算子,它允许用户指定邻域大小和统计量类型:
local_threshold(Image, Region, Method, LightDark, GenParamName, GenParamValue)
通过设置'local'方法并指定邻域半径(如11×11),可以实现基于局部均值的自适应分割。
4.2.3 自适应阈值的参数选择策略
| 参数 | 推荐值/范围 | 说明 |
|---|---|---|
| 邻域大小 | 5~51(奇数) | 过小易受噪声影响,过大则失去自适应性 |
| 偏移量C | 2~15 | 控制分割灵敏度,C越大,目标区域越小 |
| 统计量类型 | mean / median / gaussian | median对椒盐噪声更鲁棒 |
4.3 动态阈值分割(Dynamic Thresholding)
4.3.1 原理与实现机制
动态阈值分割(又称局部阈值对比法)的核心思想是:将原始图像与经过平滑滤波的背景图像进行逐像素比较,根据灰度差异提取目标区域。其数学表达为:
对于每个像素(x,y):
如果 f(x,y) - background(x,y) ≥ Offset,则判为目标
否则判为背景
其中background(x,y)通常通过对原图进行均值滤波或高斯滤波获得,Offset为人为设定的灰度偏移量。这种方法特别适合提取纹理背景上的细微目标,或灰度变化平缓但局部有突变的区域。
4.3.2 Halcon中的dyn_threshold算子详解
dyn_threshold算子是动态阈值分割的核心实现,其参数结构为:
dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : )
使用流程通常分为三步:
- 生成背景图像:使用mean_image或gauss_filter对原图进行平滑处理
- 调用dyn_threshold进行逐像素比较
- 根据LightDark参数选择提取亮目标('light')、暗目标('dark')或两者('equal'/'not_equal')
典型实现代码如下:
// 生成背景图像(均值滤波,核大小15×15)
mean_image(Image, ImageBackground, 15, 15)
// 动态阈值分割,提取亮目标,偏移量设为10
dyn_threshold(Image, ImageBackground, RegionDynamic, 10, 'light')
4.3.3 动态阈值与自适应阈值的区别
两者容易混淆,但存在本质差异:自适应阈值直接为每个像素计算阈值并与原图比较;动态阈值则先构造背景图像,再与原图做差分比较。动态阈值更适合目标与背景灰度差异较小、但局部对比度明显的场景,且对光照变化的鲁棒性更强。
4.4 多阈值分割(Multi-Thresholding)
4.4.1 原理与适用场景
多阈值分割使用多个阈值将图像划分为多个灰度区间,每个区间对应一个类别。例如,使用两个阈值T1、T2(T1<T2)可将图像分为三类:背景(灰度<T1)、中间区域(T1≤灰度<T2)、目标(灰度≥T2)。这在多材料检测、灰度分级、多相分离等场景中非常实用。
4.4.2 Halcon中的多阈值实现
Halcon中实现多阈值分割主要有两种方式:
方式一:多次调用threshold算子,分别提取不同灰度区间,再通过union1或concat_obj合并区域:
threshold(Image, Region1, 0, 80)
threshold(Image, Region2, 81, 160)
threshold(Image, Region3, 161, 255)
concat_obj(Region1, Region2, RegionsIntermediate)
concat_obj(RegionsIntermediate, Region3, MultiRegions)
方式二:使用gray_histo和auto_threshold算子自动确定多个阈值:
// 计算直方图
gray_histo(Image, Image, AbsoluteHisto, RelativeHisto)
// 自动多阈值分割,指定类别数为3
auto_threshold(Image, Regions, 3)
auto_threshold会根据直方图的波峰波谷自动寻找分割点,适合直方图有明显峰谷特征的图像。
4.4.3 多阈值分割的注意事项
关键误区:多阈值分割并非简单地增加阈值数量就能提高分割精度。当类别数设置过多时,容易将噪声或灰度渐变区域误分为独立类别。建议先通过直方图分析确定合理的类别数,再结合形态学后处理(如开运算、闭运算)优化分割结果。
4.5 方法对比与选型指南
| 方法 | 核心算子 | 适用场景 | 优点 | 局限性 |
|---|---|---|---|---|
| 全局阈值 | threshold | 光照均匀、目标背景灰度分离明显 | 简单快速、参数少 | 对光照变化敏感 |
| 自适应阈值 | binary_threshold / local_threshold | 光照渐变、局部阴影 | 自动计算阈值、适应局部变化 | 邻域大小需调试 |
| 动态阈值 | dyn_threshold | 纹理背景、微小目标提取 | 对背景建模、鲁棒性强 | 需额外生成背景图 |
| 多阈值 | auto_threshold / 多次threshold | 多材料、多灰度等级 | 一次分割多类别 | 类别数需预设 |
4.6 工程案例:PCB焊点缺陷检测中的阈值分割
以PCB板焊点检测为例,说明不同阈值方法的选型过程:
- 全局阈值尝试:在均匀光照下,焊点与基板灰度差异明显,直接使用threshold(Image, Region, 120, 255)可快速提取焊点区域。
- 自适应阈值改进:当PCB板存在弯曲导致光照不均时,改用binary_threshold(Image, Region, 'max_separability', 'dark'),自动适应局部灰度变化。
- 动态阈值精细分割:若需检测焊点内部的微小裂纹(灰度差异仅5-10个灰度级),使用mean_image生成背景后,调用dyn_threshold(Image, Background, Region, 5, 'dark')提取细微缺陷。
4.7 常见误区与复盘
经验总结:阈值分割看似简单,但实际工程中80%的问题源于预处理不足。建议遵循以下流程:先做直方图分析(gray_histo)→ 确定灰度分布特征 → 选择合适的分割方法 → 后处理优化。切勿盲目堆叠算子,而应理解每种方法的数学本质和适用边界。
高频错误:① 忽略图像噪声直接阈值分割,导致大量孤立点;② 动态阈值中平滑核过大,将小目标也平滑掉;③ 多阈值分割时类别数设置过多,产生过分割;④ 未考虑灰度单位(8位图0-255 vs 16位图0-65535),导致阈值设置错误。
在实际项目中,建议将阈值分割视为粗分割步骤,后续结合形态学操作(开运算去噪、闭运算填补空洞)、连通域分析(connection)和特征提取(select_shape)完成精细的目标提取。通过合理组合本章所述的四类方法,可以应对绝大多数工业视觉场景中的分割需求。