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

VC++ 直方圖均衡化修復曝光不足照片:演算法與實作全解析

     編輯:關於VC++

曝光不足導致照片灰度分布集中在低亮度區間,細節淹沒在暗部。本文介紹基於直方圖均衡化的自適應增強演算法,將灰度動態範圍拉伸至全域,顯著改善視覺效果,附完整 DIB 處理實作代碼。

問題分析與數學原理

曝光不足時,感光顆粒分解不完全,導致像素灰度值集中在 0~100 區間 (8-bit 灰度制)。直方圖均衡化通過累積分布函數 (CDF) 將原始灰度映射至均勻分布:

增強轉換方程:

$$s_k = T(r_k) = (L-1) \sum_{j=0}^k p_r(r_j) = (L-1) \sum_{j=0}^k \frac{n_j}{N}$$

  • $r_k$:第 k 級灰度 (0~255)
  • $n_j$:灰度 j 的像素計數
  • $N$:總像素數
  • $L$:灰度級數 (256)
  • 離散實作取整:$s_k = \text{round}((L-1) \cdot CDF(k))$

此轉換單調遞增,保證灰度順序不變,且輸出動態範圍固定為 [0, 255]。

演算法流程

  1. 統計各通道 (R/G/B) 灰度直方圖 $n_R, n_G, n_B$
  2. 計算機率密度 $p = n / (W \times H)$
  3. 累積得到 CDF,乘 255 並四捨五入產生映射表 $map[256]$
  4. 查表重映射每個像素通道值

關鍵實作代碼 (24-bit DIB)

1. 取得 DIB 像素指標與尺寸

LPSTR lpDIB = (LPSTR)::GlobalLock((HGLOBAL)hDIB);
LPSTR lpBits = m_clsDIB.FindDIBBits(lpDIB);
LONG w = m_clsDIB.DIBWidth(lpDIB);
LONG h = m_clsDIB.DIBHeight(lpDIB);

2. 統計直方圖 (R/G/B 獨立)

DWORD nR[256]={0}, nG[256]={0}, nB[256]={0};
for (int y=0; y<h; y++) {
    for (int x=0; x<w*3; x+=3) {
        nR[*(BYTE*)(lpBits + y*w*3 + x)]++;
        nG[*(BYTE*)(lpBits + y*w*3 + x + 1)]++;
        nB[*(BYTE*)(lpBits + y*w*3 + x + 2)]++;
    }
}

3. 建立映射表

float pR[256], pG[256], pB[256];
for (int i=0; i<256; i++) {
    pR[i] = nR[i] / (float)(w*h);
    pG[i] = nG[i] / (float)(w*h);
    pB[i] = nB[i] / (float)(w*h);
}

BYTE mapR[256], mapG[256], mapB[256];
float cdfR=0, cdfG=0, cdfB=0;
for (int i=0; i<256; i++) {
    cdfR += pR[i]; mapR[i] = (BYTE)(255.0f * cdfR + 0.5f);
    cdfG += pG[i]; mapG[i] = (BYTE)(255.0f * cdfG + 0.5f);
    cdfB += pB[i]; mapB[i] = (BYTE)(255.0f * cdfB + 0.5f);
}

4. 像素重映射

for (int y=0; y<h; y++) {
    for (int x=0; x<w*3; x+=3) {
        lpBits[y*w*3 + x]     = mapR[lpBits[y*w*3 + x]];
        lpBits[y*w*3 + x + 1] = mapG[lpBits[y*w*3 + x + 1]];
        lpBits[y*w*3 + x + 2] = mapB[lpBits[y*w*3 + x + 2]];
    }
}

效果對比與適用場景

  • 處理前:灰度集中 0~100,畫面發灰,細節不可見
  • 處理後:灰度擴展至 40~255,對比度大幅提升,暗部細節 (印章、落款、字幕) 清晰可見
  • 優勢:無需人工設定參數,對任意曝光不足圖像自適應效果良好
  • 局限:過度曝光、高對比度場景可能產生偽影;可嘗試 CLAHE (對比度受限自適應直方圖均衡) 改善

原始曝光不足照片

圖一 原始曝光不足照片

原始灰度直方圖

圖二 原始灰度直方圖 (集中於 0~100)

修復後照片 修復後直方圖

圖三 修復後照片與直方圖 (灰度均勻分布 40~255)

工程落地建議

  • 針對大圖可使用積分圖加速區域自適應均衡 (CLAHE)
  • 嵌入式裝置可預計算映射表固化為 LUT,實現零浮點運算實時處理
  • 支援 16-bit/浮點 HDR 圖像需擴展映射表精度與累積精度

本演算法在 Windows 98 + VC6 環境驗證通過,核心邏輯無平台相依性,易於移植至現代 C++、C#、Python (OpenCV equalizeHist) 等環境。

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