【问题标题】:OpenCV-Python createMergeDebevec returns an array of InfOpenCV-Python createMergeDebevec 返回一个 Inf 数组
【发布时间】:2015-12-23 10:46:41
【问题描述】:

我正在尝试让一些与 HDR 相关的函数与 OpenCV-Python 一起使用:特别是我正在尝试重现 OpenCV C++ HDR tutorial。不幸的是,生成的 hdr 图像/数组完全是白色的(所有值都是 Inf)。这是MCVE。 1.jpg、2.jpg、3.jpg 均为 870 × 580 RGB(内部 RGB KODAK sRGB Display)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)

需要注意的一个有趣的事情是“times”数组在merge.process调用之后被修改了

>>> times
array([-8.07090609, -6.68461173, -5.29831737])

我使用的是 OpenCV 版本:

>>> cv2.__version__
'3.0.0'

merge.process 调用的签名如下:

>>> import inspect
>>> inspect.getdoc(merger.process)
'process(src, times, response[, dst]) -> dst  or  process(src, times[, dst]) -> dst'

【问题讨论】:

  • 您介意分享您的 1,2 和 3.jpg 吗?这是为了错误再现的目的。或者您已经尝试过使用其他 JPG,但产生了相同的结果?另外,我的 PyCharm 似乎找不到 cv2 版本 3
  • 是的,我用两组不同的图像进行了尝试。如果我可以让它与任何一组图像一起工作,我会很满意。

标签: python opencv photography hdr


【解决方案1】:

不确定 Debevec 算法是如何工作的,但我设法得到了一个您要求的工作示例。请注意图像(及其对应的 EV)的降序和第 5 行的乘数。使用乘数,您会得到略有不同的结果。不知道发生了什么,但它似乎正在工作。给你:

EV+4.09.JPG EV+1.18.JPG EV-1.82.JPG p>

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)

OUT.JPG

【讨论】:

    【解决方案2】:

    在 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/

    明亮的图像

    普通图像

    暗图像

    色调映射结果图像

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-26
      • 1970-01-01
      相关资源
      最近更新 更多