为什么要使用gamma校正?
总结:在计算机时代早期,为了抵消当时主流的RTC显示器的非线性特征,拍摄图片存储过程中需要gamma校正。人眼对于亮度的感知反应也是非线性的,对暗部的特征变化更为敏感,恰好图片存储过程中的gamma校正正好能增加对暗部特征的采样,所以就算现在RTC显示器已经被淘汰,图片存储时仍然默认使用gamma校正,相应地,在现在的显示器端需要做逆gamma校正来使得最终真实物体亮度与显示器显示的亮度呈现接近1:1的关系。
人眼直接观察实物
根据图1史蒂文斯定律可知,人眼对亮度变化的反应是非线性的——对暗部颜色变化更敏感、很难区分亮部的颜色差异(说是进化的结果,帮助人们在夜晚也能快速发现危险)。具体的表现如图2所示
人眼的这种特性近似于Log函数,若用 x x x表示亮度, x ′ x' x′表示人眼反应,那么两者的对应关系为 x ′ = a ∗ l o g x x'=a*logx x′=a∗logx,其中 a a a为常数。
相机拍摄、存储、输出到显示器上,人眼再观察该物体
1. 拍摄
CCD、CMOS都是用硅作为光电转换器,他对光线强度的反应是线性的,光的亮度增加一倍,会使得感光元件接收到的光子数量增加一倍,可以简单理解成在相机对应像素点位置处的像素值也会增加一倍。
2. 存储
从图3可以发现图像捕捉设备在保存图像时会加上gamma校正,原因是:
1)CRT显示器的历史遗留问题
早期市场上几乎全是CRT(Cathode ray tube 阴极射线管)显示器,CRT在电能转为光能的时候表现的是非线性特性: I = V γ I=V^γ I=Vγ,其中 V V V为输入电压, I I I为CRT显示器在该电压下的显示亮度。由于显示器的非线性特性,为了最终在显示器上看到的和真实场景一致,所以存储的时候需要对拍摄原始数据进行gamma校正,两者非线性特征叠加正好抵消。
那么就有一个问题,现在CRT显示器基本都已经淘汰掉了,当今的显示器已经可以做到线性输出了,那么电子图像存储的时候是否可以废弃掉gamma校正?实际上,仍然还是需要伽马校正,因为他还有另外一个重要作用。
2)gamma编码图像能更有效地存储色调
自然界的光强度范围很广,但是我们磁盘的存储空间是有限的,常用的RGBA32格式,每个颜色通道有8位,最多只能表示256种亮度,所以需要一个把自然界很广的亮度范围映射到存储限制的256亮度范围的操作。
假设把亮度划分为10个等级,有两种映射方式:
-
物理线性(Physically linear)映射,把真实亮度均匀划分为十等份进行映射,但是由于人眼感知的非线性特征,看到的亮度变化如图5左边的方块颜色变化,这样子存储下来的图像丢失了很多人眼敏感的暗部信息,这样子会造成最后显示的时候人眼认为没有还原物体真实色彩。
(图5 物理线性映射) -
感知线性(Perceptually linear)映射,按人眼的感知亮度均匀划分亮度等级,能在不增加数据量的前提下,保留更多的暗部特征,更为真实地还原人眼所看到的真实场景。
(图5 感知线性映射)
这里的感知线性映射就是gamma校正,具体的做法就是:相机捕获到现实世界真实的光的信息,然后对这些输入开n次方根(n即gamma值,一般取1.8~2.2), O u t p u t = I n p u t 1 / g a m m a Output = Input^{1/gamma} Output=Input1/gamma,由于历史惯用,gamma取值2.2已成为业界标准。
3. 显示
从图3和图4我们可以知道,如果gamma校正与逆gamma校正中的 n n n值和 m m m值相等的话,最终真实物体亮度与显示器显示的亮度呈现1:1的关系。在实际应用场景中,也可以通过调节显示器逆gamma校正中的gamma值(即图3中的 m m m)来提升图片中的某些细节的清晰度,但同时会使得另一部分不容易分辨细节:
- 调大 m m m值,表现为总体提亮,原暗部占据更多明暗范围、易于分辨细节,原亮部变得更亮(白茫茫,占据明暗范围减小)且细节分辨变得困难。
- 调小 m m m值,表现为总体压暗,原亮部占据更多明暗范围、易于分辨细节,原暗部变得更暗(黑乎乎,占据明暗范围减小)且细节分辨变得困难。
不同显示器的gamma值不同就会造成同一张图在不同显示器上颜色有出入,所以一般图像在存储的时候会同时保存图像的color profile
,该文件用于描述图像颜色特征,它包含了一系列的参数,如颜色空间、颜色深度、色彩饱和度和亮度等信息,color profile
文件有不同的编写标准,其中sRGB
是应用比较广的一个通用标准。
参考: