熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

WPF:圖像處理(四)大津法

2022-06-13   來源: .NET編程 
    [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;
    }
    }
    }
From:http://tw.wingwit.com/Article/program/net/201311/13006.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.