Opencv中文网

固定阈值(Threshold)

Cv2.Threshold 是 OpenCVSharp 里的全局阈值化函数,作用:

  • 输入:单通道灰度图(常用)或 8bit/32bit 浮点多通道图
  • 功能:用同一个阈值对整张图所有像素做 “二值化 / 截断 / 置零” 等操作
  • 输出:和原图大小、类型一致的图像
  • 典型用途:二值化、图像分割、轮廓提取、去背景、文字增强
double Threshold(
    InputArray src,
    OutputArray dst,
    double thresh,
    double maxval,
    ThresholdTypes type
);

返回值:实际使用的阈值(手动阈值 = 你给的 thresh;Otsu / 三角 = 算法算出的值)

三、参数详细解释

1)src(输入图像)

  • 类型:Mat / InputArray
  • 要求:
    • 常用:单通道灰度图(Gray)
    • 也支持:8bit(CV_8U)或 32bit 浮点(CV_32F多通道
  • 建议:做二值化前务必先转灰度Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);

2)dst(输出图像)

  • 类型:Mat / OutputArray
  • 特性:
    • 无需手动创建,函数内部自动分配
    • 尺寸、通道、数据类型 和 src 完全一致

3)thresh(手动阈值)

  • 范围:0 ~ 255(对 8bit 图)
  • 含义:你设定的全局分割阈值
  • 特殊:用 Otsu / 三角法 时,thresh 直接写 0,函数会自动计算最佳阈值

4)maxval(最大值)

  • 范围:常用 255(白色)
  • 仅对 THRESH_BINARY / THRESH_BINARY_INV 生效:
    • 满足条件的像素 → 设为 maxval
    • 不满足 → 0

5)type(阈值类型,核心)

枚举:ThresholdTypes,共 5 基础类型 + 2 自动阈值标志

四、5 种基础阈值类型(公式 + 效果 + 场景)

设:src = 原像素值T = threshM = maxval

1. THRESH_BINARY(最常用:正向二值化)

dst = src > T ? M : 0
  • 效果:> 阈值 → 白;≤阈值 → 黑
  • 场景:提取亮目标(白纸黑字、亮物体)

2. THRESH_BINARY_INV(反向二值化)

dst = src > T ? 0 : M
  • 效果:> 阈值 → 黑;≤阈值 → 白
  • 场景:提取暗目标(黑底白字、暗物体)

3. THRESH_TRUNC(截断:过亮压制)

dst = src > T ? T : src
  • 效果:> 阈值 → 设为 T;其余不变
  • 场景:抑制高光、过曝区域,保留暗部细节

4. THRESH_TOZERO(低于阈值置零)

dst = src > T ? src : 0
  • 效果:> 阈值 → 保留原值;≤阈值 → 0
  • 场景:去除暗背景、保留亮区域

5. THRESH_TOZERO_INV(高于阈值置零)

dst = src > T ? 0 : src
  • 效果:> 阈值 → 0;≤阈值 → 保留原值
  • 场景:去除亮背景、保留暗区域

五、自动阈值:Otsu 与 三角法(必掌握)

当光照不均、无法手动选阈值时,用标志位组合

1)Otsu 大津法(THRESH_OTSU)

  • 原理:自动找阈值,使前景 / 背景类间方差最大
  • 前提:灰度直方图双峰(前景、背景分明)
  • 用法:type = ThresholdTypes.Binary | ThresholdTypes.Otsuthresh=0

2)三角法(THRESH_TRIANGLE)

  • 原理:基于直方图三角形几何拟合找阈值
  • 前提:直方图单峰 / 弱双峰(光照不均、对比度低)
  • 用法:type = ThresholdTypes.Binary | ThresholdTypes.Trianglethresh=0
public override Mat Execute(Mat image)
{
    // ThresholdValue 是 “分界线”,MaxValue 是 “超过分界线后要赋值的目标值”。
    //它们只有在 Binary 和 BinaryInv 模式下才会一起生效,其他模式下 MaxValue 完全没用。
    /* 像素值  >  阈值(ThresholdValue)
     *     → 设置为 MaxValue
     * 否则
     *     → 设置为 0
     */
    Mat dst = new Mat();
    Cv2.Threshold(image, dst, ThresholdValue, MaxValue, ThresholdType);
    return dst; 
}

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