直观理解图形学中的伽马校正(Gamma Correction)

 

我们在观察自然界的时候,能看到美丽的花花草草山山水水,那么这些景色是怎样进入我们的眼睛的呢?答:是以线性的形式进入我们的眼睛。此处的线性指的是y = xx是实际场景发出来的光照强度,y是入射到我们眼睛里,我们眼球接收到的光照强度(注意,此处我说的是眼球接收到的光照强度,并没说是大脑接收到的光照强度,我稍后来解释这个,这很重要!),如下图:

可是如果我们给这些景色拍照片,不做任何处理,直接在电脑上或者其他显示器上查看,则会发现这些图片都很暗,如下图所示:

左图:相机拍摄后,未经任何处理,在显示器上看到的样子;右图:人眼看到的实际景色

有的同学可能有疑惑,“为什么我的相机拍出来的就是右图啊,并不是左图啊?”其实,这是因为你的相机已经自动帮你做了处理了,甭管你拍出来的照片是jpg格式还是其他什么格式,都是经过了处理的,这个我们马上就会说到。

为什么我们在相机屏幕上看到的,或者在电脑屏幕上看到的图片要比我们用肉眼直接观察到的景色更暗呢?答案就是,这些屏幕(或者叫显示器)对图片进行了非线性处理。如下图:

蓝色线:眼球接收到的实际场景发出来的光;橙色线:眼球接收到的经显示器处理后发出来的实际场景的光

其中橙色的曲线就是经过了显示器处理后的输出曲线;我们注意到,这个橙色曲线和蓝色曲线相比,同样的输入强度,黄色曲线的输出强度更低,也就是亮度更低。

由于各种各样的历史原因和物理原因,我们无法做到让显示器进行线性处理(其实现在已经有线性输出的显示器了,只不过基本没人用),只能进行这样的非线性处理,但这样显然是不行的!

为了让显示器的输出结果与我们肉眼实际观察到的结果一致,我们可以对图片的亮度进行一个预处理,使得最终显示器的输出结果与上图的蓝线重合。由于显示器的输出结果是一个向下凹的曲线,我们可以对图片的亮度,或者说,对图片的颜色值进行一个向上凸的非线性变换,以此来抵消屏幕输出时向下凹的非线性变换造成的不良结果。如下图所示:

我们对图片的亮度进行红色线的非线性变换,当经过显示器的输出之后,显示器又对图片施加了一次橙色线的非线性变换,这两次变换叠加到一起,最终,我们从显示器获得的结果就是线性的了。而这就和我们直接肉眼观察到的实际场景一样了! 也就是说,我们只需要对图片进行这种上凸曲线的非线性变换,就可以得到预期的照片了,那么这个对图片的非线性变换过程,就叫做伽马校正(Gamma Correction)。

现在几乎所有的设备,都会默认自动执行伽马校正,所以我们拍出来的图片,即使不经过任何处理,也和肉眼看到的一样。其实处理还是要处理的,只不过不用我们自己动手而已。

现在业界通用的伽马值(Gamma)大小是2.2。上一个图中,蓝色线的函数是y = x,红色线的函数是y = x^(1/Gamma),橙色线的函数是y = x^(Gamma)

还有一个遗留问题:之前我说过,实际场景中的光是以线性的形式进入我们的眼球的,但我强调了,被我们大脑接收到的光却并非线性。我们的大脑会自动对进来的光进行一个非线性的变换,其变换结果,同我们施加给图片的伽马校正一毛一样!也是y = x^(1/Gamma)

虽然一样,但是不要混淆!我们之所以对图片进行伽马校正,是因为我们想要从显示器中得到和现实场景中一样的光照,而现实场景给我们的是线性的光照,显示器给我们的却是非线性的光照。因此我们就通过伽马校正,也把显示器的输出结果也变成线性的,这样就符合我们日常生活的观察结果了。

注:本文并不严谨,但本文意不在此,只是想给大家讲明白伽马校正的来龙去脉。把握住了这个,其他的细枝末节都好办了。

附:本文中,沙漠那张图片取自互联网,如违背版权请与我联系删除。

最后再推荐两篇讲解伽马校正的博文,用于对本文的内容进行补充:

其一

其二