OpenCVPython createMergeDebevec返回一个In数组

2024-04-18 18:32:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图让一些与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'

Tags: 图像importhdrnparraycv2processmerger
2条回答

在维利米尔的回答帮助下,我设法使它发挥作用。我的问题是我必须按照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/

明亮的图像

Bright Image

正常图像

Normal Image

暗影 Dark Image

色调映射的结果图像 Combined Image

我不确定Debevec算法是如何工作的,但我设法得到了一个您要求的有效示例。注意第5行中图像(及其对应的ev)和乘法器的降序。玩一下乘法器,你可以得到稍微不同的结果。不知道发生了什么事,但似乎奏效了。给你:

EV+4.09.JPGenter image description hereEV+1.18.JPGenter image description hereEV-1.82.JPGenter image description here

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)

输出.JPGenter image description here

相关问题 更多 >