【问题标题】:Tone mapping a HDR image using OpenCV 4.0使用 OpenCV 4.0 对 HDR 图像进行色调映射
【发布时间】:2019-02-12 20:23:04
【问题描述】:

我想创建一个脚本,它采用.HDR 文件并将其色调映射到.JPG。我看了几个OpenCV tutorials,看来应该可以做到这一点。

我写了这个脚本:

import cv2
import numpy as np

filename = "image/gg.hdr"
im = cv2.imread(filename)

cv2.imshow('', im.astype(np.uint8))
cv2.waitKey(0)

tonemapDurand = cv2.createTonemapDurand(2.2)
ldrDurand = tonemapDurand.process(im.copy())

new_filename = filename + ".jpg"
im2_8bit = np.clip(ldrDurand * 255, 0, 255).astype('uint8')
cv2.imwrite(new_filename, ldrDurand)

cv2.imshow('', ldrDurand.astype(np.uint8))

根据教程应该可以。我最终得到了一个黑色图像。我已经验证它保存的结果是.JPG,并且输入图像(1.6 兆像素的 HDR 环境图)是有效的.HDR

OpenCV应该可以根据the documentation加载.HDRs。

我已经尝试复制链接的教程并且工作正常,所以问题出在.HDR 图像中,有人知道该怎么做吗?

谢谢

编辑:我使用了this HDR image。由于版权等原因,提供链接而不是直接下载。

【问题讨论】:

  • 您能否提供一个示例 HDR 输入图像,我们可以用它来重现它?
  • @DanMašek 编辑了原始帖子,其中包含我正在尝试使用的 HDR 的链接。谢谢

标签: python opencv hdr


【解决方案1】:

除了两个小错误之外,您几乎完成了。

第一个错误是使用cv2.imread 加载HDR 图像而没有指定任何flags。除非您使用IMREAD_ANYDEPTH 调用它,否则数据将被缩小到 8 位,您将失去所有高动态范围。

当您指定IMREAD_ANYDEPTH 时,图像将被加载为 32 位浮点格式。这通常具有 [0.0, 1.0] 范围内的强度,但由于是 HDR,值超过 1.0(在这种特殊情况下,它们上升到大约 22)。这意味着您将无法通过简单地将数据转换为np.uint8 来可视化它(以有用的方式)。您也许可以首先将其标准化到标称范围内,或者使用比例和剪辑方法......任何您认为合适的方法。由于早期的可视化与结果无关,我将跳过它。

第二个问题是微不足道的。您正确地将色调映射图像缩放并剪辑回np.uint8,但您从未使用它。


脚本

import cv2
import numpy as np

filename = "GoldenGate_2k.hdr"
im = cv2.imread(filename, cv2.IMREAD_ANYDEPTH)

tonemapDurand = cv2.createTonemapDurand(2.2)
ldrDurand = tonemapDurand.process(im)

im2_8bit = np.clip(ldrDurand * 255, 0, 255).astype('uint8')

new_filename = filename + ".jpg"
cv2.imwrite(new_filename, im2_8bit)

输出

【讨论】:

  • 谢谢。我阅读了 imread 选项,但我可能错过了 IMREAD_ANYDEPTH。我正在使用 IMREAD_ANYCOLOR 来获取我认为是 IMREAD_ANYDEPTH 的内容。当然,第二个问题是由复制+粘贴引起的,因为我正在尝试这两个教程并试图将它们结合起来,因为没有一个有效(因为第一个问题)。非常感谢。
猜你喜欢
  • 2012-03-23
  • 2015-09-12
  • 1970-01-01
  • 2018-12-13
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多