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

影像直方圖均衡化:原理與 C++ 實作完整指南

     編輯:關於VC++

前言:為何需要直方圖增強

空間域增強 (對比度拉伸、動態範圍壓縮) 直接操作像素灰度,對灰度分布集中、對比度低的影像效果有限。直方圖變換透過改變灰度機率分布,將集中的灰度拉開,顯著提升視覺對比度,讓細節清晰可辨。應用領域涵蓋醫學影像、遙感、刑偵、軍事偵測等。

灰度直方圖數學基礎

影像灰度統計直方圖函數:

p(sk) = nk / n (k = 0, 1, ..., L-1)

  • nk:第 k 灰度級的像素數
  • n:總像素數
  • L:灰度級數 (8-bit 為 256)
  • p(sk):灰度 sk 出現的機率估計

直方圖反映影像灰度整體分布,透過增強程式干預改變分布,使灰度均勻分佈於完整動態範圍。

直方圖均衡化核心原理

目標:將原始灰度直方圖從集中區間轉為全範圍均勻分布。

增強函數條件

  1. 單調遞增:EH(s) 在 [0, L-1] 遞增 → 保持灰度順序
  2. 範圍一致:0 ≤ EH(s) ≤ L-1 → 維持動態範圍

累積分布函數 (CDF) 作為增強函數

tk = EH(sk) = Σ(ni/n) = Σ ps(si) (i=0 到 k)

離散化實作步驟:

  1. 統計原始影像各灰度級像素數
  2. 計算機率分布 ps
  3. 計算累積分布 tk
  4. 映射公式:tk = [(L-1) * tk + 0.5] (四捨五入取整)
  5. 建立 sk → tk 映射表
  6. 對每像素套用映射表完成轉換

C++ 實作程式碼 (24-bit BMP)

步驟 1:統計 R/G/B 三通道灰度分布

// BMP 檔頭 54 位元組,像素資料從位元組 54 開始
// 每像素 3 位元組:B, G, R 順序 (小端序)
for (DWORD i = 54; i < m_dwFileLen; i++) {
    ns_r[m_cpBuffer[i]]++;  // R 通道統計
    i++;
    ns_g[m_cpBuffer[i]]++;  // G 通道統計
    i++;
    ns_b[m_cpBuffer[i]]++;  // B 通道統計
}

// 計算機率分布
float totalPixels = (m_dwFileLen - 54) / 3.0f;
for (int i = 0; i < 256; i++) {
    ps_r[i] = ns_r[i] / totalPixels;
    ps_g[i] = ns_g[i] / totalPixels;
    ps_b[i] = ns_b[i] / totalPixels;
}

步驟 2:計算累積分布並建立映射表

for (int i = 0; i < 256; i++) {
    // 累積分布
    temp_r[i] = (i == 0) ? ps_r[i] : temp_r[i-1] + ps_r[i];
    temp_g[i] = (i == 0) ? ps_g[i] : temp_g[i-1] + ps_g[i];
    temp_b[i] = (i == 0) ? ps_b[i] : temp_b[i-1] + ps_b[i];

    // 映射到 0-255 並四捨五入
    ns_r[i] = (int)(255.0f * temp_r[i] + 0.5f);
    ns_g[i] = (int)(255.0f * temp_g[i] + 0.5f);
    ns_b[i] = (int)(255.0f * temp_b[i] + 0.5f);
}

步驟 3:套用映射表轉換像素

for (DWORD i = 54; i < m_dwFileLen; i++) {
    m_cpBuffer[i] = ns_r[m_cpBuffer[i]];  // R 通道映射
    i++;
    m_cpBuffer[i] = ns_g[m_cpBuffer[i]];  // G 通道映射
    i++;
    m_cpBuffer[i] = ns_b[m_cpBuffer[i]];  // B 通道映射
}

效果比較

處理前處理後 (均衡化)
影像過暗,細節不可見對比度大幅提升,細節清晰可辨
灰度集中在低亮度區間灰度均勻分佈於 0-255 全範圍

擴充:直方圖規定化

除均衡化外,可指定目標直方圖分布 (單映射/組映射),使影像符合特定視覺需求,如醫學影像標準化顯示。

關鍵效能優化提示

  • 使用查找表 (LUT) 避免重複計算
  • 平行化處理各通道 / 影像分塊
  • 整數運算替代浮點 (定點數)
  • SIMD 指令集 (SSE/AVX) 加速像素映射
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved