Otsu 自适应阈值分割一、技术背景在图像处理中二值化是最基础也是最重要的操作之一。传统的固定阈值方法需要人工设定阈值对于不同光照条件的图像效果差异很大。Otsu算法大津算法是一种自动确定最佳阈值的方法通过最大化类间方差来自动选择最优分割阈值。本文介绍 Otsu 算法的原理以及在 SEM 项目中ThresholdTypes.Otsu和ThresholdTypes.BinaryInv的使用方法。二、数学原理2.1 直方图与阈值分割对于一幅灰度图像设LLL为灰度级数通常为256nin_ini​表示灰度值为iii的像素数总像素数为N∑i0L−1niN \sum_{i0}^{L-1} n_iN∑i0L−1​ni​。归一化直方图定义为piniN,i0,1,...,L−1 p_i \frac{n_i}{N}, \quad i 0, 1, ..., L-1pi​Nni​​,i0,1,...,L−12.2 类间方差最大化Otsu算法的核心思想是最佳阈值k∗k^*k∗应该使得前景和背景的类间方差最大。假设阈值kkk将图像分为两类C0C_0C0​背景类灰度范围[0,k][0, k][0,k]C1C_1C1​前景类灰度范围[k1,L−1][k1, L-1][k1,L−1]两类的概率为ω0∑i0kpi,ω1∑ik1L−1pi1−ω0 \omega_0 \sum_{i0}^{k} p_i, \quad \omega_1 \sum_{ik1}^{L-1} p_i 1 - \omega_0ω0​i0∑k​pi​,ω1​ik1∑L−1​pi​1−ω0​两类的均值为μ01ω0∑i0ki⋅pi,μ11ω1∑ik1L−1i⋅pi \mu_0 \frac{1}{\omega_0}\sum_{i0}^{k} i \cdot p_i, \quad \mu_1 \frac{1}{\omega_1}\sum_{ik1}^{L-1} i \cdot p_iμ0​ω0​1​i0∑k​i⋅pi​,μ1​ω1​1​ik1∑L−1​i⋅pi​全局均值为μT∑i0L−1i⋅piω0μ0ω1μ1 \mu_T \sum_{i0}^{L-1} i \cdot p_i \omega_0 \mu_0 \omega_1 \mu_1μT​i0∑L−1​i⋅pi​ω0​μ0​ω1​μ1​类间方差定义为σb2(k)ω0(μ0−μT)2ω1(μ1−μT)2ω0ω1(μ0−μ1)2 \sigma_b^2(k) \omega_0(\mu_0 - \mu_T)^2 \omega_1(\mu_1 - \mu_T)^2 \omega_0\omega_1(\mu_0 - \mu_1)^2σb2​(k)ω0​(μ0​−μT​)2ω1​(μ1​−μT​)2ω0​ω1​(μ0​−μ1​)2最佳阈值k∗k^*k∗满足k∗arg⁡max⁡kσb2(k) k^* \arg\max_{k} \sigma_b^2(k)k∗argkmax​σb2​(k)2.3 BinaryInv 类型BinaryInv反向二值化的数学定义为g(x,y){255,if f(x,y)≤T0,if f(x,y)T g(x,y) \begin{cases} 255, \text{if } f(x,y) \leq T \\ 0, \text{if } f(x,y) T \end{cases}g(x,y){255,0,​iff(x,y)≤Tiff(x,y)T​与普通二值化相反亮度值低于阈值的像素被设为白色255高于阈值的设为黑色0。在SEM图像分析中目标区域孔隙、颗粒等通常呈现为较暗的区域使用反向二值化可以将目标区域变为白色便于后续处理。三、代码实现以下代码来自e:\SEM\Methods\MorphologicalOperate.csprivatestaticMatToGrayAndBinary(Matimg){vargrayToGray(img);Cv2.Threshold(gray,gray,0,255,ThresholdTypes.Binary|ThresholdTypes.Otsu);returngray;}publicstaticMatBinarize(Matimg){vargrayToGray(img);MatresultnewMat();Cv2.Threshold(gray,result,0,255,ThresholdTypes.Otsu|ThresholdTypes.BinaryInv);returnresult;}使用说明Otsu | Binary 组合自动计算阈值高于阈值为255低于阈值为0Otsu | BinaryInv 组合自动计算阈值高于阈值为0低于阈值为255OpenCV APICv2.Threshold(Matsrc,// 输入灰度图像Matdst,// 输出二值图像doublethresh,// 阈值使用Otsu时此值被忽略doublemaxval,// 最大值通常为255ThresholdTypes type// 阈值类型);四、参数调优4.1 Otsu算法无需手动设置阈值Otsu算法的优势在于自动计算最优阈值用户无需关心具体的阈值数值。但可以结合其他技术进行优化技术说明高斯模糊在Otsu之前先进行高斯模糊减少噪声影响CLAHE先进行对比度增强使直方图双峰更明显形态学后处理二值化后使用开运算去除小噪声4.2 适用场景分析场景Otsu效果建议双峰直方图优秀直接使用单峰直方图一般考虑其他分割方法光照不均匀较差先进行光照校正或使用局部阈值低对比度一般先进行CLAHE增强五、常见问题Q1Otsu分割结果不理想怎么办原因图像直方图不具备明显的双峰特征。解决方案在Otsu之前进行CLAHE对比度增强考虑使用自适应阈值方法Adaptive Threshold对于复杂场景可以使用Kmeans聚类分割Q2为什么使用 BinaryInv 而不是 Binary原因在SEM图像中目标区域如孔隙通常呈现为较暗的灰度值。解决方案使用 BinaryInv 将暗色目标区域变为白色255这样便于后续的轮廓检测和面积计算Q3Otsu阈值计算耗时较长原因Otsu需要遍历所有灰度级计算方差。解决方案对于实时性要求高的场景可以使用查表法优化对于视频流可以只在第一帧计算阈值后续帧复用Q4如何获取Otsu计算出的具体阈值解决方案doublethresholdCv2.Threshold(gray,result,0,255,ThresholdTypes.Otsu|ThresholdTypes.Binary);// 返回值即为计算得到的阈值Console.WriteLine($Otsu阈值:{threshold});Q5图像中有多个目标区域Otsu效果不好原因Otsu假设图像只有前景和背景两类。解决方案使用Kmeans聚类分割见文章3使用多阈值Otsu方法使用分水岭算法