OpenCV MergeMertens在Python与C++中给出不同的结果

2024-09-30 02:16:07 发布

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

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

在我看来,数据类型有点问题,但我尝试了所有的选项,但都没用。我做错什么了吗?在

我用opencv3.0.0运行64位python3.5。在

曝光图片来自维基百科: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中得到的结果:

enter image description here

<强>我得到的结果C++:< /强>

enter image description here


Tags: importimghdrnpseccv2listfn
1条回答
网友
1楼 · 发布于 2024-09-30 02:16:07

这里发生的情况是由一些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)

^{pr2}$

或者,可以直接将与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上运行过这个文件,其中的文件名区分大小写。)

相关问题 更多 >

    热门问题