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

C# 偽彩色處理完整實現:強度分層法與灰度級彩色變換法雙演算法代碼詳解

     編輯:關於C#

**偽彩色** 將灰度影像映射為彩色,利用人眼對色彩分辨力遠高於灰階的特性,**增強細節可視性**,廣泛應用於熱成像、醫學影像、科學視覺化。本文實現兩大經典演算法並給出生產級 C# 代碼。

效果展示

偽彩色效果

演算法原理

1. 強度分層法 —— 簡單分段

  • 設定 M 個閾值平面切割灰度範圍,每段指派一固定顏色。
  • 實現簡單,但視覺階梯感強、細節過渡生硬。

2. 灰度級-彩色變換法 —— 連續漸變

  • 分別定義 R、G、B 三通道對灰度的映射函數,合成連續彩色。
  • 典型傳遞函數(見下圖):灰度 0-63 藍→青,64-127 青→綠,128-191 綠→黃,192-255 黃→紅。
  • RGB傳遞函數
  • 優點:色彩平滑過渡,**豐富層次感**,適合精細分析。

生產級代碼實現

/// 
/// 偽彩色處理主入口
/// 
/// 輸入 24bpp 灰度影像
/// true=灰度級彩色變換, false=強度分層
/// 分層數(僅分層法有效)
/// 24bpp 偽彩色影像
private Bitmap ApplyPseudoColor(Bitmap bmp, bool useColorTransform, byte segments) {
    // 僅支援 24bpp RGB
    if (bmp == null || bmp.PixelFormat != PixelFormat.Format24bppRgb) return null;

    var rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
    var bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat);
    IntPtr ptr = bmpData.Scan0;
    int bytes = bmp.Width * bmp.Height * 3;
    byte[] gray = new byte[bytes];
    Marshal.Copy(ptr, gray, 0, bytes);
    bmp.UnlockBits(bmpData);

    byte[] rgb = new byte[bytes];
    Array.Clear(rgb, 0, bytes);

    if (!useColorTransform) {
        // === 強度分層法 ===
        byte step = (byte)(256 / segments);
        for (int i = 0; i < bytes; i += 3) {
            byte level = (byte)(gray[i] / step);  // 0 ~ segments-1
            // 任意映射:這裡示範 R=反相, G=正相, B=0
            rgb[i]   = (byte)((segments - 1 - level) * step); // R
            rgb[i+1] = (byte)(level * step);                  // G
            rgb[i+2] = 0;                                     // B
        }
    } else {
        // === 灰度級-彩色變換法 ===
        for (int i = 0; i < bytes; i += 3) {
            byte g = gray[i];  // 灰度值 (三通道相同)
            if (g < 64) {           // 0-63: 藍→青
                rgb[i+2] = 0;           rgb[i+1] = (byte)(4 * g);     rgb[i] = 255;
            } else if (g < 128) {     // 64-127: 青→綠
                rgb[i+2] = 0;           rgb[i+1] = 255;               rgb[i] = (byte)(-4 * g + 510);
            } else if (g < 192) {     // 128-191: 綠→黃
                rgb[i+2] = (byte)(4 * g - 510); rgb[i+1] = 255;       rgb[i] = 0;
            } else {                  // 192-255: 黃→紅
                rgb[i+2] = 255;         rgb[i+1] = (byte)(-4 * g + 1020); rgb[i] = 0;
            }
        }
    }

    // 寫回新 Bitmap
    var result = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format24bppRgb);
    var outData = result.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
    Marshal.Copy(rgb, 0, outData.Scan0, bytes);
    result.UnlockBits(outData);
    return result;
}

關鍵技術細節

  • 格式限制:僅處理 Format24bppRgb(3 字節/像素),PNG 等 32bpp 含 Alpha 通道需另行處理。
  • 灰度判定:輸入影像三通道數值相同(R=G=B),讀取任一通道即為灰度值。
  • 記憶體模式:LockBits → Marshal.Copy → 陣列運算 → Marshal.Copy → UnlockBits,標準高性能管線。
  • 色彩映射表擴展:可預計算 256 長度的 Color[256] 查表替代運算,進一步提速。

實際應用場景

  • 熱成像測溫:低溫藍/青,高溫黃/紅,直觀識別熱點分佈。
    熱成像偽彩色
  • 醫學影像(CT/MRI)、地質勘探、天文圖像增強、工業缺陷檢測。

色彩映射法補充

預建 Dictionary<byte, Color> 或 Color[256] 映射表,灰度值直接查表取色,**靈活度最高**、支援任意色盤(如 Jet、Hot、Viridis 經典色盤),推薦作為通用擴展方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved