当前位置: 代码迷 >> 综合 >> Tone Mapping---色调映射算法
  详细解决方案

Tone Mapping---色调映射算法

热度:23   发布时间:2023-11-08 21:06:35.0
1. 【背景 - 高动态图像】

图像的动态范围: 图像的 Max(亮度值) / Min(亮度值)

高动态图像 : 动态范围大的图像

高动态 VS 普通 : 高动态图像(位数 > 8位) 普通灰度图像(位数 = 8位 一般情况) 显示器的灰度Only 8位

怎么办 -处理 : 将高动态图像的颜色 -> 变换 才能显示出来;

另外高动态图像的灰度值分布的很不均匀,只有少数的像素点较亮,所以如果直接对图像进行线性的归一化(把灰度最大值映射为255,最小值映射为0)再显示,则图像会一片黑(参考左下图)。色调映射(tone mapping)就是为了解决这个问题而生。

在这里插入图片描述

色调映射(tone mapping)算法**

Tone Mapping原是摄影学中的一个术语,因为打印相片所能表现的亮度范围不足以表现现实世界中的亮度域,而如果简单的将真实世界的整个亮度域线性压缩到照片所能表现的亮度域内,则会在明暗两端同时丢失很多细节,这显然不是所希望的效果,Tone Mapping就是为了克服这一情况而存在的,既然相片所能呈现的亮度域有限则我们可以根据所拍摄场景内的整体亮度通过光圈与曝光时间的长短来控制一个合适的亮度域,这样既保证细节不丢失,也可以不使照片失真。人的眼睛也是相同的原理,这就是为什么当我们从一个明亮的环境突然到一个黑暗的环境时,可以从什么都看不见到慢慢可以适应周围的亮度,所不同的是人眼是通过瞳孔来调节亮度域的。

而这个问题同样存在在计算机图形上,为了让图像更真实的显示在显示器上,同样需要Tone Mapping来辅助。
整个Tone Mapping的过程就是首先要根据当前的场景推算出场景的平均亮度,再根据这个平均亮度选取一个合适的亮度域,再将整个场景映射到这个亮度域得到正确的结果。其中最重要的几个参数:
Middle grey:整个场景的平均灰度,关系到场景所应处在亮度域。
Key:场景的Key将决定整个场景的亮度倾向,倾向偏亮亦或是偏暗。
首先我们需要做的是计算出整个场景的平均亮度,有很多种计算平均亮度的方法,目前常用的的是使用log-average亮度来作为场景的平均亮度,通过下面的公式可以计算得到:

在这里插入图片描述
其中Lw(x,y)是像素点x,y的亮度,N是场景内的像素数,δ是一个很小的数用来应对像素点纯黑的情况。

在这里插入图片描述
在这里插入图片描述
上面的公式用来映射亮度域,α即是前面所讲的Key值,用来控制场景的亮度倾向,一般来说,会使用几个特定的值,0.18是一个适中的Key,0.36或者0.72相对偏亮,0.09甚至0.045则是偏暗。完成映射的场景为了满足计算机能显示的范围还要将亮度范围再映射到[0,1]区间,可以通过下面的公式简单的得到[0,1]区间的亮度。
在这里插入图片描述
不过这样得到的结果并不总是令人满意的,所以一般扩展为如下面的公式,公式中的参数Lwhite用来控制场景中的曝光,凡是亮度超过Lwhite的像素都会被置为纯白。如果Lwhite的值非常大,则这个参数在公式中将不起任何作用,如果非常小则场景将变为几乎全白。Ld即为我们所要的映射后的x,y像素点的亮度值。在这里插入图片描述
Tone Mapping一般作为HDR算法中的一部分存在,在使用中会灵活很多,但基本的原理都是相同的。

**

色调映射方法的分类

**
色调映射方法可以大致分为两类:全局方法与局部方法。
全局方法
全局的色调映射方法,指的是整幅图像,都采用相同映射函数的方法。比如上面提及的Gamma校正就是一种全局色调映射方法。
全局方法的特点是:

  1. 任意相同颜色的像素点,在映射后,还是相同的颜色;
    2.全局算法一般较简单,速度快;
    3.全局算法的性能一般劣于局部方法;
    常见的全局方法有:Gamma校正,对数校正,直方图规定化,分段灰度变换等。
    这里需要简单提及一下 对数校正 和 直方图规定化 。
    对数校正 是基于韦伯-费希纳定律的一种色调映射方法。德国生理学家韦伯发现,同一刺激差别量必须达到一定比例,才能引起差别感觉。举个例子来说,如果一个人拿着10kg的重物,再增加0.1kg的重物可以让他恰好察觉到,那么当他拿着100kg的东西时,增加1kg的重物才能让他恰好察觉到。这种过程可以用一个微分方程来描述。对这个微分方程积分,可以得到人感知到的重量,与实际重量的关系,其为一个对数函数。而对于人的视觉而言,在一个温和的区间内,人眼感受到的亮度,和实际的光照强度是成对数关系的。而未经处理的原始图像,像素点的灰度值都是由实际光照强度线性放缩得来的,所以如果经过一个对数变换,就会让人觉得看上去更舒服。详细关于韦伯-费希纳定律的内容,请参阅维基百科。
    直方图规定化,是一种追求图像信息熵最大的色调映射方法。信息熵是从热力学里引申出来的量,其代表的数据中的信息量。信息熵的计算方法为-∑p?ln§,其中p为某个灰度等级在该图中出现的概率。对于一幅图来说,如果他的灰度直方图是均匀分布的,那么他就有最大的信息熵。所以说,直方图规定化,是一种让色调变换后,直方图尽量接近均匀分布的色调映射方法。

局部方法
局部的色调映射方法,指的是像素所在位置不同,其映射后灰度值也可能不同的方法。像素点的映射结果,受到其他因素的影响。
局部方法的特点是:
1.映射前颜色相同的像素点,映射后颜色可能不同
2.局部算法一般较全局方法更复杂,速度相对较慢;
3.局部算法的性能一般优于全局方法;
4.会出现光晕等现象

高动态图像:
对于一幅图像来说,图像的动态范围是指图像最大亮度值比最小亮度的比值。而高动态图像,就是指动态范围大的图像。对于高动态图像而言,其位数往往高于8位(普通的灰度图像位数一般是8位),而显示器的灰度只有8位,所以必须对高动态图像的颜色进行变换,才能显示出来。另外高动态图像的灰度值分布的很不均匀,只有少数的像素点较亮,所以如果直接对图像进行线性的归一化(把灰度最大值映射为255,最小值映射为0)再显示,则图像会一片黑(参考左下图)。色调映射(tone mapping)就是为了解决这个问题而生

色调映射算法的定义:
色调映射算法,是指对图像颜色进行变换的算法。其目的在于调整图片的灰度,使得处理后的图片看上去更舒服,能更好的表达原图里的信息与特征。

【举个例子】
Gamma校正
最原始的tone mapping算法就是使用简单的gamma校正,先将图像归一化到区间【0,1】,令归一化后灰度值为Vin,校正后图像灰度值为Vout,则满足下面关系:
在这里插入图片描述
在这里插入图片描述
相关公式参考链接 :http://www.cnblogs.com/bigbigtree/p/3458797.html

相关优秀算法示例 :https://wenku.baidu.com/view/d5996bb8be23482fb5da4c26.html
shttps://lealzhan.github.io/lealzhan.github.io/blog/2017/12/28/tone_mapping/

http://people.csail.mit.edu/sparis/#code

  相关解决方案