我试图让一些与HDR相关的函数与OpenCV-Python一起使用:具体来说,我正在尝试重现OpenCV C++ HDR tutorial。不幸的是,生成的hdr图像/阵列完全是白色的(所有值都是Inf)。这是一个MCVE。 1.jpg,2.jpg,3.jpg均为870×580 RGB(内部RGB KODAK sRGB显示器)JPG图像,曝光时间分别为1/3200,1 / 800和1/200。我已经使用其他2个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)
值得注意的一点是,在merger.process调用
之后修改了“times”数组>>> times
array([-8.07090609, -6.68461173, -5.29831737])
我正在使用OpenCV版本:
>>> cv2.__version__
'3.0.0'
merger.process调用具有如下签名:
>>> import inspect
>>> inspect.getdoc(merger.process)
'process(src, times, response[, dst]) -> dst or process(src, times[, dst]) -> dst'
答案 0 :(得分:1)
不确定Debevec算法是如何工作的,但我设法得到了一个你要求的工作示例。请注意图像(及其相应的EV)的降序和第5行的乘数。使用乘数进行游戏,结果会略有不同。不知道发生了什么,但似乎有效。你走了:
EV + 4.09.JPG EV + 1.18.JPG EV-1.82.JPG { {3}}
import cv2
import numpy as np
images = [cv2.imread(x) for x in 'EV+4.09.JPG', 'EV+1.18.JPG', 'EV-1.82.JPG']
times = np.array([4.09, 1.18, -1.82])
times *= 1000.
merger = cv2.createMergeDebevec()
hdr = merger.process(images, times)
print hdr
cv2.imwrite('out.jpg', hdr)
答案 1 :(得分:0)
我设法在Velimir的回答帮助下完成了工作。我的问题是我必须按照EV的降序构建图像阵列。虽然Velimir的答案符合我的要求,但我将其作为一个单独的答案,因为我想强调times
数组代表曝光时间而不是EV。我还添加了构建辐射贴图后应该应用的色调映射方法。
import cv2
import numpy as np
img = cv2.imread("bright.jpg") # Exposure time 1/8
img2 = cv2.imread("normal.jpg") # Exposure time 1/13
img3 = cv2.imread("dark.jpg") # Exposure time 1/15
images = [img, img2, img3]
times = np.array([1/8.,1/13.,1/15.])
merger = cv2.createMergeDebevec()
hdr = merger.process(images, times)
tonemap = cv2.createTonemapDurand(2.2)
tonemapped_image = tonemap.process(hdr)
cv2.imwrite('tonemapped_image.jpg', tonemapped_image * 255)
示例图片来自http://ttic.uchicago.edu/~cotter/projects/hdr_tools/
明亮的图像
普通图像