返回

阈值分割与自动阈值

Threshold & Auto Threshold - 从固定阈值到自动阈值选择
第三章 / 简单背景方法
参数面板

切换示例场景、阈值来源和输出类型;当前像素只看灰度值、阈值线和二值化结果之间的判断链。

自动计算阈值
107

由直方图类间方差最大化得到。

“阈值方法”决定 T 的来源;“输出类型”决定每个像素与 T 比较后的写入规则。
概念说明

阈值分割先决定什么

自动阈值方法根据灰度分布选择分割边界。图源:scikit-image thresholding 示例
任务

当需要从灰度图中把目标区域和背景区域分开时,只凭人工指定阈值容易受光照和场景变化影响。要先确定阈值 T 从哪里来,再确定每个像素与 T 比较后按什么规则写入结果。

思路

常用办法是人工拖动固定阈值;也可以让 OTSU 根据直方图<TeachingTerm term="类间方差" explanation="类间方差衡量按某个阈值分开后,前景类和背景类均值差异的大小;OTSU 选择让它最大的阈值。" />自动选 T,或者用 Kittler 按梯度加权估计前景与背景的分界。阈值确定后,再用 BINARY、TRUNC、TOZERO 等输出规则生成结果图。

观察

拖动阈值滑杆或切换阈值方法,观察直方图中的阈值线位置和结果图中的前景面积、边界如何一起变化;再切换输出类型,比较同一阈值下不同写入规则的区别。

灰度图48×32
示例场景:Lena 灰度图
阈值判定
T=107
OTSU 自动阈值
阈值结果48×32
BINARY,非零输出 183 / 1536
阈值选择曲线

蓝色柱表示灰度直方图,橙色曲线表示 OTSU 在每个候选阈值处的类间方差。红线为当前方法得到的阈值。

T=107OTSU 最大类间方差
阈值 107064128192255像素数 / 类间方差归一化显示灰度级

阈值来源:决定 T 从哪里来

固定阈值分割
F(x,y) = { 255 f(x,y)T 0 f(x,y)<T , T=107 , f(x0,y0) =75 F(x0,y0) =0
固定阈值由人工给定,适合光照稳定、目标与背景灰度差异明确的场景。
OTSU 最大类间方差
T* = argmax 0t255 σB2(t) σB2(t) = ω0(t) ω1(t) (μ0(t)-μ1(t)) 2 T* =107 , σB2(T*) =2033.78
OTSU 遍历全部候选阈值,选择背景类与目标类之间类间方差最大的阈值。
Kittler 梯度加权阈值
KT = grad(i,j) · f(i,j) grad(i,j) = 9305.4 72.9 = 128
教材版 Kittler 使用梯度作为权重,使边缘附近的灰度对全局阈值贡献更大。公式中 f(i,j) 为 0–255 字节灰度,与代码中的 image[y][x] * 255 对应。

输出类型:决定得到 T 后如何生成 dst 图像

OpenCV 的 `threshold_type` 包含两类信息:一类是输出规则,例如 BINARY、TRUNC、TOZERO;另一类是自动选阈值标志,例如 OTSU。 “阈值方法”表示 T 的来源,“输出类型”表示同一个 T 代入后每个像素如何写入结果图。

阈值来源

固定阈值由滑杆给定;OTSU 由直方图类间方差最大化得到;Kittler 由梯度加权灰度平均得到。

输出规则

输出类型不重新计算阈值,只规定 src(x,y) T 比较后写入 0、最大值、阈值或原灰度。

当前输出类型:BINARY
F(x,y) = { 255 f(x,y)T 0 f(x,y)<T , f(x0,y0) =75 , T=107 F(x0,y0) =0
大于等于阈值的像素输出最大值,其他像素输出 0。适合生成前景掩膜。

同一输入下的预设结果对照

下列结果均来自当前灰度图。三种阈值来源使用相同的 BINARY 输出规则,因此差异只来自阈值 T 的选择方式。

原始灰度图
输入
固定阈值T=128
人工指定
OTSUT=107
类间方差最大
KittlerT=128
梯度加权
课堂观察要点

固定阈值适合验证阈值线移动对分割结果的直接影响,但对光照和场景变化敏感。

OTSU 适合直方图具有较明显双峰的图像;当真实图像灰度分布复杂时,阈值仍可能只得到粗分割。

Kittler 使用梯度信息强调边界附近灰度,对边缘清晰的目标更敏感,但对噪声和纹理同样敏感。