OpenCV55:高动态范围成像|High Dynamic Range (HDR)
目标
在本章中,将学习
- 了解如何根据曝光顺序生成和显示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()
结果
不同的方法可以得到不同的结果,但是也要考虑到每种算法都有其他额外的参数,应该将它们附加以达到期望的结果。 最佳的实践就是尝试不同的方法,然后看看哪种方法最适合自己的场景
Debevec
Robertson
Mertenes Fusion
估计相机响应函数
摄像机响应函数(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)相关推荐
- Python+OpenCV:高动态范围(High Dynamic Range, HDR)
Python+OpenCV:高动态范围(High Dynamic Range, HDR) 目标 Learn how to generate and display HDR image from an ...
- wide dynamic range - WDR - 宽动态范围 - high dynamic range - HDR - 高动态范围
wide dynamic range - WDR - 宽动态范围 - high dynamic range - HDR - 高动态范围 高动态范围 (high dynamic range,HDR) 图 ...
- High Dynamic Range(HDR)图像介绍(一)
在工程技术领域,有许多涉及数字图像的应用程序.用它们创建的现代数码相机和扫描仪,采用先进的计算机图形处理技术,或用绘图程序制作.目前,大多数应用程序依赖在某种形式的图形表示上.数字图像在其生命周期中经 ...
- HDR(High Dynamic Range Imaging)在摄影中指高动态范围成像
HDR(High Dynamic RangeImaging)在摄影中指高动态范围成像.国内的教程基本语焉不详,找到一篇比较详尽的国外教程翻译出来,希望对大家有帮助.^_^ 原文地址:http://ph ...
- 高动态范围光照(High Dynamic Range Imaging,简称HDRI或HDR)
1 HDR基本概念 高动态范围光照(High Dynamic Range Imaging,简称HDRI或HDR),是一种表达超过了显示器所能表现的亮度范围的图像映射技术,已成为目前游戏应用不可或缺的 ...
- 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 ...
- 双冠!网易互娱AI Lab包揽NTIRE 2022高动态范围成像(HDR)两项冠军
点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 作者:网易互娱 AI Lab 点击进入-> CVer 微信技术交流群 近日网易互娱 AI Lab 获得 ...
- 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]提出 ...
- A comparative review of tone-mapping algorithms for high dynamic range video(高动态范围视频色调映射算法的比较研究)(二)
研读论文A comparative review of tone-mapping algorithms for high dynamic range video(高动态范围视频色调映射算法的比较研究) ...
- three.js入门篇6之 环境贴图、经纬线映射贴图与高动态范围成像HDR
目录 013-1 环境贴图 013-2 经纬度映射贴图与HDR 013-1 环境贴图 就是把周边的环境,贴在物体的表面之上 注意:px:x轴正向,nx:x轴负向 import * as THREE f ...
最新文章
- RAC 修改 DB 实例名 步骤
- 一些 Google 搜索词
- 使用Java Stream API将List按自定义分组规则转换成Map的一个例子
- various,variable,varied,different, diverse的区别
- mysql for update场景_一个mysql死锁场景实例分析
- 5-Mybatis 的输出结果封装
- [原]sencha touch之carousel
- 团队-象棋游戏-代码设计规范
- Tomcat下载及安装(Windows)
- Java后端通过图片URL获取图片并保存
- 飞翔的小鸟(FlyBird)游戏C语言编程(含撞柱子)
- 【MySQL基础 安装】CentOS 7 Yum网络部署 最新官方MySQL5 2020_2_1
- esxi添加硬盘驱动
- zabbix微信报警
- Gamma Correction sRGB texture
- MySQL数据库如何改名
- 因子完备数c语言,编写函数输出完备数及其所有约数
- 从浪潮之巅到千里之行,区块链能否实现赢家通吃?
- 计算机监控系统功能概述,物联网技术在计算机监控系统的应用
- 什么是云管平台?一个正在兴起的市场!