OpenCV 4.11.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 和 Jitendra Malik。从照片中恢复高动态范围辐射图。在ACM SIGGRAPH 2008课程中,第31页。ACM,2008。[68]
  2. Mark A Robertson、Sean Borman和Robert L Stevenson。通过多次曝光提高动态范围。在图像处理,1999年。ICIP 99。论文集。1999年国际会议上,第3卷,第159-163页。IEEE,1999。[227]
  3. Tom Mertens、Jan Kautz和Frank Van Reeth。曝光融合。在2007年计算机图形和应用,PG'07。第15届太平洋会议上,第382-390页。IEEE,2007。[188]
  4. 维基百科-HDR
  5. 从照片中恢复高动态范围辐射图(网页)