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

本文共 2938 字,大约阅读时间需要 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 cv
    import 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/

    你可能感兴趣的文章
    NPOI将某个程序段耗时插入Excel
    查看>>
    NPOI格式设置
    查看>>
    NPOI设置单元格格式
    查看>>
    Npp删除选中行的Macro录制方式
    查看>>
    NR,NF,FNR
    查看>>
    nrf24l01+arduino
    查看>>
    nrf开发笔记一开发软件
    查看>>
    nrm —— 快速切换 NPM 源 (附带测速功能)
    查看>>
    nrm报错 [ERR_INVALID_ARG_TYPE]
    查看>>
    NS3 IP首部校验和
    查看>>
    NSDateFormatter的替代方法
    查看>>
    NSError 的使用方法
    查看>>
    NSGA-Ⅲ源代码
    查看>>
    nsis 安装脚本示例(转)
    查看>>
    NSJSON的用法(oc系统自带的解析方法)
    查看>>
    nslookup 的基本知识与命令详解
    查看>>
    NSNumber与NSInteger的区别 -bei
    查看>>
    NSOperation基本操作
    查看>>
    NSRange 范围
    查看>>
    NSSet集合 无序的 不能重复的
    查看>>