Opencv中文网

大津法(Otsu)二值化:Threshold 自动阈值最佳用法详解

这是OpenCVSharp 中全局自动阈值化的标准用法,通过固定参数组合,实现无需手动设置阈值、全自动最优二值化,是图像处理中最常用的高阶写法。

Cv2.Threshold(
    src,        // 输入灰度图
    dst,        // 输出二值图
    0,          // 手动阈值(必须写 0)
    255,        // 最大值(白色)
    ThresholdTypes.Binary | ThresholdTypes.Otsu  // 核心:二值化 + 自动算阈值
);

这行代码到底是什么?一句话解释

手动阈值 + 自动阈值算法组合使用

再用这个最佳值做 Binary 二值化

不写死阈值 127

交给 Otsu(大津法) 自动计算全局最佳阈值

二、每个参数的特殊含义

1. thresh = 0

必须写 0!

写 0 代表:我不指定阈值,请 Otsu 算法自动计算

2. Type = Binary | Otsu

这是组合枚举,意思是:

  1. 先用 Otsu 自动算出最佳阈值 T
  2. 再用 Binary 规则做二值化:
    • 像素 > T → 255(白)
    • 像素 ≤ T → 0(黑)

3. 返回值(非常重要)

这个函数会返回算法自动算出的阈值

double bestThresh = Cv2.Threshold(...);

三、Otsu 大津法原理(简单易懂)

  1. 统计图像所有像素的灰度直方图
  2. 寻找一个最佳阈值 T
  3. 让分割后的前景和背景的差别最大(类间方差最大化)
  4. 适合:前景背景区分明显的图

四、适用场景(什么时候用它?)

适合

  • 光照均匀
  • 背景干净
  • 文字 / 物体与背景对比强
  • 不想手动调参
  • 简单二值化、轮廓提取、数字识别

不适合

  • 阴影、光照不均
  • 反光、局部过暗过亮
  • 复杂背景(这种用 AdaptiveThreshold

五、完整可运行代码

using OpenCVSharp;

class Program
{
    static void Main()
    {
        // 1. 读取图像
        Mat src = Cv2.ImRead("test.jpg", ImreadModes.Color);

        // 2. 转灰度(必须)
        Mat gray = new Mat();
        Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);

        // 3. Otsu 自动二值化(核心代码)
        Mat dst = new Mat();
        double bestT = Cv2.Threshold(
            gray, dst, 
            0,        // 必须 0
            255, 
            ThresholdTypes.Binary | ThresholdTypes.Otsu
        );

        // 输出自动计算的阈值
        System.Console.WriteLine($"Otsu 最佳阈值 = {bestT}");

        // 保存结果
        Cv2.ImWrite("otsu_result.jpg", dst);
    }
}

六、这种写法的 3 个巨大优点

  1. 全自动,不用手动调 100、120、127
  2. 效果稳定,比固定阈值更鲁棒
  3. 速度极快,比自适应阈值快很多

七、最常见错误

  1. thresh 不写 0 → Otsu 失效,变成普通二值化
  2. 传入彩色图 → 结果错误
  3. 和 AdaptiveThreshold 混淆 → Otsu 是全局,自适应是局部

总结

ThresholdTypes.Binary | ThresholdTypes.Otsu

全局自动二值化的黄金组合,简单、高效、免调参,是 OpenCV 最常用的高级用法。

copyright @重庆教主 WPF中文网 联系站长:(QQ)23611316 (微信)movieclip (QQ群).NET小白课堂:864486030 | 本文由WPF中文网原创发布,谢绝转载 渝ICP备2023009518号-1