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

VC 直方圖變換圖像增強:均衡化與規定化算法完整實現

     編輯:VC 教學

圖像增強背景

空域增強直接操作像素灰度,對比度弱、灰度集中圖像效果有限。直方圖變換 從統計分布角度重塑灰度分佈,顯著提升視覺質量,廣泛應用於醫學、遙感、刑偵、軍事等領域。

核心數學模型

灰度直方圖

p(s_k) = n_k / n (k=0..L-1),n_k 為第 k 灰度級像素數,n 總像素數。

直方圖均衡化

目標:將集中分佈轉為均勻分佈。增強函數為累積分布函數 (CDF):


t_k = EH(s_k) = Σ_{i=0}^k p(s_i) = Σ_{i=0}^k n_i / n

離散化映射:t_k = round((L-1) * t_k),L=256 灰度級。

直方圖規定化

目標:匹配指定目標直方圖。步驟:

  1. 原圖均衡化:t_k = EH(s_k)
  2. 目標圖均衡化:v_l = EH_u(u_l)
  3. 反向映射:將 t_k 映射到最接近的 v_l

單映射規則 (SML):最小化 |Σp(s_i) - Σp_u(u_j)|。

VC++ 實現代碼解析(24位 BMP)

1. 統計三通道直方圖


// 文件頭54字節,數據按 BGR 順序,每像素3字節
for (DWORD i = 54; i < m_dwFileLen; i++) {
    ns_r[m_cpBuffer[i]]++; i++;  // R
    ns_g[m_cpBuffer[i]]++; i++;  // G
    ns_b[m_cpBuffer[i]]++;       // B
}

for (int i = 0; i < 256; i++) {
    float total = (m_dwFileLen - 54) / 3.0f;
    ps_r[i] = ns_r[i] / total;
    ps_g[i] = ns_g[i] / total;
    ps_b[i] = ns_b[i] / total;
}

2. 計算累積直方圖並映射


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

    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]]; i++; // R
    m_cpBuffer[i] = ns_g[m_cpBuffer[i]]; i++; // G
    m_cpBuffer[i] = ns_b[m_cpBuffer[i]];      // B
}

直方圖規定化具體實現

目標直方圖設計(增強高亮)


float a = 1.0f / (32.0f * 63.0f); // 64級,步長
for (int i = 0; i < 64; i++) {
    nu[i] = i * 4;    // 灰度值 0,4,8...252
    pu[i] = a * i;    // 概率線性增長
}

後續:計算目標累積分佈 → 雙向映射表構建 → 應用映射。

算法對比與選擇指南

方法優點缺點適用場景
直方圖均衡化自動、全局對比度最大化過度增強噪聲、不可控通用預處理、未知圖像
規定化(單映射)可控制目標分佈需先驗知識設計目標特定領域(醫學/遙感)標準化
規定化(組映射)精確匹配複雜分佈計算複雜、易過擬合高精度匹配需求
局部直方圖(CLAHE)保護邊緣、抑制噪聲放大計算量大、參數敏感醫學影像、細節增強

工程優化建議

  • 查表法:預計算 256 映射表,處理時直接查表 O(1)
  • 並行化:OpenMP 並行統計、映射應用
  • SIMD:AVX2 處理 32 像素/周期
  • 內存優化:就地修改、避免臨時緩衝區
  • 格式支持:擴展至 16/32 位、浮點、多光譜數據

總結

直方圖變換是基於概率統計的強大圖像增強工具。均衡化提供「免調參」的全局增強,規定化實現「可控」的目標匹配。VC++ 實現關鍵在於:正確解析 BMP 格式、三通道獨立處理、累積分佈精確計算、映射表高效應用。現代開發建議結合 OpenCV (equalizeHist, createCLAHE) 獲得產業級性能與穩定性。

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