SteveHawk's Blog

Gamma 矫正

  1. 人眼gamma

    人眼和听力等感官一样,对信号强度的感知是非线性的。物理实际亮度增加一倍,人眼感知亮度的增长少于一倍;即下图这样的上凸曲线:

    brightness-perception

    可以采用 $\log{x}$ 或者 $x^{\gamma}$ 的方式来对这条曲线进行建模。讨论gamma校正的时候我们会使用 $x^{\gamma}$,其中的 $\gamma$ 就是gamma参数,人眼的gamma大约在 1/2.5 ~ 1/2.2。

    (事实上人眼对亮度感知的非线性关系比这复杂的多,这里只是试图简单近似。)

    人眼这样的特性意味着,我们感知的灰阶和实际的亮度并非对等的,线性的亮度增长在我们看来会是一个过亮的灰阶,如下图:

    grayscale-1

    grayscale-2

    可以关注一个关键点:50%灰度(中灰)的位置,可以看到人眼感知的50%灰阶实际上亮度只有21.8%,而50%亮度对应的灰阶已经在73%左右的位置。

    middle-gray

    这个现象也可以描述为,人眼对于暗部更加敏感,对亮部相对更不敏感。

    因此,在存储图像的时候,可以通过一个trick保留更多人眼更敏感的细节:存储前进行gamma矫正,展示时再逆矫正回线性空间。

    如下图,直接存储线性空间的话,会导致暗于中灰的部分被分配到了更少的灰阶,而亮于中灰的分配到了更多的灰阶;如果先进行gamma矫正调亮整张图,让暗色部分分配到更多灰阶,则存储的时候能够均匀对整个灰度进行划分。

    gamma-encoded

  2. 显示器gamma

    CRT显示器和人眼存在类似的特性,输入电压和显示亮度并非呈线性关系,而是如下的曲线:

    crt-gamma

    这条曲线也一样可以用 $x^{\gamma}$ 来表示,gamma在 2.5 左右(1.4 ~ 3.0)。

  3. sRGB gamma

    为了让互联网上的图像使用一个统一色彩空间,以便在不同显示器上显示出同样的效果,微软和HP在1996年提出了sRGB色彩空间。

    他们参考了市面上的CRT显示器的平均线性电压响应,最后选择了Gamma校准系数为2.2的色彩空间。(实际计算公式并非简单的gamma2.2,而是gamma2.4加一个偏置值,不过最终曲线非常近似gamma2.2。)

    线性空间的图像在量化保存至文件的时候,会首先进行gamma=1/2.2的矫正,提亮暗色部分;展示的时候显示器会再施加gamma=2.2的矫正,显示出线性空间的亮度。

    srgb-gamma

    由于CRT显示器已经普遍拥有2.5左右的固有gamma,因此显示器厂商只需要进行微调,就可以符合gamma2.2的规范。现代显示器依旧沿用了这一传统,不论面板的固有gamma是多少,都会把显示效果调校至gamma2.2。

    这一标准也碰巧和人眼对亮度的感知特性匹配上,使用srgb的gamma2.2进行存储,能够更好地保留暗部细节,更均匀地利用数据空间。


参考:

https://www.cambridgeincolour.com/tutorials/gamma-correction.htm

https://www.w3.org/Graphics/Color/sRGB.html


#tech notes
本文总字数 1032
本文阅读量
本站访客量

↪ reply by email