[論文閱讀] ALM-HCS(高對比場景自適應對數對映)
文章: Adaptive Logarithmic Mapping for Displaying High Contrast Scenes
1. 論文目的
將高動態範圍影像對映到機器可以顯示的動態範圍, 作者提出了幾個要求:
The design of our tone mapping technique was guided by a few rules.
- It must provide consistent results despite the vast diversity of natural scenes and the possible radiance value inaccuracy found in HDR photographs.
- Additionally, it should be adaptable and extensible to address the current capabilities ofdisplaying methods and their future evolution.
- Tone mapping must capture the physical appearance of the scene, while avoiding the introduction of artifacts such as contrast reversal or black halos.
- The overall brightness of the output image must be faithful to the context. It must be “user-friendly” i.e., automatic in most cases, with a few in- tuitive parameters which provide possibility for adjustments.
- It must be fast for interactive and realtime applications while avoiding any trade-off between speed versus quality
總結起來就是:
- 具有普適性, 對所有影像都能適用, 而不是僅適用於某些特定的影像;
- 具有自適應性, 可以根據影像自身的情況調整引數;
2. 論文方法
論文方法歸納起來就是自適應對數變換(Adaptive Logarithmic Mapping) + gamma校正, 同時滿足上述要求:
- 對於普適性, 論文中使用公式1, 將影像輸出調整[0, 1], 再根據需要調整需要顯示的動態範圍(一般是[0,255]).
- 對於自適應性, 論文中使用對數變換 \(log_{base}(L_w+1)\) 來對影像的對比度進行調整, 其中,
base
是根據影像自身的資訊來進行調整的.
論文中的公式4就是上述過程的綜合:
其中, Lw
為影像中每個畫素的亮度, Lwmax
為影像中亮度最大值, Ldmax
為顯示最大值, 一般 Ldmax*0.01=1
, 引數b
對數函式的基底進行調整.
然後使用gamma校正來進一步調整影像. 因而論文方法步驟可以概括為:
- 自適應對數變換;
- gamma校正;
3. 論文核心
3.1 場景亮度對映到影像亮度-縮放因子很關鍵
論文中使用了一個縮放因子來調整影像對映後的整體亮度, 根據論文中的說明, 公式1可以更改為:
其中, 引數 Lwa
是很關鍵的, 這個會影響到影像最終的亮度, 如下圖所示為上述公式的在不同 Lwa
下的曲線:
圖中, 最上邊藍色的曲線為 Lwa=1
的情況, 與公式1是完全一樣的. 我們可以看到, 當 Lwa=1
時, 曲線斜率很大, 對映後畫素的亮度值會增加很大, 會導致影像整體偏亮, 對比度降低, 所以必須要有這個縮放因子.
如下所示影像測試結果(從左到右依次為: 原圖, lwa=1的影像, lwa=50的影像):
可以看到, 當Lwa=1
時, 影像亮度亮度過高, 對比度低.
3.2 自適應對數對映-基底很關鍵
為方便理解, 這裡將公式4調整為如下公式:
其中, Ldmax*0.01=1
省略了, 然後利用文中的換底公式2(\(log_{base}(x)=log(x)/log(base)\)), 可以將上式變換成公式4.
從上述調整後的公式可以看到, 對數變換的基底 base
很重要, 下圖為論文中給出的 log2(左圖) 和 log10(右圖) 的對比效果:
從圖中可以看到:
- log2 時影像整體偏亮, 對比度更強, 如右上角的暗部區域細節增強較好, 但對於較亮的區域, 如幾個窗戶則過度增強了, 出現了飽和, 丟失了細節;
- log10時影像整體偏暗, 對比度要低一些, 如右上角的暗部區域細節沒有得到很好的增強, 但對於較亮區域的細節則保持的很好, 如幾個窗戶的細節清晰;
因而, 如果使用固定的基底, 則適應所有影像, 不具備普適性, 所以基底很重要, 需要具有自適應性.
這裡對自適應性說明一下:
- 當亮度
Lw
越小, 公式中計算出來的基底base
就越小, 對數變換 \(log_{base}(L_w+1)\) 的值就越大, 亮度增加的越多; - 當亮度
Lw
越大, 公式中計算出來的基底base
就越大, 對數變換 \(log_{base}(L_w+1)\) 的值就越小, 亮度增加的越少;
對於不同的亮度, 計算出來的基底在[2,10]內取值, 因而可以做到自適應.
3.3 gamma校正
在自適應對數變換後, 論文中還使用了gamma校正來進一步調整影像亮度, 原因應該就是論文中的自適應對數變換效果還不夠好. 論文中使用的gamma變換為ITU-R BT.709
的改進, 其公式如下所示:
下圖所示為論文中方法實現的效果, gamma=2.2:
上圖依次為原圖, 自適應對數變換, 自適應對數變換+gamma校正, 可以看到, 自適應對數變化的效果還不夠好, 需要使用gamma校正來進一步提高影像效果.
4. 核心引數說明
4.1 縮放因子lwa
論文中使用場景亮度均值 Lwa
作為景亮度到影像亮度的縮放因子, 這是由於影像顯示的整體亮度由場景的整體亮度決定的, 從3.1中的曲線圖可以看到, 處理後影像的亮度與 lwa
成反相關:
lwa
越小, 處理後影像越亮提升越多lwa
越大, 處理後影像越亮提升越少
上面的關係可以這麼來解釋: Lwa
越小, 場景亮度越低, 亮度需要提高的就越多; Lwa
越大, 場景亮度越高, 亮度需要提升的就越少. 如下圖所示為不同 Lwa
的效果, b固定為0.85, 依次為50, 100, 150:
從圖中可以看到, 影像的亮度是依次降低的. 同時從3.1中的曲線圖可以看到, Lwa
越大, 變換曲線越接近於直線, 起到的作用也就越低.
4.2 偏置引數b
來看看引數b對影像亮度的影響, 如下圖所示為公式4在不同引數b的情況:
從上圖可以看到, b的情況與lwa情況有點類似, 都與影像亮度成反相關:
- b越小, 斜率越大, 處理後影像亮度提升越多
- b越大, 斜率越小, 處理後影像亮度提升越少
但b不能小於0.7. 從上圖可以看到, 當b<0.7是, 曲線不是單調函式, 且最終結果會大於1, 這樣處理後的影像有副作用, 如影像太亮, 且不能保持影像中畫素的相對大小. 論文中作者推薦b=0.85.
如下圖所示為不同b的效果, lwa固定為亮度均值, 依次為0.5, 0.7, 0.9:
從上圖可以看到, 當b=0.5時, 處理後影像並沒有太亮, 且也沒有出現副作用, 可能是由於lwa影響了b的效果.
4.3 lwa 與 b關係
從公式4中可以看到, 並沒有lwa, 這裡對公式改寫如下:
下圖為更改後, 不同引數的情況(b=0.5, 0.6, 0.7, 0.8, 0.9, 1.0):
從圖中可以看到, lwa的效果比b的效果要明顯些. 為了保持處理後的影像亮度的穩定性, 作者使用瞭如下公式來調整lwa:
對於公式4, b越小, 處理後影像越亮, 使用上述公式後, lwa越大, 影像亮度越小, b使影像亮度增加, lwa使影像亮度降低, 二者相互抵消. 如下圖所示:
從圖中可以看到, 影像亮度基本是恆定的, 但效果不是很理想, 因而還需要後續進行gamma校正處理.
4.4 最大數對數基底
如公式4中, 對最大數取對數時, 使用基底為10, 至於為什麼取10, 論文中給出的解釋是:
In the denominator decimal logarithm is used since the maximum luminance value in the scene is always re-sampled to decimal logarithm by the bias function.
而真正的原因應該是自適應 base
的取值為[2,10], 最大數對數基底要取這個裡面的最大值, 否則得到最大數就被放大, 會壓縮影像的亮度. 如下所示為基底為2的情況:
從圖中可以看到, 當最大值對數取基底為2時, 處理後影像亮度沒有達到最大值1, 影像亮度被壓縮.
4.5 引數設定小結
對於上述分析, 這裡總結下:
- 縮放因子lwa: 取影像亮度均值, 對處理後影像亮度影響較大, 對於較暗影像, 處理效果不是太理想, 需結合gamma校正;
- 引數b: 配合lwa使用, 對處理後影像亮度影響沒有lwa大;
- 最大數對數基底: 需取base取值範圍內的最大值, 否則影像亮度會被壓縮;
- gamma校正: gamma值, 目前僅測試了gamma=2.2, 根據影像亮度進行調整(需研究方法)效果應該會更好;
5. 最終實現
5.1 效果
使用引數為: lwa=亮度均值, b=[0.5, 0.7, 0.9], gamma=2.2, 最大數對數為log10, 最終效果如下(從左到右依次為: 原圖, b=0.5, b=0.7, b=0.9):
5.2 程式碼
作者開源了程式碼, 詳見這裡: http://resources.mpi-inf.mpg.de/tmo/logmap/. 這裡使用matlab實現了, 程式碼如下:
img_path = './src/test.jpg';
rgb = imread(img_path);
alm = alm_hcs(rgb);
alm_g = double(alm) / 255;
alm_g = gamma_function(alm_g, 2.2);
alm_g = uint8(alm_g * 255);
impair = cat(2, rgb, alm, alm_g);
imshow(impair)
function [alm] = alm_hcs(rgb, b, lwa)
rgb = double(rgb);
% RGB轉XYZ
xyz = colorConvert(rgb, 'rgb2xyz');
Y = xyz(:,:,2);
lwa = lwa / (1 + b - 0.85) ^ 5;
Y = Y / lwa;
lwmax = max(Y(:));
bias_p = log(b)/log(0.5);
div = log10(lwmax + 1);
base = 2 + power(Y / lwmax, bias_p) * 8;
Y_new = log(Y + 1) ./ log(base) / div;
% 同比例處理X,Z通道
scalefactor = Y_new ./ Y / lwa * 255;
scalefactor(Y == 0) = 0;
scalefactor = cat(3, scalefactor, scalefactor, scalefactor);
alm = scalefactor .* xyz;
alm = max(min(alm, 255), 0);
% XYZ轉RGB
alm = colorConvert(alm, 'xyz2rgb');
alm = uint8(alm);
end
唯一覺得美中不足是, 論文使用的是全域性對映, 沒有考慮區域性資訊來進一步增加對比度.