using System;
namespace Splash.Imaging
{
/// <summary>
/// 圖像處理:疊代法二值化門檻值計算方法
/// </summary>
public static partial class Binarize
{
/// <summary>
/// 疊代法計算門檻值
/// </summary>
/// <param name="grayArray">灰階數組</param>
/// <returns>二值化門檻值</returns>
public static Int32 IterativeThreshold(Byte[,] grayArray)
{ // 建立統計直方圖
Int32[] Histogram = new Int32[256];
Array.Clear(Histogram, 0, 256); // 初始化
foreach (Byte b in grayArray)
{
Histogram[b]++; // 統計直方圖
}
// 總的品質矩和圖像點數
Int32 SumC = grayArray.Length; // 總的圖像點數
Int32 SumU = 0;
for (Int32 i = 1; i < 256; i++)
{
SumU += i * Histogram[i]; // 總的品質矩
}
// 确定初始門檻值
Int32 MinGrayLevel = Array.FindIndex(Histogram, NonZero); // 最小灰階值
Int32 MaxGrayLevel = Array.FindLastIndex(Histogram, NonZero); // 最大灰階值
Int32 T0 = (MinGrayLevel + MaxGrayLevel) >> 1;
if (MinGrayLevel != MaxGrayLevel)
{
for (Int32 Iteration = 0; Iteration < 100; Iteration++)
{ // 計算目标的品質矩和點數
Int32 U0 = 0;
Int32 C0 = 0;
for (Int32 i = MinGrayLevel; i <= T0; i++)
{ // 目标的品質矩和點數
U0 += i * Histogram[i];
C0 += Histogram[i];
}
// 目标的平均灰階值和背景的平均灰階值的中心值
Int32 T1 = (U0 / C0 + (SumU - U0) / (SumC - C0)) >> 1;
if (T0 == T1) break; else T0 = T1;
}
}
// 傳回最佳門檻值
return T0;
}
}
}