空域增強直接操作像素灰度,對比度弱、灰度集中圖像效果有限。直方圖變換 從統計分布角度重塑灰度分佈,顯著提升視覺質量,廣泛應用於醫學、遙感、刑偵、軍事等領域。
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 灰度級。
目標:匹配指定目標直方圖。步驟:
t_k = EH(s_k)v_l = EH_u(u_l)t_k 映射到最接近的 v_l單映射規則 (SML):最小化 |Σp(s_i) - Σp_u(u_j)|。
// 文件頭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;
}
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);
}
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) | 保護邊緣、抑制噪聲放大 | 計算量大、參數敏感 | 醫學影像、細節增強 |
直方圖變換是基於概率統計的強大圖像增強工具。均衡化提供「免調參」的全局增強,規定化實現「可控」的目標匹配。VC++ 實現關鍵在於:正確解析 BMP 格式、三通道獨立處理、累積分佈精確計算、映射表高效應用。現代開發建議結合 OpenCV (equalizeHist, createCLAHE) 獲得產業級性能與穩定性。