OpenCV MergeMertens在Python与C++; 当我运行Python中的HDR MeTEN曝光融合时,我会得到奇怪的颜色伪像,当我在C++中运行完全相同的函数时,我不会得到这种颜色。(我刚跑完车)

OpenCV MergeMertens在Python与C++; 当我运行Python中的HDR MeTEN曝光融合时,我会得到奇怪的颜色伪像,当我在C++中运行完全相同的函数时,我不会得到这种颜色。(我刚跑完车),python,c++,opencv,hdr,Python,C++,Opencv,Hdr,在我看来,数据类型似乎存在一些问题,但我尝试了所有选项,但都无效。我做错什么了吗 我正在使用OpenCV 3.0.0运行Python3.5 64位 曝光图片取自维基百科: Python代码: 导入cv2 将numpy作为np导入 img_fn=[“640px stlouisarchmultextexev+4.09.jpg”, “640px StLouisArchMultExpEV+1.51.jpg”, “640px-stlouisarchmultextexev-1.82.jpg”, “640px

在我看来,数据类型似乎存在一些问题,但我尝试了所有选项,但都无效。我做错什么了吗

我正在使用OpenCV 3.0.0运行Python3.5 64位

曝光图片取自维基百科:

Python代码:

导入cv2
将numpy作为np导入
img_fn=[“640px stlouisarchmultextexev+4.09.jpg”,
“640px StLouisArchMultExpEV+1.51.jpg”,
“640px-stlouisarchmultextexev-1.82.jpg”,
“640px-stlouisarchmultexev-4.72.jpg”]
img_list=[cv2.imread(fn)表示img_fn中的fn]
#基于Mertens的曝光融合
mergeMertens=cv2.createMergeMertens()
resFusion=mergestens.process(img\u列表)
#将数据类型转换为8位并保存
resFusion_8bit=np.uint8(resFusion*255)
cv2.imwrite(“fusion.png”,resfusion8bit)
我在Python中得到的结果:

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


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

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

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)