这是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
这是组合枚举,意思是:
- 先用 Otsu 自动算出最佳阈值 T
- 再用 Binary 规则做二值化:
- 像素 > T → 255(白)
- 像素 ≤ T → 0(黑)
3. 返回值(非常重要)
这个函数会返回算法自动算出的阈值:
double bestThresh = Cv2.Threshold(...);
三、Otsu 大津法原理(简单易懂)
- 统计图像所有像素的灰度直方图
- 寻找一个最佳阈值 T
- 让分割后的前景和背景的差别最大(类间方差最大化)
- 适合:前景背景区分明显的图
四、适用场景(什么时候用它?)
✅ 适合
- 光照均匀
- 背景干净
- 文字 / 物体与背景对比强
- 不想手动调参
- 简单二值化、轮廓提取、数字识别
❌ 不适合
- 阴影、光照不均
- 反光、局部过暗过亮
- 复杂背景(这种用 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 个巨大优点
- 全自动,不用手动调 100、120、127
- 效果稳定,比固定阈值更鲁棒
- 速度极快,比自适应阈值快很多
七、最常见错误
- thresh 不写 0 → Otsu 失效,变成普通二值化
- 传入彩色图 → 结果错误
- 和 AdaptiveThreshold 混淆 → Otsu 是全局,自适应是局部
总结
ThresholdTypes.Binary | ThresholdTypes.Otsu
是 全局自动二值化的黄金组合,简单、高效、免调参,是 OpenCV 最常用的高级用法。
若文章对您有帮助,可以激励一下我哦,祝您平安幸福!
| 微信 | 支付宝 |
|---|---|
![]() |
![]() |

