基于自适应阈值分割的图像二值化算法:Otsu(大津法)
一、算法背景与问题描述
在计算机视觉和图像处理中,图像二值化是将灰度图像(每个像素取值0-255)转化为仅包含黑(0)和白(255)两种颜色的二值图像的过程。二值化是许多视觉任务(如字符识别、目标分割、图像分析)的关键预处理步骤。二值化的核心在于选择一个合适的阈值 \(T\):像素值 \(\geq T\) 的置为255(白),否则置为0(黑)。
问题:如何自动确定最优阈值 \(T\),使得二值化后的图像能最大程度地区分前景(目标)和背景?特别是对于光照不均或对比度低的图像,固定阈值(如全局阈值128)效果很差。Otsu 算法(1979年提出)是一种基于图像灰度直方图的自适应阈值选择方法,其核心思想是通过最大化类间方差(between-class variance)来自动确定最佳阈值。
二、算法核心思想与数学原理
设图像灰度级为 \(L\)(通常为256),灰度级 \(i\) 的像素个数为 \(n_i\),总像素数 \(N = \sum_{i=0}^{L-1} n_i\)。灰度级 \(i\) 的概率为:
\[p_i = \frac{n_i}{N}, \quad \sum_{i=0}^{L-1} p_i = 1 \]
假设选择一个阈值 \(k\)(\(0 \leq k < L-1\)),将像素分为两类:
- C1类(背景):灰度级在 \([0, k]\) 的像素。
- C2类(前景):灰度级在 \([k+1, L-1]\) 的像素。
计算两类的概率、均值和方差:
- 类概率:
\[ w_1(k) = \sum_{i=0}^{k} p_i, \quad w_2(k) = \sum_{i=k+1}^{L-1} p_i = 1 - w_1(k) \]
- 类均值:
\[ \mu_1(k) = \frac{\sum_{i=0}^{k} i \cdot p_i}{w_1(k)}, \quad \mu_2(k) = \frac{\sum_{i=k+1}^{L-1} i \cdot p_i}{w_2(k)} \]
- 整幅图像的均值(与 \(k\) 无关):
\[ \mu_T = \sum_{i=0}^{L-1} i \cdot p_i = w_1(k) \mu_1(k) + w_2(k) \mu_2(k) \]
Otsu 的目标是最大化类间方差 \(\sigma_B^2(k)\),其定义为:
\[\sigma_B^2(k) = w_1(k) [\mu_1(k) - \mu_T]^2 + w_2(k) [\mu_2(k) - \mu_T]^2 \]
可以证明,最大化 \(\sigma_B^2(k)\) 等价于最小化类内方差(within-class variance),即选择阈值使得前景和背景的区分度最大。
进一步简化计算,利用关系 \(\mu_T = w_1 \mu_1 + w_2 \mu_2\),可得:
\[\sigma_B^2(k) = w_1(k) w_2(k) [\mu_1(k) - \mu_2(k)]^2 \]
这个形式计算更高效:只需遍历所有可能的 \(k\),找到使 \(\sigma_B^2(k)\) 最大的 \(k\) 作为最优阈值 \(T\)。
三、算法步骤详解
以下为 Otsu 算法的逐步计算过程:
步骤1:计算图像的灰度直方图
遍历图像所有像素,统计每个灰度级(0~255)出现的频数 \(n_i\),并计算概率 \(p_i = n_i / N\)。
步骤2:初始化参数
设总灰度级数 \(L = 256\),初始化:
- 最大类间方差 \(\sigma_B^2_{\text{max}} = -1\)
- 最优阈值 \(T = 0\)
- 累积概率 \(w_1 = 0\)(C1类的概率)
- 累积均值 \(\mu_1 = 0\)(C1类的灰度均值)
步骤3:遍历所有可能的阈值 \(k\)
从 \(k = 0\) 到 \(L-2\)(因为至少一类非空),进行迭代:
- 更新 C1 类的概率和均值:
\[ w_1 \leftarrow w_1 + p_k \]
\[ \mu_1 \leftarrow \frac{\mu_1 \cdot (w_1 - p_k) + k \cdot p_k}{w_1} \quad \text{(递推更新均值)} \]
- 若 \(w_1 = 0\) 或 \(w_1 = 1\),跳过(一类为空,方差无意义)。
- 计算 C2 类的概率和均值:
\[ w_2 = 1 - w_1 \]
\[ \mu_2 = \frac{\mu_T - w_1 \mu_1}{w_2} \quad \text{(利用总体均值关系)} \]
其中总体均值 \(\mu_T\) 可预先一次性算出:
\[ \mu_T = \sum_{i=0}^{L-1} i \cdot p_i \]
- 计算当前 \(k\) 下的类间方差:
\[ \sigma_B^2 = w_1 \cdot w_2 \cdot (\mu_1 - \mu_2)^2 \]
- 若 \(\sigma_B^2 > \sigma_B^2_{\text{max}}\),则更新:
\[ \sigma_B^2_{\text{max}} = \sigma_B^2, \quad T = k \]
步骤4:输出最优阈值 \(T\)
遍历完成后,\(T\) 即为使类间方差最大的阈值。
步骤5:图像二值化
根据阈值 \(T\) 对原灰度图像进行二值化:
- 若像素灰度值 \(\geq T\),置为255(白)。
- 否则置为0(黑)。
四、算法示例与直观理解
假设一个简单图像,灰度级仅0~4,直方图如下:
- 灰度级:0, 1, 2, 3, 4
- 像素数:1, 2, 4, 2, 1 (总像素 N=10)
- 概率 \(p_i\):0.1, 0.2, 0.4, 0.2, 0.1
计算总体均值 \(\mu_T = 0×0.1 + 1×0.2 + 2×0.4 + 3×0.2 + 4×0.1 = 2.0\)。
遍历 \(k\):
- 当 \(k=1\):C1={0,1}, C2={2,3,4}
\(w_1=0.3, \mu_1=(0×0.1+1×0.2)/0.3=0.667\)
\(w_2=0.7, \mu_2=(2×0.4+3×0.2+4×0.1)/0.7=2.571\)
\(\sigma_B^2 = 0.3×0.7×(0.667-2.571)^2 ≈ 1.143\) - 当 \(k=2\):C1={0,1,2}, C2={3,4}
\(w_1=0.7, \mu_1=(0×0.1+1×0.2+2×0.4)/0.7=1.429\)
\(w_2=0.3, \mu_2=(3×0.2+4×0.1)/0.3=3.333\)
\(\sigma_B^2 = 0.7×0.3×(1.429-3.333)^2 ≈ 0.762\)
比较得 \(k=1\) 时 \(\sigma_B^2\) 更大,因此最优阈值 \(T=1\)。直观上,该阈值将较暗像素(0,1)与较亮像素(2,3,4)分开,类间差异最大。
五、算法特点与扩展
- 优点:
- 基于统计特性,无需人工设定阈值。
- 计算简单高效,复杂度 \(O(L)\)(L为灰度级数)。
- 对于具有双峰直方图的图像(前景和背景灰度分布明显分离)效果极佳。
- 局限:
- 假设图像仅包含两类(前景和背景),对于多类目标不适用。
- 对噪声敏感,噪声可能导致直方图多峰,影响阈值选择。
- 不适用于光照不均的图像(可能需结合局部阈值方法)。
- 扩展:
- 多级Otsu:推广到多个阈值,将图像分为多类。
- 局部Otsu:将图像分块,对每个子块应用Otsu,适应光照变化。
- 与形态学操作结合,消除二值化后的细小噪声。
六、总结
Otsu 算法通过最大化类间方差,自动寻找最佳全局阈值,是图像二值化中最经典的自适应方法之一。其核心在于利用灰度直方图的统计特性,将阈值选择问题转化为优化问题。尽管存在局限,但其思想简洁、实现高效,为后续许多阈值分割方法奠定了基础。在实际应用中,常作为预处理步骤,为字符识别、目标检测等任务提供高质量的二值图像。