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太大了。

结果显示

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


                   
                                                                被处理图像
                   
                                                              结果图像
  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
全局色调影射(Global Tone Mapping)是一种用于处理高动态范围(HDR)图像的技术,它可以将图像的亮度范围缩小到显示设备的范围内,同时保持图像的细节和颜色信息。Python提供了许多库和工具来实现全局色调影射,包括OpenCV、scikit-imageImageMagick等。 以下是使用OpenCV实现全局色调影射的Python代码示例: ```python import cv2 # 读取HDR图像 hdr_image = cv2.imread('input.hdr', cv2.IMREAD_ANYDEPTH) # 使用Reinhard算法进行色调映射 reinhard_tone_map = cv2.createTonemapReinhard() ldr_image = reinhard_tone_map.process(hdr_image) # 将图像保存为JPEG格式 cv2.imwrite('output.jpg', ldr_image * 255) ``` 这段代码首先使用OpenCV的`imread`函数读取HDR图像,然后使用`createTonemapReinhard`函数创建Reinhard算法色调映射器。最后,将映射后的图像保存为JPEG格式。 除了Reinhard算法OpenCV还提供了其他的色调映射算法,如Durand算法和Mantiuk算法等。 另外,使用scikit-image实现全局色调影射的代码示例如下: ```python from skimage import exposure, io # 读取HDR图像 hdr_image = io.imread('input.hdr', plugin='imageio', dtype='float32') # 使用Clahe算法进行色调映射 clahe_tone_map = exposure.equalize_adapthist(hdr_image, clip_limit=0.03) # 将图像保存为JPEG格式 io.imsave('output.jpg', clahe_tone_map) ``` 这段代码使用scikit-image的`equalize_adapthist`函数创建Clahe算法色调映射器,将HDR图像映射为低动态范围(LDR)图像。最后,将映射后的图像保存为JPEG格式。 除了Clahe算法,scikit-image还提供了其他的色调映射算法,如Gamma校正、Sigmoid函数等。根据不同的应用场景和需求,可以选择不同的算法实现全局色调影射。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值