空間域增強 (對比度拉伸、動態範圍壓縮) 直接操作像素灰度,對灰度分布集中、對比度低的影像效果有限。直方圖變換透過改變灰度機率分布,將集中的灰度拉開,顯著提升視覺對比度,讓細節清晰可辨。應用領域涵蓋醫學影像、遙感、刑偵、軍事偵測等。
影像灰度統計直方圖函數:
p(sk) = nk / n (k = 0, 1, ..., L-1)
nk:第 k 灰度級的像素數n:總像素數L:灰度級數 (8-bit 為 256)p(sk):灰度 sk 出現的機率估計直方圖反映影像灰度整體分布,透過增強程式干預改變分布,使灰度均勻分佈於完整動態範圍。
目標:將原始灰度直方圖從集中區間轉為全範圍均勻分布。
EH(s) 在 [0, L-1] 遞增 → 保持灰度順序0 ≤ EH(s) ≤ L-1 → 維持動態範圍tk = EH(sk) = Σ(ni/n) = Σ ps(si) (i=0 到 k)
離散化實作步驟:
pstktk = [(L-1) * tk + 0.5] (四捨五入取整)sk → tk 映射表// 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;
}
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);
}
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 全範圍 |
除均衡化外,可指定目標直方圖分布 (單映射/組映射),使影像符合特定視覺需求,如醫學影像標準化顯示。