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.mzph.cn/news/236080.shtml

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

相关文章

某电子文档安全管理系统存在任意用户登录漏洞

漏洞简介 某电子文档安全管理系统存在任意用户登录漏洞,攻击者可以通过用户名获取对应的cookie,登录后台。 资产测绘 Hunter语法:web.icon“9fd216c3e694850445607451fe3b3568” 漏洞复现 获取Cookie POST /CDGServer3/LinkFilterServi…

uniapp websocket的使用和封装

在uniapp中socket分为两种形式,第一种适用于只有一个socket链接,第二种适用于多个socket链接。传送门 这里以socketTask为列子封装 在utils新建一个文件 在你要使用的页面引入,我这是聊天那种,所以我在拿到用户信息之后连接sock…

【Linux】whereis命令使用

whereis命令 whereis命令用于查找文件。 使用whereis命令可以查找指定文件、命令和手册页的位置,不能搜索普通文件。 以前学习过 【Linux】 find命令使用 语法 whereis [选项] [文件] find命令 -Linux手册页 命令选项及作用 执行令 whereis --help 执行命…

多媒体信息化建设,动态数据中心,深入理解分布式系统

目录 一、前言二、双活数据中心三、数据备份方式四、设计双活数据中心需要考虑的问题1、延迟和稳定性2、Quorum/ Tie-Breaker3、工作负载 五、动态数据中心六、深入理解分布式系统1、内容介绍2、作者简介 大家好,我是哪吒。 文末送5本《深入理解分布式系统》 一、…

C/C++ BM1反转链表

文章目录 前言题目1.解决方案一1.1 思路阐述1.2 源码 2. 解决方案二2.1 思路阐述2.2 源码 总结 前言 这题是牛客网的BM1,主要涉及到链表的操作以及栈数据结构的使用。 题目 给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的…

Flink cdc3.0同步实例(动态变更表结构、分库分表同步)

文章目录 前言准备flink环境docker构建mysql、doris环境数据准备 通过 FlinkCDC cli 提交任务整库同步同步变更路由变更路由表结构不一致无法同步 结尾 前言 最近Flink CDC 3.0发布, 不仅提供基础的数据同步能力。schema 变更自动同步、整库同步、分库分表等增强功…

论文笔记:Accurate Localization using LTE Signaling Data

1 intro 论文提出LTELoc,仅使用信令数据实现精准定位 信令数据已经包含在已在LTE系统中,因此这种方法几乎不需要数据获取成本仅使用TA(时序提前)和RSRP【这里单位是瓦】(参考信号接收功率) TA值对应于信号…

vue没有使用fetch报错 Uncaught (in promise) TypeError: Failed to fetch

出现下面的错误,主要也没有用谷歌浏览器什么和发起fetch请求,找了很久没有什么发现 POST https://www.google-analytics.com/mp/collect?measurement_idG-04CMS1PYS6&api_secretpRgvhB8VTii5eSmcTzVaOg net::ERR_BLOCKED_BY_CLIENT Uncaught (in pr…

获投1050万欧元!德国量子公司Kipu Quantum成功研发特定压缩算法

​(图片来源:网络) 近日,德国量子软件公司Kipu Quantum宣布成功完成种子轮融资,融资总额达1050万欧元(约合8000万人民币)。该初创公司目前已开发出运行高性能量子计算机所需的压缩算法。该算法…

windows安装、基本使用vim

标题:windows安装、基本使用vim 1.下载并安装GVIM 百度网盘链接 提取码:2apr 进入安装界面,如下,勾选 其它都是默认即可 参考; 2.在powershell中使用vim 参考blog:window10安装vim编辑器 安装好后&…

HTML+CSS做一个冰立方体时钟

文章目录 💕效果展示💕代码展示HTMLJS💕效果展示 💕代码展示 HTML <!DOCTYPE html> <html lang

双三次 Bezier 曲面

双三次 Bezier 曲面的定义 Bezier 曲面是由 Bezier 曲线扩展得到&#xff0c;它是两组正交的 Bezier 曲线控制点构造空间网格生成的曲面 p ( u , v ) ∑ i 0 3 ∑ j 0 3 P i , j B i , 3 ( u ) B j , 3 ( v ) , ( u , v ) ∈ [ 0 , 1 ] [ 0 , 1 ] \begin{equation} \bm{p}…

法线贴图实现衣服上皱褶特效

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 法线贴图在3D建模中扮演着重要的角色&#xff0c;它通过模拟表面的微…

c++内存池项目

文章目录 一、内存池介绍二、ThreadCache实现三、CentralCache实现四、PageCache实现五、回收内存六、大于256KB的内存申请与释放七、将new和delete换为定长内存池八、多线程环境下对比malloc进行基准测试九、使用基数树进行性能优化 一、内存池介绍 二、ThreadCache实现 下面…

springboot集成springdoc-openapi(模拟前端请求)

目录 描述---痛点 Springfox对比springdoc-openapi 1. 成熟度和维护性&#xff1a; 2. 依赖和配置&#xff1a; 3. 注解和使用方式&#xff1a; 4. 特性和扩展性&#xff1a; 应用目录结构 pom文件 新增测试controller StaffController YUserController 启动测试看下…

PHP HTTPoxy CGI 应用程序漏洞 CVE-2016-5385

HTTPoxy CGI 应用程序漏洞 CVE-2016-5385 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议 漏洞名称 漏洞描述 在Oracle Communications BRM 10.x/12.x&#xff08;云软件&#xff09;中发现漏洞。它已经被宣布为关键。此漏洞影响组件用户数据库的未…

Linux笔记---用户和权限管理基本命令介绍

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux学习 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 ​编辑 前言&#xff1a; 命令&#xff1a; whoami&#xff1a; passwd&#xff1a; useradd&#xff1a; userdel&#xff1a; chm…

华为交换配置OSPF与BFD联动

实验拓扑 组网需求 如图所示&#xff0c;SW1、SW2和SW3之间运行OSPF&#xff0c;SW1和SW2之间的交换机仅作透传功能。现在需要SW1和SW2能够快速感应它们之间的链路状态&#xff0c;当链路SW1-SW2发生故障时&#xff0c;业务能快速切换到备份链路SW1-SW3-SW2上 配置思路 采用…

文件的基本管理

目录 一、Linux系统目录结构和相对/绝对路径 &#xff08;一&#xff09;系统目录结构 &#xff08;二&#xff09;相对路径和绝对路径 1.绝对路径 2.相对路径 &#xff08;三&#xff09;通配符的作用 二、创建、复制、删除文件&#xff0c;rm -rf /意外事故 &#xf…

说说对React Hooks的理解?解决了什么问题?

面试官&#xff1a;说说对React Hooks的理解&#xff1f;解决了什么问题&#xff1f; 一、是什么 Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性 至于为什么引入hook&#xff0c;官方给出的动机是解决长时间使用和维护…