博客
关于我
OpenCV系列之高动态范围 | 六十
阅读量:250 次
发布时间:2019-03-01

本文共 2907 字,大约阅读时间需要 9 分钟。

高动态范围成像(HDR)技术教程

目标与意义

本章旨在帮助开发者理解如何通过多帧曝光生成并展示高动态范围(HDR)图像。我们将重点介绍两种经典算法——Debevec和Robertson——以及一种替代方法Mertens融合,展示如何根据不同曝光时间合并图像。同时,我们还将探讨如何通过相机响应函数(CRF)优化HDR合成结果。

高动态范围成像(HDR)的基本原理

HDR成像能够捕捉比标准成像更广的亮度范围,这对于复杂的光照场景至关重要。相机通常以8位(256级)存储图像数据,无法在同一帧中同时捕捉明暗细节。HDR技术通过多帧曝光(不同曝光时间的图像)合成一张完整的高动态范围图像。

获取HDR图像的方法

目前有多种获取HDR图像的方法,其中最常见的是拍摄不同曝光时间的场景图像。合并这些图像需要了解相机响应函数和估算算法的特性。合并后,HDR图像需转换回8位以适配常规显示器,但这个过程称为色调映射可能会引入额外复杂性。

曝光序列HDR合成

在这个教程中,我们将使用四张曝光图像,曝光时间分别为15、2.5、0.25和0.0333秒。这些图像可以从Wikipedia下载。

实现步骤

  • 加载曝光图像到列表中
    使用OpenCV库读取所有曝光图像,并存储在一个列表中。
  • import cv2 as cvimport numpy as np# 假设曝光图像文件名为img0.jpg、img1.jpg等img_fn = ["img0.jpg", "img1.jpg", "img2.jpg", "img3.jpg"]img_list = [cv.imread(fn) for fn in img_fn]exposure_times = np.array([15.0, 2.5, 0.25, 0.0333], dtype=np.float32)
    1. 合并曝光图像为HDR
      OpenCV提供了两种HDR合成算法:cv.createMergeDebevec()和cv.createMergeRobertson()。这两种方法适用于不同的场景。
    2. # Debevec 合成merge_debevec = cv.createMergeDebevec()hdr_debevec = merge_debevec.process(img_list, times=exposure_times.copy())# Robertson 合成merge_robertson = cv.createMergeRobertson()hdr_robertson = merge_robertson.process(img_list, times=exposure_times.copy())
      1. 色调图映射
        将32位浮点的HDR图像映射到[0..1]范围内。注意:此过程可能会导致超出范围的值,因此需要后续处理。
      2. # 色调图映射tonemap1 = cv.createTonemap(gamma=2.2)res_debevec = tonemap1.process(hdr_debevec.copy())
        1. Mertens 融合曝光
          这种方法不需要曝光时间数据,并且直接输出[0..1]范围内的图像。
        2. # Mertens 融合merge_mertens = cv.createMergeMertens()res_mertens = merge_mertens.process(img_list)
          1. 转为8位并保存
            为了在常规显示器上查看结果,需要将HDR图像转换为8位。
          2. # 转为8位并保存def convert_to_uint8(image):    return np.clip(image * 255, 0, 255).astype('uint8')# Debevec 结果res_debevec_8bit = convert_to_uint8(res_debevec)cv.imwrite("ldr_debevec.jpg", res_debevec_8bit)# Robertson 结果res_robertson_8bit = convert_to_uint8(res_robertson)cv.imwrite("ldr_robertson.jpg", res_robertson_8bit)# Mertens 结果res_mertens_8bit = convert_to_uint8(res_mertens)cv.imwrite("fusion_mertens.jpg", res_mertens_8bit)

            相机响应功能(CRF)估计

            CRF是HDR算法的重要组成部分,它描述了相机在不同曝光时间下的响应特性。OpenCV提供了两种方法来估计CRF:cv.createCalibrateDebevec()和cv.createCalibrateRobertson()。

            # 估计 CRF 并生成 HDR 图像cal_debevec = cv.createCalibrateDebevec()crf_debevec = cal_debevec.process(img_list, times=exposure_times)hdr_debevec = merge_debevec.process(img_list, times=exposure_times.copy(), response=crf_debevec.copy())cal_robertson = cv.createCalibrateRobertson()crf_robertson = cal_robertson.process(img_list, times=exposure_times)hdr_robertson = merge_robertson.process(img_list, times=exposure_times.copy(), response=crf_robertson.copy())

            附加资源

          3. Paul E Debevec and Jitendra Malik. Recovering high dynamic range radiance maps from photographs. SIGGRAPH 2008.
          4. Mark A Robertson, Sean Borman, and Robert L Stevenson. Dynamic range improvement through multiple exposures. ICIP 1999.
          5. Tom Mertens, Jan Kautz, and Frank Van Reeth. Exposure fusion. PG'07.
          6. 练习建议

          7. 尝试所有色调映射算法(TonemapDrago、TonemapMantiuk、TonemapReinhard)。
          8. 修改HDR校准和色调图方法中的参数,观察结果的变化。
          9. 如需了解更多OpenCV-Python教程,请关注我们的专栏或扫描二维码加入交流群。

    转载地址:http://reav.baihongyu.com/

    你可能感兴趣的文章
    Python在def函数中使用for循环
    查看>>
    Python在def函数中使用for循环
    查看>>
    Python在Conda环境中,但在Windows虚拟环境中没有激活
    查看>>
    python系列【仅供参考】:python pip 错误 ModuleNotFoundError: No module named pip._internal 解决办法
    查看>>
    python图像条状状噪声,使用PYTHON PIL从验证码图像中删除背景嘈杂的线条
    查看>>
    Python图像处理:从内存加载jpeg
    查看>>
    python固定后缀(名物化词汇)词频统计:抽取+统计+可视化
    查看>>
    python商品评论数据采集与分析可视化系统 Flask框架 requests爬虫 NLP情感分析 毕业设计 源码
    查看>>
    python商品数据分析可视化系统(带爬虫)京东销售数据分析 计算机毕业设计 源码下载
    查看>>
    python商品库存管理系统 django框架 商品网站 MySQL数据库 源码下载 计算机毕业设计
    查看>>
    Python哪个版本最稳定好用2023.10.19
    查看>>
    Python和黑客技术的渊源
    查看>>
    Python和RF编写接口自动化
    查看>>
    Python和RF编写web自动化
    查看>>
    python和js哪个难_【Python】记一次学习,Python 与 js 在实现闭包时的差异
    查看>>
    python和java哪个更值得学——来自知乎高赞回答
    查看>>
    python和c混合编程 github_在pycharm中使用git版本管理以及同步github的方法
    查看>>
    python命名空间更改_Python模块xml.etree.ElementTree自动修改xml命名空间键
    查看>>
    Python命名中尾随下划线有什么好处?
    查看>>
    Python启动脚本
    查看>>