博客
关于我
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/

    你可能感兴趣的文章
    ollama本地部署DeepSeek(Window图文说明)
    查看>>
    onCreate()方法中的参数Bundle savedInstanceState 的意义用法
    查看>>
    OneASP 安全公开课,深圳站, Come Here, Feel Safe!
    查看>>
    OneBlog Shiro 反序列化漏洞复现
    查看>>
    one_day_one--mkdir
    查看>>
    ONI文件生成与读取
    查看>>
    onlyoffice新版5.1.2版解决中文汉字输入重复等问题
    查看>>
    oobbs开发手记
    查看>>
    OPEN CASCADE Curve Continuity
    查看>>
    Open Graph Protocol(开放内容协议)
    查看>>
    Open vSwitch实验常用命令
    查看>>
    Open WebUI 忘了登入密码怎么办?
    查看>>
    open-vm-tools-dkms : 依赖: open-vm-tools (>= 2:9.4.0-1280544-5ubuntu3) 但是它将不会被安装
    查看>>
    Openbox-桌面图标设置
    查看>>
    opencart出现no such file or dictionary
    查看>>
    opencv Mat push_back
    查看>>
    opencv videocapture读取视频cap.isOpened 输出总是false
    查看>>
    opencv waitKey() 函数理解及应用
    查看>>
    OpenCV 中的图像转换
    查看>>
    OpenCV 在 Linux 上的 python 与 anaconda 无法正常工作.收到未实现 cv2.imshow() 的错误
    查看>>