OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
高动态范围成像

下一篇教程: 高级图像拼接API(Stitcher类)

原始作者Fedor Morozov
兼容性OpenCV >= 3.0

简介

如今,大多数数字图像和成像设备使用每通道8位,这使得设备的动态范围限制在两个数量级(实际为256级),而人眼可以适应光照条件变化达十个数量级。当我们拍摄真实场景时,明亮区域可能会过曝,而黑暗区域可能会欠曝,因此我们无法通过单次曝光捕获所有细节。HDR成像处理的图像使用每通道超过8位(通常是32位浮点值),从而实现更宽的动态范围。

获取HDR图像有多种方法,但最常见的方法是使用不同曝光值拍摄的场景照片。为了结合这些曝光,了解相机的响应函数很有用,并且存在用于估计响应函数的算法。HDR图像混合后,必须将其转换回8位才能在常用显示器上查看。这个过程称为色调映射。当场景中的物体或相机在拍摄之间移动时,还会出现额外的复杂性,因为不同曝光的图像需要进行配准和对齐。

在本教程中,我们将演示如何从曝光序列生成和显示HDR图像。在我们的示例中,图像已对齐且没有移动物体。我们还将展示一种称为曝光融合的替代方法,它生成低动态范围图像。HDR处理管道的每个步骤都可以使用不同的算法实现,因此请查阅参考手册以查看所有算法。

曝光序列

源代码

示例图像

包含图像、曝光时间和 `list.txt` 文件的数据目录可以从此处下载。

解释

  • 加载图像和曝光时间

首先,我们从用户定义的文件夹中加载输入图像和曝光时间。该文件夹应包含图像和 list.txt 文件,该文件包含文件名和逆曝光时间。

对于我们的图像序列,列表如下:

memorial00.png 0.03125
memorial01.png 0.0625
...
memorial15.png 1024
  • 估计相机响应

对于许多HDR构建算法来说,了解相机响应函数(CRF)是必要的。我们使用其中一种校准算法来估计所有256个像素值的逆CRF。

  • 生成HDR图像

我们使用Debevec的加权方案,利用上一步计算出的响应来构建HDR图像。

  • 色调映射HDR图像

由于我们想在常见的LDR显示器上查看结果,我们必须将HDR图像映射到8位范围,同时保留大部分细节。这是色调映射方法的主要目标。我们使用带有双边滤波的色调映射器,并将伽马校正值设置为2.2。

  • 执行曝光融合

当不需要HDR图像时,还有一种合并曝光的替代方法。这个过程称为曝光融合,它生成不需要伽马校正的LDR图像。它也不使用照片的曝光值。

  • 写入结果

现在是时候查看结果了。请注意,HDR图像无法存储在常见的图像格式中,因此我们将其保存为Radiance图像(.hdr)。此外,所有HDR成像函数都返回[0, 1]范围内的结果,因此我们应该将结果乘以255。

您可以尝试其他色调映射算法:cv::TonemapDragocv::TonemapMantiukcv::TonemapReinhard。您还可以根据自己的照片调整HDR校准和色调映射方法中的参数。

结果

色调映射图像

曝光融合

附加资源

  1. Paul E Debevec and Jitendra Malik. Recovering high dynamic range radiance maps from photographs. In ACM SIGGRAPH 2008 classes, page 31. ACM, 2008. [70]
  2. 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. [230]
  3. 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. [191]
  4. 维基百科-HDR
  5. 从照片中恢复高动态范围辐射图(网页)