Gamma校正
关于Gamma校正一直有各种解释,比如是为了与旧式的CRT显示器匹配,为了与人眼的视觉特性匹配等,让人看不清事情的真相。以下是我认为解释比较清楚的一些参考资料:
色彩校正中的 gamma 值是什么
这篇文章从人眼的视觉特性出发,解释了为什么需要gamma校正。主要原因有两点:
1. 人眼对自然亮度感知是非线性的(韦伯定律)。
2. 我们用来记录/展示画面的媒介上,灰阶预算是有限的(无论纸张还是屏幕)。
韦伯定律指出,人类大脑对亮度的感知是非线性的,光线暗的时候只要稍微增加一点亮度人就可以感知到;但是当光线比较强的时候,就需要增加比较多的亮度才能达到相同的感知差异,如下图所示(对数曲线):
因此,对于一幅图像来说,如果用8位深的数据来线性记录,就会发现大量的bit被用来记录亮部区域了,暗部区域只分配到很少的信息。而如果先用gamma处理一下,对于人眼来说才是均匀的。
作者的一个教学视频也非常不错,可以一起来看。
那gamma校正究竟与CRT显示器有什么关系呢?来看看维基百科的说法。
sRGB颜色空间和Adobe RGB颜色空间都定义了gamma:
sRGB:
sRGB also defines a nonlinear transformation between the intensity of these primaries and the actual number stored. The curve is similar to the gamma response of a CRT display. This nonlinear conversion means that sRGB is a reasonably efficient use of the values in an integer-based image file to display human-discernible light levels.
It is important to note that these linear RGB values are not the final result as they have not been adjusted for the gamma correction yet.The following formula transforms the linear values into sRGB:
As with sRGB, the RGB component values in Adobe RGB (1998) are not proportional to the luminances. Rather, a gamma of 2.2 is assumed, without the linear segment near zero that is present in sRGB. The precise gamma value is 563/256, or 2.19921875.
https://corona-renderer.com/forum/index.php?topic=13833.0 里面也说明了,sRGB采用gamma校正是为了效率(当时的机器内存和速度),而且当时没有人做Rendering。
对于Rendering来说,gamma校正是一个大问题。因为Rendering需要在线性空间进行计算,但输入的贴图是gamma校正过的,所以才有线性工作流的概念。