[csharp] using System; namespace SplashImaging { /// <summary> /// 图像处理大津法二值化阈值计算方法 /// </summary> public static partial class Binarize { /// <summary> /// 大津法计算阈值 /// </summary> /// <param name=grayArray>灰度数组</param> /// <returns>二值化阈值</returns> public static Int OtsuThreshold(Byte[] grayArray) { // 建立统计直方图 Int[] Histogram = new Int[]; ArrayClear(Histogram ) // 初始化 foreach (Byte b in grayArray) { Histogram[b]++; // 统计直方图 } // 总的质量矩和图像点数 Int SumC = grayArrayLength; // 总的图像点数 Double SumU = ; // 双精度避免方差运算中数据溢出 for (Int i = ; i < ; i++) { SumU += i * Histogram[i]; // 总的质量矩 } // 灰度区间 Int MinGrayLevel = ArrayFindIndex(Histogram NonZero) // 最小灰度值 Int MaxGrayLevel = ArrayFindLastIndex(Histogram NonZero) // 最大灰度值 // 计算最大类间方差 Int Threshold = MinGrayLevel; Double MaxVariance = ; // 初始最大方差 Double U = ; // 初始目标质量矩 Int C = ; // 初始目标点数 for (Int i = MinGrayLevel; i < MaxGrayLevel; i++) { if (Histogram[i] == ) continue; // 目标的质量矩和点数 U += i * Histogram[i]; C += Histogram[i]; // 计算目标和背景的类间方差 Double Diference = U * SumC SumU * C; Double Variance = Diference * Diference / C / (SumC C) // 方差 if (Variance > MaxVariance) { MaxVariance = Variance; Threshold = i; } } // 返回类间方差最大阈值 return Threshold; } /// <summary> /// 检测非零值 /// </summary> /// <param name=value>要检测的数值</param> /// <returns> /// true:非零 /// false:零 /// </returns> private static Boolean NonZero(Int value) { return (value != ) ? true : false; } } } |