我试图让一些与HDR相关的函数与opencvpython一起工作:特别是我试图重现OpenCV C++ HDR tutorial。不幸的是,生成的hdr图像/阵列显示为完全白色(所有值都是Inf)。这是一个MCVE。1.jpg、2.jpg、3.jpg均为870×580 RGB(柯达sRGB内部RGB显示器)jpg图像,曝光时间分别为1/3200、1/800和1/200。我已经用另外两个JPG图像集进行了测试,其中一个在Wikimedia上可用。在
>>> import cv2
>>> import numpy as np
>>>
>>> img = cv2.imread("1.jpg")
>>> img2 = cv2.imread("2.jpg")
>>> img3 = cv2.imread("3.jpg")
>>>
>>> images = np.array([img, img2, img3])
>>> times = np.array([1.0/3200,1.0/800,1.0/200])
>>>
>>> merger = cv2.createMergeDebevec()
>>> hdr = merger.process(images, times)
>>> hdr
array([[[ inf, inf, inf],
[ inf, inf, inf],
[ inf, inf, inf],
...,
[ inf, inf, inf],
[ inf, inf, inf],
[ inf, inf, inf]],
[[ inf, inf, inf],
[ inf, inf, inf],
[ inf, inf, inf],
...,
[ inf, inf, inf],
[ inf, inf, inf],
[ inf, inf, inf]],
[[ inf, inf, inf],
[ inf, inf, inf],
[ inf, inf, inf],
...,
[ inf, inf, inf],
[ inf, inf, inf],
[ inf, inf, inf]],
...,
[[ inf, inf, inf],
[ inf, inf, inf],
[ inf, inf, inf],
...,
[ inf, inf, inf],
[ inf, inf, inf],
[ inf, inf, inf]],
[[ inf, inf, inf],
[ inf, inf, inf],
[ inf, inf, inf],
...,
[ inf, inf, inf],
[ inf, inf, inf],
[ inf, inf, inf]],
[[ inf, inf, inf],
[ inf, inf, inf],
[ inf, inf, inf],
...,
[ inf, inf, inf],
[ inf, inf, inf],
[ inf, inf, inf]]], dtype=float32)
值得注意的是,“times”数组在合并过程呼叫
^{pr2}$我使用的是OpenCV版本:
>>> cv2.__version__
'3.0.0'
在合并过程调用具有以下签名:
>>> import inspect
>>> inspect.getdoc(merger.process)
'process(src, times, response[, dst]) -> dst or process(src, times[, dst]) -> dst'
在维利米尔的回答帮助下,我设法使它发挥作用。我的问题是我必须按照ev的降序构造图像数组。虽然Velimir的答案满足了我的需要,但我将其作为一个单独的答案,因为我想强调
times
数组代表的是曝光时间,而不是ev。我还添加了色调映射方法,该方法应该在构建辐射度贴图之后应用。在示例图像来自http://ttic.uchicago.edu/~cotter/projects/hdr_tools/
明亮的图像
正常图像
暗影
色调映射的结果图像
我不确定Debevec算法是如何工作的,但我设法得到了一个您要求的有效示例。注意第5行中图像(及其对应的ev)和乘法器的降序。玩一下乘法器,你可以得到稍微不同的结果。不知道发生了什么事,但似乎奏效了。给你:
EV+4.09.JPGEV+1.18.JPGEV-1.82.JPG
输出.JPG
相关问题 更多 >
编程相关推荐