首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C# 影像二值化處理實戰:動態閾值、有序抖動與 AForge.NET 應用全紀錄

     編輯:關於C

專案背景

硬體僅支援黑白顯示,需將彩色圖片二值化並盡量保留視覺細節。

基礎流程

  1. 灰度化:Gray = 0.299*R + 0.587*G + 0.114*B(人眼亮度權重)。
  2. 全域閾值:Gray > 127 ? 255 : 0,簡單但細節喪失嚴重。

進階算法:有序抖動

  • 使用抖動矩陣(如 Bayer 4×4)將誤差分散,視覺上產生灰階錯覺。
  • 輸出仍為純黑白,但細節保留度大幅提升。

AForge.NET 快速實現

using AForge.Imaging;
using AForge.Imaging.Filters;

Bitmap src = (Bitmap)Bitmap.FromFile("input.jpg");
src = Grayscale.CommonAlgorithms.RMY.Apply(src); // 灰度化
Bitmap bin = new OrderedDithering().Apply(src);  // 有序抖動二值化
bin.Save("output.png");

手寫灰度化(含 unsafe 指標優化)

private static Bitmap WeightGrayScale(Bitmap bmp, Func f) {
    var data = bmp.LockBits(new Rectangle(0,0,bmp.Width,bmp.Height),
        ImageLockMode.ReadWrite, bmp.PixelFormat);
    unsafe {
        byte* ptr = (byte*)data.Scan0;
        for (int y=0; y (byte)(0.299*r + 0.587*g + 0.114*b));

專案設定

  • 專案屬性 → Build → Allow unsafe code 勾選。
  • NuGet 安裝 AForge.Imaging。

算法對比圖(文字描述)

方法細節保留速度適用場景
固定閾值 128低極快簡單文檔、條碼
自適應閾值中中光照不均圖片
有序抖動高快照片、漸變圖、硬體黑白顯示
Floyd-Steinberg 擴散抖動最高較慢高品質列印

心得與建議

  • AForge.NET 封裝完善,優先用庫減少造輪子。
  • 自寫演算法時,unsafe + LockBits 是效能關鍵。
  • 灰度權重 0.299/0.587/0.114 來自 ITU-R BT.601,比平均法更符合人眼感知。
  • 二值化前可加高斯模糊降噪,提升 OCR/識別率。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved