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);
   其中f为公式4, f1为公式4的倒数。注意如果迭代的结果不是收敛而是发散的话,很有可能是预设的g_T也就是t太大了。

结果显示

  显示的结果如下:
                   
                                                                被处理图像
                   
                                                                   结果图像


                   
                                                                被处理图像
                   
                                                              结果图像

你可能感兴趣的:(opencv,图形图像,图像处理,opencv,HDR)