当我在Python中运行HDR Mertens exposure fusion时,我得到了一些奇怪的颜色伪影,而在c++中运行完全相同的函数时却没有。(我只运行HDR Tutorial)
在我看来,数据类型有点问题,但我尝试了所有的选项,但都没用。我做错什么了吗?在
我用opencv3.0.0运行64位python3.5。在
曝光图片来自维基百科: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中得到的结果:
<强>我得到的结果C++:< /强>
这里发生的情况是由一些R,G,B子像素的8位上溢和下溢引起的。其中一些在融合后超出了
[0.0 .. 1.0]
的区间,与255相乘,结果为负值或大于255。在np.uint8
将截断结果,只保留最低有效的8位,因此例如:值
-2
将存储为254
值
257
将存储为1
这可以通过将结果裁剪到
[0 .. 255]
范围内来解决,替换与
^{pr2}$或者,可以直接将与255相乘的值传递给
imwrite
,而不首先将它们转换为uint8
,它将负责剪切。它将与在提供的C++示例中所做的相同。因此,脚本可以重写为:(请注意,我用
.JPG
-大写替换了文件扩展名,因为这是Wikipedia上的原始名称,我在Linux上运行过这个文件,其中的文件名区分大小写。)相关问题 更多 >
编程相关推荐