加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

使用OpenCV 4.0映射HDR图像的色调

发布时间:2020-12-17 17:37:20 所属栏目:Python 来源:网络整理
导读:我想创建一个脚本,该脚本需要一个.HDR文件并将其色调映射为.JPG.我看了几个OpenCV tutorials,看来应该可以做到. 我写了这个脚本: import cv2import numpy as npfilename = "image/gg.hdr"im = cv2.imread(filename)cv2.imshow('',im.astype(np.uint8))cv2.w

我想创建一个脚本,该脚本需要一个.HDR文件并将其色调映射为.JPG.我看了几个OpenCV tutorials,看来应该可以做到.

我写了这个脚本:

import cv2
import numpy as np

filename = "image/gg.hdr"
im = cv2.imread(filename)

cv2.imshow('',im.astype(np.uint8))
cv2.waitKey(0)

tonemapDurand = cv2.createTonemapDurand(2.2)
ldrDurand = tonemapDurand.process(im.copy())

new_filename = filename + ".jpg"
im2_8bit = np.clip(ldrDurand * 255,255).astype('uint8')
cv2.imwrite(new_filename,ldrDurand)

cv2.imshow('',ldrDurand.astype(np.uint8))

根据教程应该工作.最后我得到的是黑色图像.我已验证它保存的结果是.JPG,以及输入图像(1.6兆像素HDR环境图)是有效的.HDR.

OpenCV应该能够根据the documentation加载.HDR.

我尝试重现链接的教程,并且该教程正常工作,所以问题出在.HDR图像中,有人知道该怎么做吗?

谢谢

编辑:我使用this HDR image.由于版权等原因,提供了一个链接而不是直接下载.

最佳答案
除了两个小错误外,您几乎就在那儿.

第一个错误是使用cv2.imread加载HDR图像而未指定任何flags.除非使用IMREAD_ANYDEPTH进行调用,否则数据将被缩减为8位,并且会丢失所有高动态范围.

当您确实指定IMREAD_ANYDEPTH时,图像将以32位浮点格式加载.该强度通常在[0.0,1.0]范围内,但是由于是HDR,所以该值超过1.0(在这种特殊情况下,它们达到约22).这意味着您将无法通过简单地将数据转换为np.uint8来可视化它(以一种有用的方式).您也许可以先将其归一化到标称范围内,或者使用缩放和修剪方法…随便找到合适的方法.由于早期的可视化与结果无关,因此我将跳过它.

第二个问题微不足道.您正确缩放并将色调映射的图像剪切回np.uint8,但是您再也不会使用它.

脚本

import cv2
import numpy as np

filename = "GoldenGate_2k.hdr"
im = cv2.imread(filename,cv2.IMREAD_ANYDEPTH)

tonemapDurand = cv2.createTonemapDurand(2.2)
ldrDurand = tonemapDurand.process(im)

im2_8bit = np.clip(ldrDurand * 255,255).astype('uint8')

new_filename = filename + ".jpg"
cv2.imwrite(new_filename,im2_8bit)

输出量

Sample Output

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读