我对gamma的理解是,根据人眼的特性,对真实世界的动态范围进行压缩的一种方法

以前对gamma的理解

以前我对gamma的理解就是,sensor对光线的感知是线性的,而人眼对gamma的感知是非线性的,因此需要一个映射。

camera拍出来的raw图,如果直接看,大部分区域都特别的暗,和现实世界完全不一样,因此需要通过gamma将暗处提亮
这个其实只是站在ISP调试的角度去理解ISP的。

这就带来了很多的问题,现实世界是线性的,为什么图片就要转成非线性?

raw图应该就是现实世界的还原,为什么我看raw图特别的暗呢?那我们平时通过显示屏看图片的时候,图片经过了一系列的非线性转换,为什么还和真实世界相同的效果呢?难道真实世界是指数的?

gamma理解的更新

了解了显示屏的gamma,终于打通了摄像头从拍照到显示的这个回路,理解了为什么要用gamma

首先摄像头是线性感光的,现实世界的光线强度就是线性的,这个动态范围是很大的,通常摄像机拍出来的raw图都是12比特的,也就是说动态范围可以到10^12。即可以测量的最亮亮度是最暗亮度的4096倍,转换成db,就是72dB。当然即使是这样的动态范围,还是不足以完美的描述现实世界,因此搞了一系列的高动态范围的操作,可以让动态范围进一步的扩大。

但是拍出来的照片需要考虑存储,如果线性存储的话,这个存储量是很惊人的。有没有方法把现实世界12比特以上的数据压缩到8比特呢?通过移位肯定是不行的,会造成精度损失。因此聪明的科学家根据人眼对亮度的感受是成指数的原理,对数据进行非线性压缩,这个gamma曲线是经过实验得出的。亮处压缩的多,暗处压缩的少

最后一步就是对照片的还原。显示屏,和现实世界以及camera拍出来的raw图一样,都是一个线性的世界,而存储的图片亮度是个非线性域。图片怎么压缩的,就来一个反变换函数进行解析(解码)。
微软联合惠普和爱普生提出了sRGB标准,推荐显示器的gamma值为2.2。display P3的标准gamma值为2.6,由于这个gamma值更大一点,所以P3的照片用普通的显示器看应该更亮一点,sRGB的照片用p3显示器看应该更暗一点,还可能会让亮度的差异变得更加明显,不够平滑,导致大面积色块的问题。

gamma的发展

Gamma 曲线的产生最早可以追溯到电子显像管的模拟时代:本来自然光线进入人眼是 一个线性变化结果,但是由于当年 CRT 显示器所使用的电子管的模拟特性,会使得电 子束发生亮度衰减,该衰减基本上符合幂函数:
F(x) = x^2.2, x∈[0,1]

所以为了弥补 CRT 带来的衰减,模拟时代的电子工程师们在视频制作的时候加入一个 反向增益 F(x) = x^(1/2.2), x∈[0,1]。这条幂次约为 0.45 的曲线就是现在我们常用的 Gamma 曲线的原型。

CRT gamma curve & Gamma correction curve

到了数字时代,本来 LCD 显示屏不存在衰减的问题,但是由于为了和模拟时代的视频 内容兼容,工程师人为在 LCD 显示上做了类似 CRT gamma 的信号衰减。并且意外的 发现带来了两个好处:

  1. CRT gamma 的曲线特征是压缩暗区,增大亮区。在早期显示亮度不够高的情况 下,能够有效压缩暗区噪声同时保留亮区细节
  2. 在早期动态范围不够高的情况下(0.5~100 nit),CRT gamma 曲线与 Barten 曲线 契合度较高。这意味着 CRT gamma 曲线对码字的利用率很高。

因此,CRT gamma 曲线就这么被保留下来并沿用至今。

由于幂函数在 0 点的斜率为无限大,这意味着靠近信号 0 附近的噪声会被迅速放 大。为了抑制噪声,ITU-R 规定输入小于 0.018 的信号均使用一次线性函数进行“放 大”。为保证曲线平滑性,该线性函数的斜率与原幂函数在 0.018 处的斜率相等。最终 修正后得到了我们目前最常用的 Gamma 曲线(BT.709):

虽然大部分情况下,使用 0.45 次幂的 Gamma 可以满足需求,但是如果观看环 境(ambient light)发生变化,则需要用不同的 Gamma 曲线来进行拟合。例如制作电 影时使用的 Gamma 曲线约为 0.45 次幂,但是在播放时采用的设备用的是 2.6 次幂,两 者拟合的结果并非线性,但是在电影院这种环境光很微弱的情况下,能够给观众带来 更好的对比度效果和观看体验(System Gamma)。

在 SDR 时代,由于传输曲线需要表达的动态范围并不大(最大只有 300nit 左右),因此 Gamma 曲线性能是满足 JND 需求的。但是进入到 HDR 时代后,由于需要表示的动态范围大了至少两个数量级(103->105), 因此 Gamma 曲线性 能已不能满足 JND 需求。所以研究人员认为,直接使用 Barten 曲线用来作为传输曲线,应该是性价比最高的方 法。通过数学拟合,研究人员得到了线性域下用来描述 Barten 曲线的数学公式。这便 是 PQ 曲线(Perceptual Quantized Curve)

其中:

m1 = 2610/16384 = 0.1593017578125
m2 = 2523/4096*128 = 78.84375 
c1 = 3424/4096 = 0.8359375 = c3 - c2 + 1 
c2 = 2413/4096*32 = 18.8515625 
c3 = 2392/4095*32 = 18.6875

除了 PQ 曲线,研究人员在研究 Barten 曲线时发现,原 Gamma 曲线在低亮度区域的曲 线性能与 PQ 曲线近似,而在高亮度区域的曲线性能有较大损失,而满足 Log 形式的 曲线的曲线性能在高亮度区域与 PQ 曲线近似。因此研究人员决定将 Gamma 曲线和 Log 曲线结合成一条平滑连续的曲线作为传输曲线。这便是 HLG 曲线(Hybrid LogGamma Curve)

其中:
a=0.17883277, b=0.28466892, c=0.55991073

不管是 SDR 的 Gamma 曲线,还是 HDR 的 PQ、HLG 曲线,都是为了尽量使用有限的 带宽来表达线性光的强度。如果观察采集、传输、显示这一整套端到端的系统,我们 会发现整个视频信号处理的过程,就是“将拍摄现场的场景光线颜色信息还原到观看 的显示设备的光线颜色信息”的过程。而这个过程,被称为 OOTF(Opto-optical Transfer Function,光-光转换曲线)

OOTF 系统框架示意图

和渲染之间的联系

游戏界也长期忽略了显示器的gamma问题,导致渲染的画面偏暗,错了几十年。游戏渲染的其实是个线性世界,如果直接输出显示,由于显示器自带一个2.2的gamma,会导致渲染出来的画面总是暗沉沉的。因此游戏渲染在输出前需要先用gamma进行gamma矫正,再送去显示。

疑问

既然显示屏是按照2.2次方的gamma对图片进行还原,理论上isp应该让照片更加符合现实场景,那么为什么不直接在raw图上用1/2.2次方的gamma处理呢?

我的思考:可能是由于镜头的影响,sensor感知到世界和现实世界有一定的差距,同时很多时候都需要对图片进行一个对比度等效果的增强,如果在这个基础上再去乘以一个增益,会带来更多的精度损失,还不如用一条自定义的gamma一步到位。