二值化技术详解

二值化技术详解

一、技术背景

二值化是图像处理中最基础的操作之一,它将灰度图像转换为只有黑白两色的图像。二值化后的图像便于进行轮廓检测、形态学操作、形状分析等后续处理。

本文详细介绍 Binary、BinaryInv、Otsu 等多种二值化模式的原理与区别,以及在 SEM 项目中 MorphologicalOperate.Binarize() 的应用。


二、数学原理

2.1 基本二值化(Binary)

基本二值化使用固定阈值将图像分为黑白两类:

g(x,y)={maxval,if f(x,y)>thresh0,otherwise g(x,y) = \begin{cases} maxval, & \text{if } f(x,y) > thresh \\ 0, & \text{otherwise} \end{cases} g(x,y)={maxval,0,if f(x,y)>threshotherwise

其中,threshthreshthresh 为阈值,maxvalmaxvalmaxval 为最大值(通常为255)。

2.2 反向二值化(BinaryInv)

反向二值化与基本二值化相反:

g(x,y)={maxval,if f(x,y)≤thresh0,otherwise g(x,y) = \begin{cases} maxval, & \text{if } f(x,y) \leq thresh \\ 0, & \text{otherwise} \end{cases} g(x,y)={maxval,0,if f(x,y)≤threshotherwise

2.3 截断二值化(Truncate)

截断二值化不改变低于阈值的像素:

g(x,y)={thresh,if f(x,y)>threshf(x,y),otherwise g(x,y) = \begin{cases} thresh, & \text{if } f(x,y) > thresh \\ f(x,y), & \text{otherwise} \end{cases} g(x,y)={thresh,f(x,y),if f(x,y)>threshotherwise

2.4 阈值归零(ThresholdToZero)

高于阈值的像素保持不变,低于阈值的设为0:

g(x,y)={f(x,y),if f(x,y)>thresh0,otherwise g(x,y) = \begin{cases} f(x,y), & \text{if } f(x,y) > thresh \\ 0, & \text{otherwise} \end{cases} g(x,y)={f(x,y),0,if f(x,y)>threshotherwise

2.5 反向阈值归零(ThresholdToZeroInv)

低于阈值的像素保持不变,高于阈值的设为0:

g(x,y)={0,if f(x,y)>threshf(x,y),otherwise g(x,y) = \begin{cases} 0, & \text{if } f(x,y) > thresh \\ f(x,y), & \text{otherwise} \end{cases} g(x,y)={0,f(x,y),if f(x,y)>threshotherwise

2.6 Otsu 自适应阈值

Otsu方法通过最大化类间方差自动确定阈值:

σb2(k)=ω0ω1(μ0−μ1)2 \sigma_b^2(k) = \omega_0\omega_1(\mu_0 - \mu_1)^2 σb2(k)=ω0ω1(μ0−μ1)2

最佳阈值 k∗=arg⁡max⁡kσb2(k)k^* = \arg\max_{k} \sigma_b^2(k)k∗=argmaxkσb2(k)


三、代码实现

以下代码来自 e:\SEM\Methods\MorphologicalOperate.cs

csharp 复制代码
public static Mat Binarize(Mat img)
{
    var gray = ToGray(img);
    Mat result = new Mat();
    Cv2.Threshold(gray, result, 0, 255, ThresholdTypes.Otsu | ThresholdTypes.BinaryInv);
    return result;
}

private static Mat ToGrayAndBinary(Mat img)
{
    var gray = ToGray(img);
    Cv2.Threshold(gray, gray, 0, 255, ThresholdTypes.Binary | ThresholdTypes.Otsu);
    return gray;
}

public static Mat ToGray(Mat img)
{
    if (img.Channels() > 1)
    {
        Mat gray = new Mat();
        Cv2.CvtColor(img, gray, ColorConversionCodes.BGR2GRAY);
        return gray;
    }
    return img.Clone();
}

二值化类型组合

在OpenCV中,可以通过位或运算组合不同的阈值类型:

csharp 复制代码
// Otsu + BinaryInv:自动阈值 + 反向二值化
Cv2.Threshold(gray, result, 0, 255, ThresholdTypes.Otsu | ThresholdTypes.BinaryInv);

// Otsu + Binary:自动阈值 + 正常二值化
Cv2.Threshold(gray, result, 0, 255, ThresholdTypes.Otsu | ThresholdTypes.Binary);

OpenCV API

csharp 复制代码
double Cv2.Threshold(
    Mat src,              // 输入灰度图像
    Mat dst,              // 输出图像
    double thresh,        // 阈值(Otsu时被忽略)
    double maxval,        // 最大值
    ThresholdTypes type   // 阈值类型
);

返回值为使用的阈值(Otsu时返回计算得到的阈值)。


四、参数调优

4.1 阈值类型选择

类型 特点 适用场景
Binary 亮区域为白,暗区域为黑 目标为亮色区域
BinaryInv 暗区域为白,亮区域为黑 目标为暗色区域(SEM图像常见)
Truncate 压缩高亮区域 限制过曝区域
ThresholdToZero 保留亮区域 提取亮特征
ThresholdToZeroInv 保留暗区域 提取暗特征

4.2 Otsu 与固定阈值的选择

场景 建议方法
图像光照均匀,有明确双峰 Otsu
图像光照变化大 自适应阈值(Adaptive Threshold)
需要稳定控制阈值 固定阈值
多幅图像批量处理 Otsu(自动适应每张图)

4.3 maxval 参数

通常设置为255(8位图像的最大值),但可以根据需要调整:

  • 设置为127:产生灰度二值图
  • 设置为1:产生0-1二值图

五、常见问题

Q1:使用 Otsu 时阈值参数设为多少?

解决方案 :使用 Otsu 时,thresh 参数会被忽略,可以设为任意值(通常设为0)。实际阈值由算法自动计算。

Q2:二值化结果全黑或全白?

原因:阈值设置不当或图像对比度极低。

解决方案

  • 使用 Otsu 自动确定阈值
  • 先进行 CLAHE 对比度增强
  • 检查图像直方图分布

Q3:目标区域在二值化后不连续?

原因:阈值选择不当,目标区域灰度分布不均匀。

解决方案

  • 使用形态学闭运算连接断裂区域
  • 考虑使用自适应阈值方法
  • 先进行高斯模糊平滑图像

Q4:如何获取 Otsu 计算的具体阈值?

csharp 复制代码
double threshold = Cv2.Threshold(gray, result, 0, 255, ThresholdTypes.Otsu | ThresholdTypes.Binary);
Console.WriteLine($"Otsu阈值: {threshold}");

Q5:Binary 和 BinaryInv 如何选择?

选择原则

  • 目标区域灰度值较高:使用 Binary
  • 目标区域灰度值较低:使用 BinaryInv

在 SEM 图像分析中,孔隙、裂纹等目标区域通常呈现为暗色(低灰度值),因此常用 BinaryInv。

Q6:Otsu 与自适应阈值的区别?

特性 Otsu 自适应阈值
阈值数量 全局1个 局部多个
适用场景 光照均匀 光照不均匀
计算速度 较慢
细节保留 一般
相关推荐
QT界面美化性能优化10 小时前
QT+AI:使用AI技术为QT应用程序赋能
c++·人工智能·qt·opencv·qt教程·qt6.3
AndrewHZ17 小时前
图像处理入门020 | 图像二值化:阈值分割基础 —— cv2.threshold 五种类型与自适应阈值铺垫
图像处理·opencv·文档扫描·阈值分割·图像二值化·trackbar·自适应阈值
格林威17 小时前
C# 相机Burst模式图像采集:使用相机内存配合OpenCvSharp和Halcon实现短时间的高速采集的方法
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
AI智图坊18 小时前
甩手图省事的技术原理:如何用“商品锁定”机制解决AI作图的一致性难题
大数据·人工智能·计算机视觉·ai作画·aigc·ai写作
笑霸final19 小时前
不用上传服务器!用 Vue3 + ONNX Runtime Web 在浏览器本地实现智能抠图
运维·前端·图像处理·ai·onnx·canva可画·web性能优化
TAN-90°-1 天前
Deep Learning for Computer Vision——Attention and Transformers
人工智能·深度学习·神经网络·机器学习·计算机视觉·cnn·机器翻译
OpenBayes1 天前
Qwen3.8-27B-FP8 降低大模型部署门槛,开启高效多模态智能体验;MiniMax H3-1K 发布千段视频测试数据集,全面评估 AI 视频生成能力
人工智能·深度学习·计算机视觉·自然语言处理·语音识别·多模态大模型
AI的探索之旅1 天前
97 个 OpenCV 实例(十三):目标跟踪,CamShift 反向投影
人工智能·opencv·目标跟踪
梦想的颜色1 天前
ComfyUI 深度硬核科普:节点式 AI 生成框架完整实战(安装、原理、使用场景、避坑)
人工智能·机器学习·计算机视觉·aigc·comfyui·ai视频·图生视频
动物园猫1 天前
草莓成熟度目标检测数据集:3类别、2,000张图像 | 目标检测
人工智能·目标检测·计算机视觉