thresholdOtsu算法

深入理解Otsu算法的原理、实现与应用

Otsu算法

Otsu算法是一种自动阈值选择方法,通过最大化类间方差来确定最优阈值,适用于双峰直方图的图像二值化。

算法原理

Otsu算法由日本学者Nobuyuki Otsu在1979年提出,是一种自动确定阈值的方法。该算法基于图像的灰度直方图,通过最大化前景和背景之间的类间方差来确定最优阈值。

flowchart TD A[输入灰度图像] --> B[计算直方图
统计各灰度级像素数] B --> C[初始化 t=0
最大类间方差=0] C --> D[t++] D --> E[按 t 分割
前景 (0~t) / 背景 (t~255)] E --> F[计算类间方差
σ²(t) = w0·w1·(μ0-μ1)²] F --> G{σ²(t) > 最大方差?} G -->|是 | H[更新最优阈值
t* = t] G -->|否 | I{t < 255?} H --> I I -->|是 | D I -->|否 | J[应用最优阈值 t*] J --> K[输出二值图像]
符号说明计算
w0, w1前景/背景权重像素数占比
μ0, μ1前景/背景均值平均灰度
σ²类间方差w0·w1·(μ0-μ1)²

算法的核心思想是找到一个阈值T,使得前景和背景之间的类间方差最大,或者等价地,使得前景和背景的类内方差最小。

设图像的灰度级为[0, L-1],第i个灰度级的概率为p_i,则:

ω₀(T) = Σᵢ₌₀ᵀ⁻¹ pᵢ (背景像素比例)

ω₁(T) = Σᵢ₌ᵀᴸ⁻¹ pᵢ (前景像素比例)

μ₀(T) = (Σᵢ₌₀ᵀ⁻¹ i × pᵢ) / ω₀(T) (背景平均灰度)

μ₁(T) = (Σᵢ₌ᵀᴸ⁻¹ i × pᵢ) / ω₁(T) (前景平均灰度)

类间方差 σ2ᵦ(T) = ω₀(T) × ω₁(T) × [μ₀(T) - μ₁(T)]2

最优阈值T*是使σ2ᵦ(T)最大的T值。

算法步骤

  1. 计算图像的灰度直方图
  2. 归一化直方图得到概率分布
  3. 遍历所有可能的阈值
  4. 对每个阈值计算类间方差
  5. 选择使类间方差最大的阈值
  6. 应用最优阈值进行二值化

Python实现

analytics 算法可视化

flowchart 算法流程图

flowchart LR A[灰度图] --> B[直方图] B --> C[遍历阈值] C --> D[类间方差] D --> E[最优阈值] E --> F[二值图]

算法优缺点

优点

  • 自动确定最优阈值
  • 基于统计学原理,理论基础扎实
  • 适用于双峰直方图的图像
  • 无需人工干预
  • 效果稳定可靠

缺点

  • 对于单峰或多峰直方图效果不佳
  • 对噪声敏感
  • 假设图像为双类问题
  • 计算复杂度相对较高
  • 对光照不均匀的图像效果有限

应用场景

  • 文档图像二值化
  • 医学图像分割
  • 工业检测
  • 图像预处理
  • 对象分割
  • 模式识别预处理
算法信息
  • 类型: 图像二值化
  • 适用: 灰度图像
  • 复杂度: O(M×N + L),其中M和N是图像尺寸,L是灰度级数
  • 参数: 无(自动计算)