HDR全局色調映射算法實現

簡介

  本篇主要對HDR功能,使用全局色調映射算法的實現。

具體實現

  HDR相關實現步驟,前面預研中已經提到過。
1、圖像配準:
   參考文檔:點擊打開鏈接,注意在這個步驟之後,加上一個稠密光流法配準,基本就可以用了。不過如果想優化時間,或者想得到更好的配準效果的話,就需要進一步研究,這裏不深入了,本篇只做簡單demo。
2、全亮度圖像獲取
   其核心爲相機響應曲線的擬合,具體方法參考論文:Recovering High Dynamic Range Radiance Maps from Photographs。其中的公式推導實現比較麻煩。不過在opencv3.1上已經有具體的c++實現代碼,可以從如下路徑直接獲取:./samples/cpp/tutorial_code/photo/hdr_imaging/hdr_imaging.cpp。缺點就是計算奇異分解比較花時間。
 3、色調映射
   在opencv自帶的例子hdr_imaging.cpp上,也有色調映射步驟,不過具體效果並不是很好,這裏我根據論文:Tone-mapping high dynamic range images by novel histogram adjustment,對色調映射步驟,使用全局映射方法進行了重寫,細節效果好了些,不過顏色有偏色,沒做調整還。

色調映射實現

   具體公式爲:
   Dmax和Dmin一般爲255和0,Imax和Imin爲全亮度圖像的最大最小值。I爲全亮度圖像的pixel,t(打不出符號,代替了)爲設置的參數。t越大,結果圖像越暗,越小,合成圖像越大。
   使用一個手動設置的t,也能得到結果圖像,如果想算法對大多數圖像能自動適配的話,那就需要求圖像的自適應t。根據公式:
                               
   A,B根據書上說可以設置爲0.4和2.不過我這裏是設置爲了0.4和0.1。求出Iave、Imax、Imin和K之後,使用牛頓迭代法求出t。
   牛頓迭代法核心代碼爲:
float g_T = 0.00001;
float x0=g_T;
do {
x0=g_T;
g_T=x0-f(x0, Iave, Imax, Imin, K)/f1(x0, Iave, Imax, Imin);
printf("x1:%f, f(x0):%f, f1(x0):%f\n",g_T, f(x0, Iave, Imax, Imin, K), f1(x0, Iave, Imax, Imin));
} while(fabs(g_T-x0) >=0.00001);
</pre></div></div></div><pre>   其中f爲公式4, f1爲公式4的倒數。注意如果迭代的結果不是收斂而是發散的話,很有可能是預設的g_T也就是t太大了。

結果顯示

  顯示的結果如下:
                   
                                                                被處理圖像
                   
                                                                   結果圖像


                   
                                                                被處理圖像
                   
                                                              結果圖像
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章