基于自适应阈值分割的图像二值化算法:Otsu(大津法)
字数 3597 2025-12-19 03:28:34

基于自适应阈值分割的图像二值化算法: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]\) 的像素。

计算两类的概率、均值和方差:

  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) \]

  1. 类均值

\[ \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)} \]

  1. 整幅图像的均值(与 \(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\)(因为至少一类非空),进行迭代:

  1. 更新 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{(递推更新均值)} \]

  1. \(w_1 = 0\)\(w_1 = 1\),跳过(一类为空,方差无意义)。
  2. 计算 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 \]

  1. 计算当前 \(k\) 下的类间方差:

\[ \sigma_B^2 = w_1 \cdot w_2 \cdot (\mu_1 - \mu_2)^2 \]

  1. \(\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)分开,类间差异最大。

五、算法特点与扩展

  • 优点
    1. 基于统计特性,无需人工设定阈值。
    2. 计算简单高效,复杂度 \(O(L)\)(L为灰度级数)。
    3. 对于具有双峰直方图的图像(前景和背景灰度分布明显分离)效果极佳。
  • 局限
    1. 假设图像仅包含两类(前景和背景),对于多类目标不适用。
    2. 对噪声敏感,噪声可能导致直方图多峰,影响阈值选择。
    3. 不适用于光照不均的图像(可能需结合局部阈值方法)。
  • 扩展
    1. 多级Otsu:推广到多个阈值,将图像分为多类。
    2. 局部Otsu:将图像分块,对每个子块应用Otsu,适应光照变化。
    3. 形态学操作结合,消除二值化后的细小噪声。

六、总结

Otsu 算法通过最大化类间方差,自动寻找最佳全局阈值,是图像二值化中最经典的自适应方法之一。其核心在于利用灰度直方图的统计特性,将阈值选择问题转化为优化问题。尽管存在局限,但其思想简洁、实现高效,为后续许多阈值分割方法奠定了基础。在实际应用中,常作为预处理步骤,为字符识别、目标检测等任务提供高质量的二值图像。

基于自适应阈值分割的图像二值化算法: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 算法通过最大化类间方差,自动寻找最佳全局阈值,是图像二值化中最经典的自适应方法之一。其核心在于利用灰度直方图的统计特性,将阈值选择问题转化为优化问题。尽管存在局限,但其思想简洁、实现高效,为后续许多阈值分割方法奠定了基础。在实际应用中,常作为预处理步骤,为字符识别、目标检测等任务提供高质量的二值图像。