# Otsu_demo **Repository Path**: hephec321/otsu_demo ## Basic Information - **Project Name**: Otsu_demo - **Description**: Otsu_demo:一个专注于Otsu阈值分割算法实现的开源项目,适用于图像处理和计算机视觉领域的研究与应用。 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-12-01 - **Last Updated**: 2025-12-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 图像二值化算法原理与演示:从“一刀切”到“自动适应” 本项目旨在通过可视化的方式,通俗易懂地讲解图像处理中最基础也最重要的概念之一——**二值化(Binarization)**,并深入对比**固定阈值法**与**Otsu算法(大津法)**的原理及效果。 ## 1. 什么是二值化? 想象一下,你有一张灰色的照片(比如黑白报纸),上面的像素点有亮有暗。 **二值化**就是把这张照片变成只有**纯黑**和**纯白**两种颜色的过程。 * **白色 (255)**:代表“前景”或“目标”(比如纸上的字,或者我们例子中的杯子)。 * **黑色 (0)**:代表“背景”(比如纸张本身)。 要实现这个转变,我们需要一个裁判,叫做**阈值 (Threshold)**。 --- ## 2. 固定阈值法:简单的“一刀切” 固定阈值法是最简单粗暴的方法。我们预先设定一个固定的分数线(阈值 T)。 ### 规则 * 像素亮度 > T $\rightarrow$ 变成白色 * 像素亮度 <= T $\rightarrow$ 变成黑色 ### 存在的问题 这种方法最大的缺陷是**“死板”**。它假设所有图片的光照条件都是一样的。 我们在 `threshold_demo.py` 中模拟了一个场景(见下图),展示了不同阈值下的效果: ![固定阈值法演示](fixed_threshold_demo.png) * **情况一:阈值太低 (T=50)** * **后果**:门槛太低,导致背景里稍微亮一点的噪点都被误认为是目标。 * **结果**:画面充满噪点,目标不清晰。 * **情况二:阈值太高 (T=180)** * **后果**:门槛太高,只有目标最亮的核心区域能通过。 * **结果**:目标残缺不全,丢失了边缘细节。 * **情况三:阈值适中 (T=110)** * **后果**:对于这张特定的图,110恰好卡在背景和目标之间。 * **结果**:效果完美。 **结论**:如果没有上帝视角,我们很难猜到每张图的最佳阈值是多少。光照一变,固定的阈值就失效了。 --- ## 3. Otsu 算法(大津法):聪明的“自动适应” 为了解决“死板”的问题,日本学者大津展之(Nobuyuki Otsu)在1979年提出了一种算法。 它的核心思想是:**让程序自己分析图片,找到那个能把前景和背景分得最开的阈值。** ### 核心原理:最大类间方差 Otsu 算法认为,一个完美的阈值应该满足: 分出来的**“前景组”**和**“背景组”**,它们之间的**差别越大越好**。 在统计学里,我们用**“类间方差” (Inter-class Variance)** 来衡量这种差别。 ### 算法步骤(代码实现逻辑) 我们的脚本 `threshold_demo.py` 完整复现了这个过程: 1. **统计直方图**:数一数每个亮度级别(0-255)分别有多少个像素。 2. **暴力遍历**:从 0 到 255,假设每一个数值都是阈值 $t$。 3. **计算方差**:对于每一个假设的 $t$: * 计算背景的比例 ($w_0$) 和平均亮度 ($\mu_0$) * 计算前景的比例 ($w_1$) 和平均亮度 ($\mu_1$) * 计算区分度得分(方差):$\sigma^2 = w_0 \cdot w_1 \cdot (\mu_0 - \mu_1)^2$ 4. **选出冠军**:记录下得分最高的那个 $t$,它就是最佳阈值。 ### 演示结果 运行脚本后,我们得到了如下的可视化分析图: ![Otsu算法演示](otsu_demo.png) * **右上图(灰度直方图)**:展示了图片的亮度分布。 * **左下图(类间方差曲线)**:这是算法的“思考过程”。你可以看到曲线在 **T=104** 左右达到了最高峰。这说明在这一点,前景和背景被分得最开。 * **右下图(处理结果)**:使用自动计算出的阈值(T=104)进行二值化,效果非常清晰,无需人工干预。 --- ## 4. 如何运行代码 本项目使用 Python 编写,依赖 `numpy` 和 `matplotlib`。 ### 安装依赖 ```bash pip install numpy matplotlib ``` ### 运行演示 ```bash python threshold_demo.py ``` 运行结束后,会在当前目录生成上述两张分析图片。 --- *Created by Trae AI Assistant*