电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

WPF:图像处理(四)大津法


发布日期:2021/9/26
 
[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;

}

}

}

上一篇:Shell.Application对象使用

下一篇:CF开发Smartphone应用程序 FAQ