HRD
现在手机都有 HDR 的功能,我最开始接触 HDR 是在做动画是时候接触到 HDR,尤其是渲染动画场景,做环境球来给场景添加光照的时候都会使用 HDR 作为贴图,因为 HDR 中有丰富的曝光信息。便于调光。
有的时候我们想要天空拍摄蓝色一点,让整体看上去更加真实,不够这可能因为我们为了拍摄蓝色天空,而缩短的快门时间从而降低曝光时间,这样环境就会看了比较暗,如上图右侧效果,不过有了 HDR 这样问题就可以得到解决,一会儿我们会多 HDR 生成进行介绍并且用 python 代码来实现一个合成 HDR 效果。
相机HDR是指高动态光照渲染(High-Dynamic Range,简称HDR),这里的动态是指不同曝光,可以直接在图上条件图片亮度,其实就是预先在不同曝光(也就是快门时间)下拍摄多张图片进行合并为一张图像。这张图片可以提供更多光照信息,这样也便于后期处理。
import cv2
import numpy as np
def readImagesAndTimes():
# 表示不同曝光时间
times = np.array([ 1/30.0, 0.25, 2.5, 15.0 ], dtype=np.float32)
filenames = ["img_0.033.jpg", "img_0.25.jpg", "img_2.5.jpg", "img_15.jpg"]
images = []
for filename in filenames:
im = cv2.imread(filename)
images.append(im)
return images, times
if __name__ == '__main__':
# 读取图片和曝光时间
images, times = readImagesAndTimes()
# 将读入多张图片进行对齐
alignMTB = cv2.createAlignMTB()
alignMTB.process(images, images)
# 获取照相机响应函数 (CRF)
calibrateDebevec = cv2.createCalibrateDebevec()
responseDebevec = calibrateDebevec.process(images, times)
# 将多张图片合成 HDR 图片
mergeDebevec = cv2.createMergeDebevec()
hdrDebevec = mergeDebevec.process(images, times, responseDebevec)
# 保存 HDR 图.
cv2.imwrite("hdr_image.hdr", hdrDebevec)