图形图像处理算法(2) —— ToneMapping 技术
图形图像处理算法(2) —— ToneMapping 技术
色调映射(ToneMapping)是图形图像处理中的关键技术,它能够将高动态范围(HDR)图像转换为适合显示器的低动态范围(LDR)图像,使图像在保持视觉真实感的同时,适应不同显示设备的特性。本文将从人类视觉系统的工作原理出发,深入探讨色调映射的定义、分类、实现方法及其在图像处理中的应用。
1. 色调映射(ToneMapping)定义
1.1 视觉的形成和特点
影像系统的核心功能之一就是图像显示,好的显示效果能真实的再现原始场景,给人的感觉就是和直接观察原始场景一样。色调映射使影像再现系统的一个重要组成部分,它能将原始场景的光照映射成显示设备的发光强度。
一个好的影像系统需要考虑人的视觉系统是如何处理光线的,场景辐射的光线被人类视网膜上的视杆细胞和视锥细胞捕捉,形成电信号,并传递到视觉神经通道中做进一步处理,这些信号会被若干层神经网络进行非线性处理,形成图形被称为知觉。此时的知觉的图像已经和原理物理辐射图像想去甚远。
人类为了能够在各种光照场景下都能够正常观察物体并分辨足够的细节,人的视觉系统进化出了多种机制以适应不同的光照条件,首先是瞳孔,它可以改变直径从而控制进入眼睛的光线的多少,这是对全局光照条件的一种适应性机制,其次是视锥细胞可以根据视场上的平均亮度(视网膜照度)调节敏感度,最后,当目光注视某一小区域时,视觉系统会自动调节局部对比度,因此,尽管人类生活环境中光照度变化可以达到数量级,从极弱的星光nits到阳光直射的nits,而人眼感光细胞的实际动态范围只有4个数量级就可以适应各种环境。
1.2 色调映射的定义
视频捕捉设备生成的图形一般是正比于光场景的光辐射强度的,即响应符合线性关系,尤其是当前主流的CMOS Image sensor(CIS),线性度好到可以直接对入射的光子数量进行计数,CIS的线性特点可以使人们很方便对视频捕捉设备捕捉的图像(主要是亮度域)进行处理,从而模拟人类的视觉行为,是设备输出的图像看起来更加自然,这个过程就叫做色调映射(tone mapping),简单的说,就是对不同的图像数据的亮度域进行转换的过程,狭义的就是指 HDR 图像转到 SDR 图像的亮度转换过程。
如果不做色调映射,摄像机输出的原始图形在人眼看起来会比较暗,如下图所示
摄像机捕捉的原始线性图像和人眼的知觉图像
这显然是因为人的视觉系统对视野中暗区信号做了提升以形成更强烈额知觉,这个特性可以帮助人类识别隐藏在黑暗中的危险,是人类对生存环境的一种适应。
2. 显示和场景类型
如果一个场景的动态范围小于影像系统的动态范围,则称该场景为LDR场景,此时需要对图像进行动态范围拉伸,以充分利用设备的动态范围。
如果一个场景的动态范围与影像系统的动态范围大致匹配,则称该场景为SDR场景
如果一个场景的动态范围大于影像系统的动态范围,则称该场景为HDR场景,由于影像系统的动态范围不足,在图形捕捉过程中可能会产生钳位(clipping),如果高亮部分发生饱和称为高光钳位(highlight clipping),如果暗区发生钳位则称为阴影钳位(shadow clipping),在同一场景中两者可能会同时出现。
有人研究了一下典型自然场景的对比度,得出的结论是平均对比度1:160,室外场景的对比度通常比较大,很容易甚至超过了1:1000,而有雾的场景对比度则比较低,人眼感光细胞的自然动态范围大致是1:10000
目前主流的显示器包含LCD和CRT两种,我们将其归类于标准显示设备,将其动态范围定义为SDR,用来区别HDR设备,HDR设备的显示动态范围高于SDR,一般来说,标准显示设备的动态范围为1:100,一些新的LCD设备可以达到1:400,印刷品的动态范围通常为1:50~1:500,取决于使用时的技术,HDR10标准显示设备的动态范围至少到达到1:1000以上,更前沿的HDR显示设备动态范围高达1:25000。
3. 全局和部分色调映射
色调映射可以是全局的(global tone mapping),映射算子具有空间不变性,也可以全局结合局部的(Global & local tone mapping GLTM),映射算子随空间位置而变化,这两种算法分别对应人类视觉系统的全局适应和局部适应的特性。
全局色调映射对图像中的所有像素使用相同的映射函数,因此相同的输入像素值会被确定的映射到一个相同的输出像素值。映射函数可以是一个指数函数,对数函数,sigmod函数,也可以是一个由图像本身决定的函数。
局部色调映射对空间位置不同的像素采用不同的映射函数。它的主要特点,对于每一个输入像素,由于其空间位置不同或者其周围的像素值不同,映射的输出像素值也不同。
再此基础上可以发展出第三类,即时色调映射,其映射规则会随时间推移而变化,通常用于处理视频序列。
一般来说,全局色调映射比较简单,计算较快,而局部色调映射算法复杂,计算较慢。在实践中经常会使用查表法加速全局色调映射算法,使其适合摄像机类的实时视频应用。当场景动态范围远大于影像系统的动态范围时,采用全局色调映射会损失较多的细节和对比度,此时需要引入一些局部色调映射的处理,用于改善对比度增加更多的细节。下图说明了局部色调映射改善对比度和图像细节的实际效果。
全局色调映射和全局加部分色调映射
4. 彩色的色调映射
一种常见的色彩表示方式是RGB格式,对色彩图像进行色调映射,可以理解为对图像的三个通道进行三次相同的色调映射运算(比如使用gamma映射),对全局色调映射来说,往往能取得不错的效果。但是局部色调映射不能简单地处理,否则很容易破坏图像的白平衡,在输出图像引入伪彩色。
另一种彩色图像的表示方式是将图像从RGB空间映射到YUV空间,其中的Y表示的是亮度(lumiance luma),UV表示的是色度(chrominance,chroma)。YUV空间的主要优势是实现了亮度和颜色的分离,Y通道值携带亮度信息,UV通道只携带色度信息。
对于YUV空间的图像,色调映射可以只在Y通道上处理,UV通道保持不变,这种做法的一个缺点是会降低颜色的饱和度,下图是YUV空间的三个剖面,分别对应Y=0,0.51.0,可以看到,如果UV保持不变,则Y值越大颜色的饱和度越低。
Y=0,0.5,1.0时候的不同UV组合的颜色特点
5. ToneMapping算法
为了让图像更加真实的显示在显示器上,需要ToneMapping的协助。整个ToneMapping的过程就是首先要根据当前的场景推算出场景的平均亮度,再根据这个平均亮度选取一个合适的亮度域,再将整个场合都映射到这个亮度域得到正确的结果,其中重要的几个参数:
Middle key:整个场景的平均灰度,关系到场景应处于的亮度域
Key:场景的Key将决定场景的亮度倾向,倾向偏亮或是偏暗
当前的toneMapping算法:
2002年Reinhard ToneMapping发表了一篇论文,toneMapping也是以他的名字命名,这个算法满足了从HDR转向SDR的需求,缺点是整体朝着灰色的方向被压缩了。
2007年CryEngine2克服Reinhard灰暗的缺点,提供了一种经验公式
2010年UNCharted公开算法
学术界的ToneMapping算法,来自Academy Color Encoding System(ACES)被认为是目前最好的toneMapping算法
参考文章:简述ToneMapping发展史_DT熊的博客-CSDN博客
5.1 Reinhard算法实现
首先要计算出场景的平均亮度,有很多种计算场景平均亮度的方法,目前常用的是log-averge亮度作为场景的平均亮度,通过下面的计算得到:
其中的表示的是像素点x,y的亮度,N表示场景内的像素数量,用一个很小的数用来应对像素点纯黑的情况。
上面的公式用来映射亮度域,a就是前面讲的key值,用来控制场景的亮度倾向,一般来说,会有几个特定值,0.18是一个适中的key,0.36或者0.72相对偏亮。完成映射的场景为了满足计算机显示范围还要将亮度范围再映射到[0,1]区间,可以通过下面的公式简单得到[0,1]区间的亮度。
效果图如下:
参考文章:【计算机视觉】HDR之tone mapping简介_hdr亮度mapping_Zhang_P_Y的博客-CSDN博客