[論文閱讀] ALM-HCS(高對比場景自適應對數對映)

耳王東令發表於2021-08-22

[論文閱讀] ALM-HCS(高對比場景自適應對數對映)

文章: Adaptive Logarithmic Mapping for Displaying High Contrast Scenes

1. 論文目的

將高動態範圍影像對映到機器可以顯示的動態範圍, 作者提出了幾個要求:

The design of our tone mapping technique was guided by a few rules.

  1. It must provide consistent results despite the vast diversity of natural scenes and the possible radiance value inaccuracy found in HDR photographs.
  2. Additionally, it should be adaptable and extensible to address the current capabilities ofdisplaying methods and their future evolution.
  3. Tone mapping must capture the physical appearance of the scene, while avoiding the introduction of artifacts such as contrast reversal or black halos.
  4. 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.
  5. It must be fast for interactive and realtime applications while avoiding any trade-off between speed versus quality

總結起來就是:

  1. 具有普適性, 對所有影像都能適用, 而不是僅適用於某些特定的影像;
  2. 具有自適應性, 可以根據影像自身的情況調整引數;

2. 論文方法

論文方法歸納起來就是自適應對數變換(Adaptive Logarithmic Mapping) + gamma校正, 同時滿足上述要求:

  1. 對於普適性, 論文中使用公式1, 將影像輸出調整[0, 1], 再根據需要調整需要顯示的動態範圍(一般是[0,255]).

  1. 對於自適應性, 論文中使用對數變換 \(log_{base}(L_w+1)\) 來對影像的對比度進行調整, 其中, base 是根據影像自身的資訊來進行調整的.

論文中的公式4就是上述過程的綜合:

其中, Lw為影像中每個畫素的亮度, Lwmax為影像中亮度最大值, Ldmax為顯示最大值, 一般 Ldmax*0.01=1, 引數b對數函式的基底進行調整.

然後使用gamma校正來進一步調整影像. 因而論文方法步驟可以概括為:

  1. 自適應對數變換;
  2. 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

唯一覺得美中不足是, 論文使用的是全域性對映, 沒有考慮區域性資訊來進一步增加對比度.

相關文章