Opencv实验合集——实验五:高动态范围

1.概念

高动态范围成像(HDRI 或 HDR)是一种用于成像和摄影的技术,可以再现比标准数字成像或照相技术更大的动态光度范围。虽然人眼可以适应各种光线条件,但大多数成像设备每通道使用 8 位,因此我们仅限于 256 级。当我们拍摄现实世界场景的照片时,明亮区域可能会过度曝光,而暗区域可能曝光不足,因此我们无法使用单次曝光捕捉所有细节。 HDR 成像适用于每通道使用 8 位以上(通常为 32 位浮点值)的图像,从而允许更宽的动态范围。

获得 HDR 图像的方法有很多种,但最常见的方法是使用不同曝光值拍摄的场景照片。要结合这些曝光,了解相机的响应函数是有用的,并且有估算它的算法。合并 HDR 图像后,必须将其转换回 8 位以在通常的显示器上查看。此过程称为色调映射。当场景或相机的物体在镜头之间移动时会出现额外的复杂性,因为应该注册和对齐具有不同曝光的图像。

在本教程中,我们展示了 2 种算法(Debevec,Robertson),用于从曝光序列生成和显示 HDR 图像,并演示了一种称为曝光融合(Mertens)的替代方法,该方法产生低动态范围图像,不需要曝光时间数据。此外,我们估计相机响应函数(CRF),这对许多计算机视觉算法具有重要价值。

首先简单了解一下什么是HDR图像和LDR图像

 HDR(High Dynamic Range)图像是一种能够捕捉和表示比标准图像(LDR,Low Dynamic Range)更广泛亮度范围的图像。HDR 图像可以包含来自不同曝光的多个图像,以便在亮度较低和较高的区域都能保留细节。

LDR(Low Dynamic Range)图像是一种在亮度范围上有限的图像,通常表示为每个像素的颜色值在一个相对较小的范围内,例如0到255。与HDR图像相比,LDR图像的主要特点是亮度范围较窄。

总的来说,HDR图像是专业化图像,具备类似曝光时间,曝光度等指标,LDR图像是日常实验或看到的图像,0-255像素,HDR就类似于高级摄像机拍东西,LDR就类似于普通手机拍东西

2.有关的函数方法

1.将曝光序列合并成一个HDR图像

cv2.createMergeDebevec() 是 OpenCV 中用于创建 Debevec 曝光融合器的函数。这个函数返回一个 cv2.MergeDebevec 对象。Debevec 曝光融合是一种用于生成高动态范围(HDR)图像的技术,通过合并拥有不同曝光时间的图像来捕获大范围的亮度信息。

cv2.createMergeRobertson() 是 OpenCV 中用于创建 Robertson 曝光融合器的函数。这个函数返回一个 cv2.MergeRobertson 对象。Robertson 曝光融合是一种用于生成高动态范围(HDR)图像的技术,类似于Debevec方法,但在考虑噪声方面表现更好。

2.范围映射

cv2.createTonemap 用于创建一个色调映射器(Tonemap),该映射器被用于将高动态范围(HDR)图像映射到低动态范围(LDR)图像。

tonemap.process 方法然后将 HDR 图像应用于该映射器,生成一个 LDR 图像。

cv2.createTonemap(gamma) 创建一个色调映射器对象。gamma 参数指定了伽马值,用于调整图像的对比度。伽马值越大,对比度越低,图像越亮。

tonemap.process(hdr): 将 HDR 图像 hdr 应用到色调映射器上。这一步将 HDR 图像转换为 LDR 图像,以便在标准显示器上显示。在这个过程中,色调映射器可以执行一些算法来调整图像的亮度、对比度和颜色饱和度等,以在 LDR 显示上获得更好的效果。

3.Mertens 曝光融合

Mertens 曝光融合是一种用于生成高动态范围(HDR)图像的技术,通过合并拥有不同曝光时间的图像来捕获大范围的亮度信息。这种方法的优势之一是在融合时采用了对比度增强的方法,以生成自然外观的HDR图像。

而且是一种合并曝光图像的替代算法,我们不需要曝光时间。我们也不需要使用任何色调图算法,因为 Mertens 算法已经给出了[0..1]范围内的结果。

示例代码:

import cv2
import numpy as np# Loading exposure images into a list
img_fn = [r"C:\Users\xiaoou\Desktop\picture/sun1.jpg", r"C:\Users\xiaoou\Desktop\picture/sun2.jpg", r"C:\Users\xiaoou\Desktop\picture/sun3.jpg"]
img_list = [cv2.imread(fn) for fn in img_fn]
img_list = [cv2.resize(img,(500,500)) for img in img_list]
exposure_times = np.array([1,0.3,0.012], dtype=np.float32)#设置曝光时间imagemerge_debevec = cv2.createMergeDebevec()
hdr_debevec = imagemerge_debevec.process(img_list, times=exposure_times.copy())#处理对应的图片和曝光时间
merge_robertson = cv2.createMergeRobertson()
hdr_robertson = merge_robertson.process(img_list, times=exposure_times.copy())tonemap1 = cv2.createTonemap(gamma=5.6)
res_debevec = tonemap1.process(hdr_debevec.copy())
tonemap2 = cv2.createTonemap(gamma=4.6)
res_robertson = tonemap2.process(hdr_robertson.copy())merge_mertens = cv2.createMergeMertens()#简化了很多条件,在未知图片曝光时间的情况下可以使用
res_mertens = merge_mertens.process(img_list)# Convert datatype to 8-bit and save
res_debevec_8bit = np.clip(res_debevec*255, 0, 255).astype('uint8')#将浮点数转化为0-255的数,这样就变成LDR,可以实现展示
res_robertson_8bit = np.clip(res_robertson*255, 0, 255).astype('uint8')
res_mertens_8bit = np.clip(res_mertens*255, 0, 255).astype('uint8')cv2.imshow('res_debevec_8bit', res_debevec_8bit)
cv2.imshow('res_robertson_8bit', res_robertson_8bit)
cv2.imshow('res_mertens_8bit', res_mertens_8bit)
cv2.waitKey(0)

效果展示:

原图:

结果图:

德普外阁(Debevec):

罗伯逊(Robertson):

 

梅特内斯·福森(Mertenes Fusion):

本次实验主要展示了计算摄影中的高动态范围,主要任务还是将不同曝光度的照片进行一个结合,本次小编实验的图片是小编自己拍摄的,所以忘记了曝光时间,通过假定设置去进行实验,但是还是因为曝光时间设置不好的问题,还是觉得最后一个 Mertenes 方法更自然更好看一点。

详情了解高动态范围 - 维基百科,自由的百科全书 (wikipedia.org)

如有错误或遗漏,希望小伙伴批评指正!!!! 

希望这篇博客对你有帮助!!!!

实验四:Opencv实验合集——实验四:图片融合-CSDN博客

实验六:Opencv实验合集——实验六:模板匹配-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/290242.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python实验作业,爬虫,中国院士信息

实验内容: 爬取中国工程院网页上,把每位院士的简介保存为本地文本文件,把每位院士的照片保存为本地图片,文本文件和图片文件都以院士的姓名为主文件名。 实验代码: import os.path import time from urllib.request …

Zookeeper-集群架构

Zookeeper集群架构 集群角色 Leader: 领导者 事务请求(写操作)的唯一调度者和处理者,保证集群事务处理的顺序性;集群内部各个服务器的调度者。对于create、setData、delete等有写操作的请求,则要统一转发…

华为OD机试 - 区间交集 - 深度优先搜索dfs算法(滥用)(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述备注用例1、输入2、输出3、说明 四、解题思路1、核心思路:2、具体步骤 五、Java算法源码再重新读一遍题目,看看能否优化一下~解题步骤也简化了很多。 六、效果展示1、输入2、输出3、说明 华为OD机试 2…

Actuator内存泄露及利用Swagger未授权自动化测试实现

目录 0x00 前言 0x01 Actuator 泄露及利用 1、Actuator heapdump 内存泄露 2、知道泄露后如何进一步利用 3、如何发现 Actuator 泄露(白盒/黑盒) 0x02 Swagger自动化测试 1、什么是Swagger? 2、PostmanBurpSuiteXray 联动 3、思考 0x…

某电子文档安全管理系统 SQL注入漏洞复现

漏洞介绍 亿赛通电子文档安全管理系统 (简称: CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护…

大创项目推荐 深度学习 大数据 股票预测系统 - python lstm

文章目录 0 前言1 课题意义1.1 股票预测主流方法 2 什么是LSTM2.1 循环神经网络2.1 LSTM诞生 2 如何用LSTM做股票预测2.1 算法构建流程2.2 部分代码 3 实现效果3.1 数据3.2 预测结果项目运行展示开发环境数据获取 最后 0 前言 🔥 优质竞赛项目系列,今天…

OpenCV技术应用(9)— 视频的暂停播放和继续播放

前言:Hello大家好,我是小哥谈。本节课就手把手教大家如何控制视频的暂停播放和继续播放,希望大家学习之后能够有所收获~!🌈 目录 🚀1.技术介绍 🚀2.实现代码 🚀1.技术介绍…

Python算法例19 创建最大数

1. 问题描述 给定两个长度分别是m和n的数组,数组的每个元素都是数字0~9,从这两个数组当中选出k个数字来创建一个最大数,其中k满足k<mn,选出来的数字在创建最大数里的位置必须与在原数组内的相对位置一致。返回k个元素…

Git报错x509: certificate signed by unknown authority

下载报错: Error downloading object: model-00001-of-00008.safetensors (ed3ac49): Smudge error: Error downloading model-00001-of-00008.safetensors (ed3ac4983f682a999b0e4b6f072aad294c4fd9a7e968e90835ba5c4b466d3c7c): LFS: Get https://cdn-lfs.huggin…

TDengine 创始人陶建辉受邀参与 TOP100Summit,发表工程师文化主题演讲

在 AGI 时代,数字化成为组织形态的重要特征,它可以帮助组织实现上下一致的目标和信息的高频传递,从而实现战略目标的协同和敏捷进化。在这样的大背景下,开发者们面临的实际挑战是如何避免技术和业务之间的割裂。 12 月 14-17 日&…

Google Play不会凭空消失,这篇文章带你重新找回丢失的它

你是不是因为不小心从手机上删除了Google Play而难过?或者你是否注意到你的Android设备上缺少Google Play图标?你一定很担心你现在会如何下载应用程序。别担心。在这篇文章中,我们将告诉你如何恢复已删除的谷歌商店。 Google Play可以卸载吗 让我们明确一点:除了一些特殊…

若依(ruoyi)管理系统标题和logo修改

1、网页上的logo 2、页面中的logo 进入ruoyi-ui --> src --> assets --> logo --> logo.png,把这个图片换成你自己的logo 3、网页标题 进入ruoyi-ui --> src --> layout --> components --> Sidebar --> Logo.vue,将里面的…