gpt4 book ai didi

python - OpenCV MergeMertens 在 Python Vs 中给出了不同的结果。 C++

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:28 25 4
gpt4 key购买 nike

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

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

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

曝光图片取自维基百科: 1/30 sec , 1/4 sec , 2.5 sec , 15 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

最佳答案

这里发生的事情是由一些 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 替换了文件扩展名 - 大写,因为这是维基百科上的原始名称,我在 Linux 上运行过它,其中文件名区分大小写。)

关于python - OpenCV MergeMertens 在 Python Vs 中给出了不同的结果。 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34116354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com