【OpenCV-Python】教程:8-3 高动态范围 HDR

news2024/11/24 19:17:46

OpenCV Python HDR

【目标】

  • 学习如何从曝光序列生成和显示HDR图像。
  • 使用曝光融合来合并曝光序列。

【理论】

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

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

在这里插入图片描述

在本教程中,我们展示了2种算法(Debevec, Robertson)从曝光序列生成和显示HDR图像,并演示了一种称为曝光融合的替代方法(Mertens),该方法产生低动态范围图像,不需要曝光时间数据。此外,我们还估计了摄像机响应函数(CRF),这对许多计算机视觉算法都有很大的价值。HDR管道的每一步都可以使用不同的算法和参数来实现,所以请查看参考手册来了解它们。

【代码】

在这里插入图片描述

import numpy as np 
import cv2 

# 1. Loading exposure images into a list
img_fn = ["assets/img0.jpg", "assets/img1.jpg", "assets/img2.jpg", "assets/img3.jpg"]
img_list = [cv2.imread(fn) for fn in img_fn]

# 曝光时间
exposure_times = np.array([15.0, 2.5, 0.25, 0.0333], dtype=np.float32)


# 2. Merge exposures into HDR image
merge_debevec = cv2.createMergeDebevec()
hdr_debevec = merge_debevec.process(img_list, times=exposure_times.copy())
merge_robertson = cv2.createMergeRobertson()
hdr_robertson = merge_robertson.process(img_list, times=exposure_times.copy())

# 3. Tonemap HDR image
tonemap1 = cv2.createTonemap(gamma=2.2)
res_debevec = tonemap1.process(hdr_debevec.copy())
res_robertson = tonemap1.process(hdr_robertson.copy())

# 4. Merge exposures using Mertens fusion
merge_mertens = cv2.createMergeMertens()
res_mertens = merge_mertens.process(img_list)

# 5. Convert to 8-bit and save
res_debevec_8bit = np.clip(res_debevec*255, 0, 255).astype('uint8')
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("ldr_debevec.jpg", res_debevec_8bit)
cv2.imshow("ldr_robertson.jpg", res_robertson_8bit)
cv2.imshow("fusion_mertens.jpg", res_mertens_8bit)

cv2.waitKey(0)
cv2.destroyAllWindows()

【接口】

cv2.MergeDebevec.process(	src, times, response[, dst]	) ->	dst
cv2.MergeDebevec.process(	src, times[, dst]	) ->	dst
cv2.MergeRobertson.process(	src, times, response[, dst]	) ->	dst
cv2.MergeRobertson.process(	src, times[, dst]	) ->	dst
cv2.MergeMertens.process(	src, times, response[, dst]	) ->	dst
cv2.MergeMertens.process(	src[, dst]	) ->	dst

【参考】

  1. High Dynamic Range (HDR)
  2. Paul E Debevec and Jitendra Malik. Recovering high dynamic range radiance maps from photographs. In ACM SIGGRAPH 2008 classes, page 31. ACM, 2008. [56]
  3. Mark A Robertson, Sean Borman, and Robert L Stevenson. Dynamic range improvement through multiple exposures. In Image Processing, 1999. ICIP 99. Proceedings. 1999 International Conference on, volume 3, pages 159–163. IEEE, 1999. [206]
  4. Tom Mertens, Jan Kautz, and Frank Van Reeth. Exposure fusion. In Computer Graphics and Applications, 2007. PG’07. 15th Pacific Conference on, pages 382–390. IEEE, 2007. [169]
  5. Images from Wikipedia-HDR
  6. HDR imaging

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

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

相关文章

软考中级软件设计师和系统集成项目管理工程师哪个更好考?

软件设计师: 计算机相关基础知识,常用数据结构和常用算法,C程序设计语言,以及C、Java中的一种程序设计语言,软件工程、软件过程改进和软件开发项目管理的基础知识,软件设计的方法和技术。 系统集成项目管…

【设计模式】软件开发原则

开闭原则(OCP) 定义:一个软件实体应当对扩展开放,对修改关闭。也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即使现在不修改源代码的情况下改变这个模块的行为。 意思&#x…

(包含源代码)2022年全国大学生数学建模竞赛E题目-小批量物料生产安排详解+思路+Python代码时序预测模型-补完

目录 前言 赛题分析 1.问题一 问题分析 物料频率 代码详细操作: 出现频次 需求总数 趋势标量 方法 平均每天需求额度 整合代码 熵权法 详细介绍: 二、使用步骤 2.计算指标信息熵 3.熵权法相关代码 得到权重: 只希望各位以…

决策树-sklearn

决策树 1.概述 1.1 决策树是如何工作 决策树能够从一系列有特征和标签的数据中总结出决策规则,并且使用树状图的结构来表现,从而达到解决回归和分类问题。通俗的说,就是我们只需要问一系列问题就可以对数据进行分类。 核心要解决的问题&am…

20221226编译Toybrick的TB-RK3588X开发板的Android12系统3

20221226编译Toybrick的TB-RK3588X开发板的Android12系统3 2022/12/26 18:27 编译指令: 1、cat android12-rk3588.tar.gz.* >android12-rk3588.tar.gz 2、tar -zxvf android12-rk3588.tar.gz,解压缩后生成android12-rk3588-new目录 3、android12-rk3588-new 4、…

CSS篇.day04-单位,流式布局,弹性布局(flex),网格布局,渐变,变形与过渡

目录 1. 单位 2.流式布局 3.弹性布局(flex) 4.网格布局 5.渐变 6.变形与过渡 1. 单位 px: 绝对单位 像素em: 相对单位 基准点为父节点字体大小 若自身定义了font-size按自身来计算(一般浏览器默认16px)rem: 相对单位 相对根节点html的字体大小, css3新增属性, 根元…

【Python百日进阶-数据分析】Day139 - plotly甘特图:plotly.figure_factory.create_gantt()

文章目录一、语法二、参数三、返回值四、实例4.1 普通ff甘特图4.2 将任务组合在一起4.3 按数值变量着色4.4 create_gantt4.5具有数字条目的按列索引4.6 具有字符串条目的按列索引4.7 使用颜色字典4.8一、语法 已弃用,请用plotly.express.timeline()代替。 plotly.…

LeetCode88. 合并两个有序数组

题目 给你两个按非递减顺序排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你合并 nums2 到 nums1 中,使合并后的数组同样按非递减顺序排列。 注意:最终,合并后数组不…

统一观测|如何使用 Prometheus 监控 Windows

作者: 颍川 引言 微软 Windows 是当前主流操作系统之一,在桌面和服务端均有较大市场份额。 对于 Linux 操作系统,Prometheus 可以通过 Node Exporter 来进行基础资源(CPU、内存、磁盘、网络等)监控,类似…

吴恩达的2022年终盘点:生成式AI、ViT、大模型

昨日,**吴恩达在圣诞节的《The Batch》特刊上发布了一年一度的年终盘点。**在过去的一年,生成式AI迎来爆发式增长,由人工智能生成的图片在社交平台疯狂传播,引发大量争议的同时也推动了投资;视觉 Transformer(ViT) 的工…

【nowcoder】笔试强训Day8

目录 一、选择题 二、编程题 2.1两种排序方法 2.2最小公倍数 一、选择题 1.下列选项中关于Java中super关键字的说法正确的是() A super关键字是在子类对象内部指代其父类对象的引用 B super关键字不仅可以指代子类的直接父类,还可以直…

SpreadJS 16新建文件格式,Data Manager中的层次结构

SpreadJS 16新建文件格式,Data Manager中的层次结构 为TableSheet、Designer、Calculation、Shape和Workbook添加增强功能。 2022年12月22日-16:53新版本 特征 新建文件格式 新的.sjs文件格式使ExcelIO进程更快、更小。 表页增强功能 Data Manager中的层次结构。 Data Manager字…

【代码随想录】链表-golang

链表 from 代码随想录 移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 思路:设置一个新的节点,节点的下一个是链表的第一个节点 /*** Definition f…

阿根廷夺冠早已预判,梅西经济爆火,这款产品在跨境电商卖断货了

2022年12月18日23:00,世界杯的决赛将举行,阿根廷会战法国;期间,梅西和姆巴佩也将会在绿茵场上狭路相逢。而作为现役名声最为响亮的球星之一,此次卡塔尔也是梅西最后一次征战世界杯赛场,同时,随着…

基于Python实现电影推荐系统【100010052】

电影推荐系统 标签:Tensorflow、矩阵分解、Surprise、PySpark 1、用Tensorflow实现矩阵分解 1.1、定义one_batch模块 import numpy as np import pandas as pddef read_and_process(filename, sep ::):col_names [user, item, rate, timestamp]df pd.read_cs…

IP判断.库函数复习.数组.C

strtok(在string.h库里)函数以"."为分隔符对IP字符串进行切分. atoi函数(在stdlib.h里)将切分的一部分字符串转换为十进制数字. 描述 C 库函数 char *strtok(char *str, const char *delim) 分解字符串 str 为一组字符串&#xf…

LeetCode题目笔记——1759. 统计同构子字符串的数目

文章目录题目描述题目难度——中等方法一:数学代码/C代码/Python总结题目描述 给你一个字符串 s ,返回 s 中 同构子字符串 的数目。由于答案可能很大,只需返回对 109 7 取余 后的结果。 同构字符串 的定义为:如果一个字符串中的…

300道网络安全工程师面试题(附答案解析)冲刺金三银四

2022年马上就要过去了,先来灵魂三连问,年初定的目标完成多少了?薪资涨了吗?女朋友找到了吗? 好了,不扎大家的心了,接下来进入正文。 由于我之前写了不少网络安全技术相关的文章和回答&#xff…

nginx 报400_nginx 400 Bad request

记录一次自己写出来的bug. 首先自己在gateway中做了filter,操作了header 操作中返回的报错400 nginx, 所以一直将矛头指向了nginx配置,但是各种查询和修改后,错误依旧. 静下心来一步步的看,发现请求实际上已经通过nginx发送到了gateway中,并且gateway日志中也清楚的记录了lo…

[普及练习场]失踪的7

本专辑上篇: [普及练习场] 生活大爆炸版石头剪刀布 看得都爽,对吧!感谢hydro的页面和浴谷的搬运。 目录 一.读题 失踪的7 题意 二 .做题 算法原理 算法实现 全篇代码分解讲解 输入 中心 一.读题 失踪的7 题目描述 远古的 Pascal 人也…