HDR简单介绍

问题定义

HDR字面意思是高动态范围High Dynamic Range,而动态范围是高图像质量的五个要素之一(其余是1. 分辨率,2.位深度,3.帧速率,4.色域),而画质直接关系到人眼的主观感受。

如果将动态范围理解为量化的阶数,阶数越高,动态范围也越大。人眼看到的自然界内容都是人眼中虹膜 iris的调整,大脑的不断解析,所以可以同时看到各种亮度。而数字图像受限于CCD和ADC,动态范围是有限的,以8bit量化为例,只有256个levels,当同一幅图中同时有高亮和暗部时,如此跨度无法同时表达,就会导致亮度过曝,暗部欠曝。至于胶卷,胶卷相机也不能保证高动态范围,因为暗部细节需要高曝光,亮度细节需要低曝光,而镜头无法保证这样。

解决思路

一般处理的思路是使用多张不同曝光(  bexposure bracketing)的照片(提前 registered and aligned.),融合得到HDR图。曝光值 exposure value (EV),也称作stops,高一档表示光线light扩大为2倍。得到不同曝光的方法有改变曝光时间和改变光圈。但是光圈还会影响景深 ,不利于图像对齐等,所以一般都是通过改变曝光时间得到不同ev的图像。

HDR图一般以浮点型float32表示,对应的文件后缀是.hdr。但无耐屏幕的量化水平还是低,为了在8bit机器上也能正常显示,还需要将HDR图使用8bit表示,这一过程称为tonemapping。胶卷时代也有tonemapping,做法是在print阶段,在暗室中使用 dodging and burning。

tonemapping

数字时代的tonemapping会把浮点型的数据转换为[0,1]区间(要求输入输出都在这个区间),这个过程会有截断。匹配场景与显示器之间只是tobemapping的一个应用,tonemapping更广泛的作用是使得图像更加美观,在降低整体对比度的同时保留局部对比度。根据每个像素使用的映射函数是否相同,可以分为全局tonemapping和局部tonemapping。

全局的映射,一旦估计得到最优的函数,每个像素分别单独地被映射,比如颜色反转和对比度降低。常见的全局映射有V_{out}=\frac{V_{int}}{V_{int}+1},将[0,+)映射到[0,1)。低亮的地方对比度被加强,高亮的地方对比度被减弱。常见的还有gamma compression。人眼感受光线和彩色都是非线性的,在更暗的色调下对相对亮度差异的敏感度更高。所以在亮的区域就没有必要浪费太多的比特去描述亮度的变化,这也就是非线性gamma的原理。尽管伽马编码最初是为了补偿阴极射线管 (CRT) 显示器的输入输出特性而开发的,但这并不是其在现代系统中的主要目的或优势。V_{out}=AV_{int}^\gamma

局部映射,映射算子在每个像素位置都是不同的,会产生光晕halo或者振铃效应,产生的图像比较sharp,但是也可能会得到更好的效果。

OpenCV中的HDR算法1

Debvec和Robertson的算法都需要多张不同曝光图的同时还需要他们各自的曝光时间,通过估计得到camera response function (CRF) ,重建得到.hdr图:

 # Merge exposures to HDR image2 merge_debvec = cv2.createMergeDebevec()3 hdr_debvec = merge_debvec.process(img_list, times=exposure_times.copy())4 merge_robertson = cv2.createMergeRobertson()5 hdr_robertson = merge_robertson.process(img_list, times=exposure_times.copy())

Robertson这篇1999年的文章,需要 initial calibration, where the camera response function is determined。

很多相机尤其是消费级相机的CRF不是线性的。胶卷对光照的响应就是非线性的,这个曲线辐射带来的,同时需要注意即便没有光照,胶卷也会有较小的响应,而光照太强会造成饱和。此外,冲印,扫描,数字化都会带入非线性。对于数码相机,虽然charge coupled device (CCD)本身是线性的,但是从CCD的输出到写入之前,又有很多的非线性,比如12bit转为8bit,为了显示的考虑使用非线性模拟胶卷等。无论是胶卷还是数码相机,造成非线性最大问题是饱和点的存在。

总而言之就是相机处处都是非线性,是多个非线性的结合composition of several nonlinear mappings,所以需要先将这些非线性以一个函数描述出来。

 Z_{i,j}=f(E_i\Delta t_j)

Z表示位置i,曝光时间索引j处的响应值,可以理解为灰度值,它是已知量。f就是要估计的非线性曲线,假设它是单调递增的,它的自变量是E_j\Delta t_j.

上面这个式子经过反函数,取自然对数。可以得到优化函数的data term。第二项是平滑项,是g函数的二阶导,具体可以通过差分的方式实现。这就和拉普拉斯算子一样,我们知道,图像的拉普拉斯算子表示二阶导的过零点,表示边缘信息。最终的优化求解就是线性最小二乘,可以使用SVD求解。

OpenCV中的HDR算法2

当不需要得到.hdr图,只需要有HDR效果的LDR图时,可以使用exposure fusion (Mertens)算法,该算法直接将多曝光的图进行融合,不需要曝光值。融合的过程是使用不同曝光图中可用的部分,这就需要一些指标来衡量图像质量,这里选用的是对比度,饱和度,曝光质量。

对比度的计算使用拉普拉斯滤波器,饱和度的计算使用三个通道的标准差,曝光质量借助高斯曲线。使用乘积的方式将三者联系起来,而不是使用线性的方法。得到权重之后,再归一化就可以融合了。

融合的结果会出现不自然的线条,这是因为权重变化太快,而权重变化太快又是因为图像之间的曝光之间差异较大,绝对强度值差异较大。融合使用的权重图可以使用高斯模糊,也可以使用导向双边滤波,但是效果都不太好。其实这是一个blending问题,可以使用拉普拉斯金字塔进行融合。

reference:
OpenCV: High Dynamic Range (HDR)

OpenCV3.0 HDR(高动态范围)示例代码以及用法 - 一度逍遥 - 博客园

High Dynamic Range Imaging — OpenCV 3.0.0-dev documentation

http://www.pauldebevec.com/Research/HDR/debevec-siggraph97.pdf

Recovering High Dynamic Range Radiance Maps from Photographs

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

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

相关文章

争议中挺进全新里程——中国“超级对撞机”《概念设计报告》发布侧记

来源:科技导报2018 年11 月12 日下午6 点半,北京市玉泉路,中国科学院高能物理研究所,所有建筑和行人沐浴在初冬夜晚的清冷与安静之中。不同的是,主楼西侧一座新楼的大厅里,却充满了热望和兴奋。这里正进行着…

如何才能成为真正的程序员

一个真正的程序员,必然是可以根据自己的意愿进行创造的程序员。一个真正的程序员,是不会甘于成为一个枪手的,更不会只想做一个码农,我们是创造者,就算迫于无奈暂时做为一个码农,也永远无法改变我们的本性。…

haar级联分类器--人脸检测和匹配

分类器链接,https://download.csdn.net/download/fanzonghao/10582586 代码: import numpy as np import cv2# 实例化人脸分类器 face_cascade cv2.CascadeClassifier(./haarcascades/haarcascade_frontalface_default.xml) # 实例化眼睛分类器 eye_c…

社会科技奖不是新鲜事?如何真正做大

来源:中国科学报我国的社会力量设立科学技术奖励起步于上世纪80年代。科技部网站上2018年9月5日更新的《社会科技奖励目录》显示,目前我国共有269个社会科技奖项登记在册,其中最后一个正是未来科学大奖。11月18日,2018未来科学大奖…

Spring Cache 配置及一些问题的解决

配置 1. applicationContext.xml <beans xmlns"http://www.springframework.org/schema/beans" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:cache"http://www.springframework.org/schema/cache"xsi:schemaLocation"ht…

泊松融合——用了拉普拉斯但没有金字塔

图像融合的方式有alpha融合&#xff0c;拉普拉斯金字塔融合。 同样是基于拉普拉斯算子&#xff0c;我们可以直接用求解的方式得到融合后的图像。因为人眼对二阶导是更敏感的&#xff0c;所以只要我们指定了融合区域内部的梯度值&#xff0c;并且知道融合边界处的值&#xff0c…

三层神经网络实现手写字母的识别(基于tensorflow)

数据集的制作参考这篇文章&#xff1a; https://blog.csdn.net/fanzonghao/article/details/81229409 一&#xff0c;读取数据集 import tensorflow as tf import numpy as np import pickle import matplotlib.pyplot as plt #对于x变成(samles,pixs),y变成one_hot (sample…

(转)Kinect背景移除支持多人

原文&#xff1a;http://blogs.msdn.com/b/k4wdev/archive/2013/10/22/using-kinect-background-removal-with-multiple-users.aspx?utm_sourcetuicool Introduction: Background Removal in Kinect for Windows The 1.8 release of the Kinect for Windows Developer Toolkit…

德国汉堡科学院院士张建伟:信息物理系统驱动智能未来

来源&#xff1a;OFweek工控网随着第四次工业革命的到来&#xff0c;信息技术&#xff08;IT&#xff09;和运营技术&#xff08;OT&#xff09;的融合成为新趋势&#xff0c;工厂开始进入数字化转型阶段&#xff0c;而德国“工业4.0”战略给全球制造业发展带来启示&#xff0c…

两层卷积网络实现手写字母的识别(基于tensorflow)

可和这篇文章对比&#xff0c;https://blog.csdn.net/fanzonghao/article/details/81489049&#xff0c;数据集来源代码和链接一样。 import tensorflow as tf import numpy as np import matplotlib.pyplot as plt import read_pickle_datasettrain_dataset,train_label,vali…

焦李成教授谈深度神经网络发展历程

来源&#xff1a;西电人工智能学院摘要&#xff1a;焦李成教授谈深度神经网络发展历程2018年11月18日下午&#xff0c;计算机科学与技术学部主任、人工智能学院焦李成教授在成都参加了由中国人工智能学会主办的人工智能大讲堂并做特邀报告&#xff0c;焦李成教授在报告中回顾了…

SGU 187 - Twist and whirl -- want to cheat

原题地址&#xff1a;http://acm.sgu.ru/problem.php?contest0&problem187 太开心啦&#xff01;&#xff01;&#xff01;&#xff01;这道题从2013年开始困扰我&#xff01;&#xff01;今天晚上第四次下定决心把它写一写&#xff0c;之前写了三次&#xff08;事实上是五…

KNN实现CIFAR-10数据集识别

cs231n链接&#xff1a;http://cs231n.github.io/linear-classify/&#xff0c; 训练集链接&#xff1a;https://download.csdn.net/download/fanzonghao/10592049 KNN缺点&#xff1a;每个测试样本都要循环一遍训练样本。 该数据集由5个data_batch和一个test_batch构成&…

近期苹果、Facebook等科技巨头股价缘何不断下跌?

来源&#xff1a;资本实验室近期&#xff0c;FAANG(Facebook、亚马逊、苹果、Netflix、谷歌)等科技巨头股价都出现了不同程度的下跌&#xff0c;而美国科技股整体的持续大跌&#xff0c;更是引发了全球股市振荡。其中&#xff0c;亚马逊在今年9月初达曾达到1万亿美元市值&#…

ZOJ 3300 Mahjong DFS暴力解决。。

ZJU 3300&#xff1a; 题目描述 就看成1—9的数字&#xff0c;DFS暴力搜索下就过了。。。。。要求输入13 个数字&#xff0c;声明个数组记录数字的个数&#xff0c;DFS 里各种回溯&#xff1b;#include<stdio.h> #include<string.h> int p[12],flag; int dfs(int x…

概率论基础知识各种分布

离散分布&#xff1a;伯努力分布&#xff0c;二项分布&#xff0c;possion分布 一&#xff0c;伯努力分布 #执硬币 x_arrnp.array([0,1]) #x为1的概率 p0.7 #0 1分布 #由PMF生成对应的概率 离散事件 pr_arrstats.bernoulli.pmf(x_arr,p) plt.plot(x_arr,pr_arr,markero,lines…

AI 芯片和传统芯片的区别

来源&#xff1a;内容来自「知乎汪鹏 」所谓的AI芯片&#xff0c;一般是指针对AI算法的ASIC&#xff08;专用芯片&#xff09;。传统的CPU、GPU都可以拿来执行AI算法&#xff0c;但是速度慢&#xff0c;性能低&#xff0c;无法实际商用。比如&#xff0c;自动驾驶需要识别道路行…

三层神经网络实现手写数字的识别(基于tensorflow)

数据集链接&#xff1a;https://download.csdn.net/download/fanzonghao/10598333 from tensorflow.examples.tutorials.mnist import input_data mnist input_data.read_data_sets("./mnist/", one_hotTrue)import tensorflow as tf# Parameters learning_rate 0…

鼠标终将消失,未来我们有哪些人机交互方式?

来源&#xff1a;资本实验室在人类发明史上&#xff0c;诞生了无数的英雄。他们的发明往往从一项前沿技术到家喻户晓、无处不在&#xff0c;但他们自己却又鲜为人知&#xff0c;美国发明家道格拉斯恩格尔巴特就是其中的代表。20世纪60年代&#xff0c;道格拉斯恩格尔巴特发明了…

两层卷积网络实现手写数字的识别(基于tensorflow)

可和这篇文章对比&#xff1a;https://blog.csdn.net/fanzonghao/article/details/81603367 # coding: utf-8 # ## MNIST数据集from __future__ import division, print_function, absolute_importimport tensorflow as tf# Import MNIST data&#xff0c;MNIST数据集导入 fro…