【问题标题】:OpenCV MergeMertens gives different results in Python Vs. C++OpenCV MergeMertens 在 Python Vs 中给出了不同的结果。 C++
【发布时间】:2015-12-06 10:27:27
【问题描述】:

当我在 Python 中运行 HDR Mertens 曝光融合时,我得到了奇怪的颜色伪影,而当我在 c++ 中运行完全相同的函数时却没有。 (我只是运行HDR Tutorial

在我看来,数据类型有些问题,但我尝试了所有选项,但没有任何效果。我做错了吗?

我正在使用 OpenCV 3.0.0 运行 Python 3.5 64 位。

曝光图片取自维基百科:1/30 sec1/4 sec2.5 sec15 sec

Python 代码:

import cv2
import numpy as np

img_fn = ["640px-StLouisArchMultExpEV+4.09.jpg",
          "640px-StLouisArchMultExpEV+1.51.jpg",
          "640px-StLouisArchMultExpEV-1.82.jpg",
          "640px-StLouisArchMultExpEV-4.72.jpg"]
img_list = [cv2.imread(fn) for fn in img_fn]

# Exposure fusion using Mertens
mergeMertens = cv2.createMergeMertens()
resFusion = mergeMertens.process(img_list)

# Convert datatype to 8-bit and save
resFusion_8bit = np.uint8(resFusion*255)
cv2.imwrite("fusion.png", resFusion_8bit)

我在 Python 中得到的结果:

我在 C++ 中得到的结果:

【问题讨论】:

    标签: python c++ opencv hdr


    【解决方案1】:

    这里发生的情况是由某些 R、G、B 子像素的 8 位上溢和下溢引起的。有的融合后超出区间[0.0 .. 1.0],乘以255,结果为负数或大于255。

    np.uint8 会截断结果,只保留最低有效 8 位,例如:

    • -2 的值将存储为 254

    • 257 的值将存储为 1

    这可以通过裁剪[0 .. 255]范围内的结果来解决,替换

    resFusion_8bit = np.uint8(resFusion*255)
    

    np.clip(resFusion*255, 0, 255, out=resFusion)
    resFusion_8bit = resFusion.astype('uint8')
    

    或者,可以直接将乘以 255 的值传递给imwrite,而不用先将它们转换为uint8,它会处理剪裁。这与在提供的 C++ 示例中所做的相同。所以,脚本可以改写为:

    import cv2
    
    img_fn = ["640px-StLouisArchMultExpEV+4.09.JPG",
              "640px-StLouisArchMultExpEV+1.51.JPG",
              "640px-StLouisArchMultExpEV-1.82.JPG",
              "640px-StLouisArchMultExpEV-4.72.JPG"]
    img_list = [cv2.imread(fn) for fn in img_fn]
    
    # Exposure fusion using Mertens
    mergeMertens = cv2.createMergeMertens()
    resFusion = mergeMertens.process(img_list)
    
    # Save
    cv2.imwrite("fusion.png", resFusion*255)
    

    (请注意,我将文件扩展名替换为 .JPG - 大写,因为这是 Wikipedia 上的原始名称,我在 Linux 上运行过它,文件名区分大小写。)

    【讨论】:

      猜你喜欢
      • 2020-02-16
      • 2021-10-30
      • 2020-03-19
      • 1970-01-01
      • 2023-03-14
      • 2021-02-03
      • 2015-08-21
      • 2015-09-26
      • 1970-01-01
      相关资源
      最近更新 更多