目标

在本章中,将学习

  • 了解如何根据曝光顺序生成和显示HDR图像
  • 使用曝光融合来合并曝光序列

理论

高动态范围成像(High-dynamic-range imaging,HDRI或HDR)是一种用于成像和摄影的技术,可以比标准数字成像或摄影技术重现更大的动态亮度范围。虽然人眼可以适应各种光照条件,但是大多数成像设备每通道使用8位,因此仅限于256级。当拍摄现实世界的照片时,明亮的区域可能会曝光过度,而黑暗的区域可能会曝光不足,因此无法一次曝光获取到所有细节。HDR成像适用于每个通道使用8位以上(通常为32位浮点值)的图像,从而允许更大的动态范围。

获取HDR图像的方法有多种,但是最常见的一种方法是使用以不同曝光值拍摄的场景照片。要综合这些曝光,了解相机的响应功能以及估算算法的功能是非常有用的。合并HDR图像后,必须将其转

换回8位才能在常规显示器上查看。此过程称为色调映射(tonemapping)。当场景或摄像机的对象在两次拍摄之间移动时会增加其他复杂性,因为应记录并调整具有不同曝光度的图像。

在本教程中,将展示两种算法(Debevec,Robertson),根据曝光序列生成和显示HDR图像,并演示了另一种曝光融合(Mertens)的方法,**该方法可以生成低动态范围图像,并且不需要曝光时间数据。**此外,估计相机响应函数(camera response function,CRF)对于许多计算机视觉算法都具有重要价值。HDR流水线的每个步骤都可以使用不同的算法和参数来实现,具体可 以参考一些其它资料。

曝光序列HDR

在本教程中,将查看以下场景,其中有4张曝光图像,曝光时间分别为15、2.5、1/4和1/30秒 (可以从Wikipedia下载图像)

1 将曝光图像加载到列表中

第一阶段只是将所有图像加载到列表中。此外需要常规HDR算法的曝光时间。要注意数据类型,因为图像应该是1通道或3通道8-bit(np.uint8),曝光时间的类型是float32

import cv2
import numpy as np# load exposure images into a list
img_fn = ["img0.JPG", "img1.JPG", "img2.JPG", "img3.JPG"]
img_list = [cv2.imread(fn) for fn in img_fn]
exposure_times = np.array([15.0, 2.5, 0.25, 0.0333], dtype=np.float32)

2 将曝光合成HDR图像

在此阶段,将曝光序列合并为一张HDR图像。OpenCV中有两种可能性。

  • 第一种方法是Debevec
  • 第二种方法是Robertson

注意,HDR图像的类型为float32,而不是uint8,因为它包含所有曝光图像的完整动态范围。

# merge exposures to HDR image
merge_debevec = cv2.createMergeDebevec()
hdr_debevec = merge_debevec.process(img_list, times=exposure_times.copy())
merge_robertson = cv2.createMergeRobertson()hdr_robertson = merge_robertson.process(img_list, times=exposure_times.copy())

3 色调映射HDR图像

将32位浮点HDR数据映射到[0…1]范围内。实际上,在某些情况下,该值可以大于1或小于0,稍后需要剪辑数据以避免溢出。

# Tonemap HDR image
tonemap1 = cv2.createTonemap(gamma=2.2)
res_debevec = tonemap1.process(hdr_debevec)res_robertson = tonemap1.process(hdr_robertson)

4 使用Mertens融合曝光

在这里展示一种替代算法,用于合并曝光图像,而且不需要曝光时间,也不需要使用任何色调映射算法,因为Mertens算法已经为我们提供了[0…1]范围内的结果。

# Exposure fusion using mertens
merge_mertens = cv2.createMergeMertens()
res_mertens = merge_mertens.process(img_list)

5 转为8-bit并保存

为了保存或显示结果,需要将数据转换为[0…255]范围内的8位整数。

# convert datatype to 8-bit and save
res_debevec_8bit = np.clip(res_debevec*255, 0, 255).astype('uint8')
res_robertson_8bit = np.clip(res_robertson*255, 0, 255).astype('uint8')
res_mertens_8bit = np.clip(res_mertens*255, 0, 255).astype('uint8')cv2.imwrite("ldr_debevec.jpg", res_debevec_8bit)
cv2.imwrite("ldr_robertson.jpg", res_robertson_8bit)
cv2.imwrite("ldr_mertens.jpg", res_mertens_8bit)plt.subplot(131)
plt.imshow(res_debevec_8bit)plt.subplot(132)
plt.imshow(res_robertson_8bit)plt.subplot(133)
plt.imshow(res_mertens_8bit)plt.show()

结果

不同的方法可以得到不同的结果,但是也要考虑到每种算法都有其他额外的参数,应该将它们附加以达到期望的结果。 最佳的实践就是尝试不同的方法,然后看看哪种方法最适合自己的场景

估计相机响应函数

摄像机响应函数(CRF)使得我们可以将场景辐射度与测量强度值联系起来。CRF在某些计算机视觉算法(包括HDR算法)中非常重要。在这里,估计逆相机响应函数并将其用于HDR并。

# Estimate camera response function (CRF)
cal_debevec = cv2.createCalibrateDebevec()
crf_debevec = cal_debevec.process(img_list, times=exposure_times)
hdr_debevec = merge_debevec.process(img_list, times=exposure_times.copy(), response=crf_debevec.copy())
cal_robertson = cv2.createCalibrateRobertson()
crf_robertson = cal_robertson.process(img_list, times=exposure_times)
hdr_robertson = merge_robertson.process(img_list, times=exposure_times.copy(), response=crf_robertson.copy())x = np.arange(256)plt.subplot(121)
plt.plot(x, crf_debevec[:, 0, 0], c='r', marker='o')
plt.plot(x, crf_debevec[:, 0, 1], c='g', marker='o')
plt.plot(x, crf_debevec[:, 0, 2], c='b', marker='o')
plt.xplt.subplot(122)
plt.plot(x, crf_robertson[:, 0, 0], c='r', marker='o')
plt.plot(x, crf_robertson[:, 0, 1], c='g', marker='o')
plt.plot(x, crf_robertson[:, 0, 2], c='b', marker='o')
plt.show()

相机响应函数由每个颜色通道的256长度向量表示。 对于此序列,得到以下估计:

附加资源

  • https://docs.opencv.org/4.5.5/d2/df0/tutorial_py_hdr.html
  • Paul E Debevec and Jitendra Malik. Recovering high dynamic range radiance maps from photographs. In ACM SIGGRAPH 2008 classes, page 31. ACM, 2008
  • Mark A Robertson, Sean Borman, and Robert L Stevenson. Dynamic range improvement through multiple exposures. In Image Processing, 1999. ICIP 99. Proceedings. 1999 International Conference on, volume 3, pages 159–163. IEEE, 1999.
  • Tom Mertens, Jan Kautz, and Frank Van Reeth. Exposure fusion. In Computer Graphics and Applications, 2007. PG’07. 15th Pacific Conference on, pages 382–390. IEEE, 2007
  • Images from Wikipedia-HDR

OpenCV55:高动态范围成像|High Dynamic Range (HDR)相关推荐

  1. Python+OpenCV:高动态范围(High Dynamic Range, HDR)

    Python+OpenCV:高动态范围(High Dynamic Range, HDR) 目标 Learn how to generate and display HDR image from an ...

  2. wide dynamic range - WDR - 宽动态范围 - high dynamic range - HDR - 高动态范围

    wide dynamic range - WDR - 宽动态范围 - high dynamic range - HDR - 高动态范围 高动态范围 (high dynamic range,HDR) 图 ...

  3. High Dynamic Range(HDR)图像介绍(一)

    在工程技术领域,有许多涉及数字图像的应用程序.用它们创建的现代数码相机和扫描仪,采用先进的计算机图形处理技术,或用绘图程序制作.目前,大多数应用程序依赖在某种形式的图形表示上.数字图像在其生命周期中经 ...

  4. HDR(High Dynamic Range Imaging)在摄影中指高动态范围成像

    HDR(High Dynamic RangeImaging)在摄影中指高动态范围成像.国内的教程基本语焉不详,找到一篇比较详尽的国外教程翻译出来,希望对大家有帮助.^_^ 原文地址:http://ph ...

  5. 高动态范围光照(High Dynamic Range Imaging,简称HDRI或HDR)

    1  HDR基本概念 高动态范围光照(High Dynamic Range Imaging,简称HDRI或HDR),是一种表达超过了显示器所能表现的亮度范围的图像映射技术,已成为目前游戏应用不可或缺的 ...

  6. 2.1.2 Capturing HDR Videos(Advanced High Dynamic Range Imaging )

    2.1.2 Capturing HDR Videos(Advanced High Dynamic Range Imaging ) 目录 2.1.2 Capturing HDR Videos(Advan ...

  7. 双冠!网易互娱AI Lab包揽NTIRE 2022高动态范围成像(HDR)两项冠军

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 作者:网易互娱 AI Lab 点击进入-> CVer 微信技术交流群 近日网易互娱 AI Lab 获得 ...

  8. 3.2.3 Quantization Techniques(HDR量化)(Advanced High Dynamic Range Imaging)Schlick TMO

    3.2.3 Quantization Techniques(HDR量化)(Advanced High Dynamic Range Imaging)Schlick TMO Schlick [341]提出 ...

  9. A comparative review of tone-mapping algorithms for high dynamic range video(高动态范围视频色调映射算法的比较研究)(二)

    研读论文A comparative review of tone-mapping algorithms for high dynamic range video(高动态范围视频色调映射算法的比较研究) ...

  10. three.js入门篇6之 环境贴图、经纬线映射贴图与高动态范围成像HDR

    目录 013-1 环境贴图 013-2 经纬度映射贴图与HDR 013-1 环境贴图 就是把周边的环境,贴在物体的表面之上 注意:px:x轴正向,nx:x轴负向 import * as THREE f ...

最新文章

  1. RAC 修改 DB 实例名 步骤
  2. 一些 Google 搜索词
  3. 使用Java Stream API将List按自定义分组规则转换成Map的一个例子
  4. various,variable,varied,different, diverse的区别
  5. mysql for update场景_一个mysql死锁场景实例分析
  6. 5-Mybatis 的输出结果封装
  7. [原]sencha touch之carousel
  8. 团队-象棋游戏-代码设计规范
  9. Tomcat下载及安装(Windows)
  10. Java后端通过图片URL获取图片并保存
  11. 飞翔的小鸟(FlyBird)游戏C语言编程(含撞柱子)
  12. 【MySQL基础 安装】CentOS 7 Yum网络部署 最新官方MySQL5 2020_2_1
  13. esxi添加硬盘驱动
  14. zabbix微信报警
  15. Gamma Correction sRGB texture
  16. MySQL数据库如何改名
  17. 因子完备数c语言,编写函数输出完备数及其所有约数
  18. 从浪潮之巅到千里之行,区块链能否实现赢家通吃?
  19. 计算机监控系统功能概述,物联网技术在计算机监控系统的应用
  20. 什么是云管平台?一个正在兴起的市场!

热门文章

  1. win7 计算机定时关机脚本,win7怎么定时关机?win7定时关机设置两种方法
  2. RUBi: Reducing Unimodal Biases in Visual Question Answering
  3. Linux+bridge做透明网桥
  4. 高通QCC5100系列蓝牙音频模块芯片
  5. 每一代内存的读写速度
  6. 单相MOS全桥逆变电路(直流碳刷电机的MOS驱动电路)
  7. 【Windows 10 】关机后自动重启
  8. 五镜头无人机倾斜摄影POS编辑小程序
  9. 八皇后问题----Java实现
  10. Android RabbitMQ使用之RabbitMQ安装及配置