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

WPF:圖像處理二值化

2022-06-13   來源: .NET編程 
    using System;
   
    using SystemWindowsMedia;
   
    using SystemWindowsMediaImaging;
   
    namespace SplashImaging
   
    {
   
    /// <summary>
   
    /// 二值化方法
   
    /// </summary>
   
    public enum BinarizationMethods
   
    {
   
    Otsu       // 大津法
   
    Iterative   // 迭代法
   
    }
   
    /// <summary>
   
    /// 圖像處理圖像二值化
   
    /// </summary>
   
    public static partial class Binarize
   
    {
   
    /// <summary>
   
    /// 全局阈值圖像二值化
   
    /// </summary>
   
    /// <param name=bitmap>原始圖像</param>
   
    /// <param name=method>二值化方法</param>
   
    /// <param name=threshold>輸出全局阈值</param>
   
    /// <returns>二值化後的圖像數組</returns>
   
    public static Byte[] ToBinaryArray(this BitmapSource bitmap BinarizationMethods method out Int threshold)
   
    {   // 位圖轉換為灰度數組
   
    Byte[] GrayArray = bitmapToGrayArray()
   
    // 計算全局阈值
   
    if (method == BinarizationMethodsOtsu)
   
    threshold = OtsuThreshold(GrayArray)
   
    else
   
    threshold = IterativeThreshold(GrayArray)
   
    // 根據阈值進行二值化
   
    Int PixelHeight = bitmapPixelHeight;
   
    Int PixelWidth = bitmapPixelWidth;
   
    Byte[] BinaryArray = new Byte[PixelHeight PixelWidth];
   
    for (Int i = ; i < PixelHeight; i++)
   
    {
   
    for (Int j = ; j < PixelWidth; j++)
   
    {
   
    BinaryArray[ij] = ConvertToByte((GrayArray[ij] > threshold) ? :
   
    }
   
    }
   
    return BinaryArray;
   
    }
   


    /// <summary>
   
    /// 全局阈值圖像二值化
   
    /// </summary>
   
    /// <param name=bitmap>原始圖像</param>
   
    /// <param name=method>二值化方法</param>
   
    /// <param name=threshold>輸出全局阈值</param>
   
    /// <returns>二值化圖像</returns>
   
    public static BitmapSource ToBinaryBitmap(this BitmapSource bitmap BinarizationMethods method out Int threshold)
   
    {   // 位圖轉換為灰度數組
   
    Byte[] GrayArray = bitmapToGrayArray()
   
    // 計算全局阈值
   
    if (method == BinarizationMethodsOtsu)
   
    threshold = OtsuThreshold(GrayArray)
   
    else
   
    threshold = IterativeThreshold(GrayArray)
   
    // 將灰度數組轉換為二值數據
   
    Int PixelHeight = bitmapPixelHeight;
   
    Int PixelWidth = bitmapPixelWidth;
   
    Int Stride = ((PixelWidth + ) >> ) 《 ;
   
    Byte[] Pixels = new Byte[PixelHeight * Stride];
   
    for (Int i = ; i < PixelHeight; i++)
   
    {
   
    Int Base = i * Stride;
   
    for (Int j = ; j < PixelWidth; j++)
   
    {
   
    if (GrayArray[i j] > threshold)
   
    {
   
    Pixels[Base + (j 》 )] |= ConvertToByte(x 》 (j & x))
   
    }
   
    }
   
    }
   
    // 從灰度數據中創建灰度圖像
   
    return BitmapSourceCreate(PixelWidth PixelHeight PixelFormatsIndexed BitmapPalettesBlackAndWhite Pixels Stride)
   
    }
   
    }
   
    }


From:http://tw.wingwit.com/Article/program/net/201311/13277.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.