伽玛曲线和线性曲线

我们在讨论色彩理论时,“线性”指的是每级亮度变化区间均保持一致的情况。然而肉眼对亮度的感知却不是线性的。我们发现比起在亮部的灰色,人们更容易区分暗部的灰色。

由于计算机是供人使用的,为了迁就人类视觉的特点,我们在图像的色彩坐标系统里为暗部的颜色预留了更多空间。这种调整发生在图像 TRC 的 gamma 函数上,所以我们把它叫做“伽玛值编码”。此处的 TRC 的含义可以是 阶调响应曲线 、也可以是阶调重现曲线、也可以是转换函数之类的东西 (色彩管理专家爱跟自己过不去),它们的作用是告诉计算机或打印机某个颜色数值应该怎样去进行响应。

../../_images/Pepper_tonecurves.png

在使用 Krita 的色彩管理功能时,人们常见的困难之一是为不同方式编码的 TRC 指定正确的色彩空间。在上图中间位置的 Pepper 的颜色是正确的,它编码所用的和被指定的 TRC 是一致的。左侧的 Pepper 在 sRGB 空间下编码,却被指定为线性空间;右侧的 Pepper 用线性 TRC 编码,却被指定为 sRGB 空间的 TRC。图像来自 Pepper & Carrot

下图展示了各种色彩空间的 TRC 和亮度的关系。第二行的 sRGB TRC 被广泛用于当代计算机环境。第一行的线性空间分配给浅色的空间要远大于 sRGB TRC 特性文件以及 Krita 自带的其他 TRC 特性文件。

../../_images/trc_gray_gradients.svg

仔细观察 Rec. 709 TRC 空间的亮度分布,你会发现它的暗部色调和亮部色调之间有一处明显的跃迁,而 Lab L* TRC 和 sRGB TRC 空间的亮度间隔看起来更均匀。这是因为人眼对暗部色调更为敏感,后面两种空间的亮度分布更符合人眼的感知特点。这也意味着如果色彩通道位深度不足,线性色彩空间就会产生难看的颜色条纹。所以在制作用于屏幕显示的图像时,我们总是采用 Lab L*、sRGB 或 伽玛值为 2.2 的 TRC 曲线等方式来编码图像。

但是,这种针对人眼特性的非线性修正会在混色时干扰色彩运算。

我们可以通过下面的实验来演示:

../../_images/Krita_2_9_colormanagement_blending_1.png

左图 常规 sRGB 空间下的模糊效果; 右图 线性空间下的模糊效果。

我们使用滤镜对几个彩色的圆形进行半模糊处理。在伽玛值校正后的环境下,该操作会产生奇怪的黑边。而在线性环境下,该处理给出了自然的渐变效果。

Krita 的颜色涂抹笔刷引擎也受其影响:

../../_images/Krita_2_9_colormanagement_blending_2.png

看到这里是不是感觉恍然大悟?“颜色很脏”这个数字画手常有的抱怨,实质上是伽玛值校正后的色彩空间扭曲了颜色。如果你想要在 LAB 空间中工作以避免这个问题,记得要使用一个线性的色彩空间。

不同 TRC 影响颜色运算的原理

现在请想象我们要对红和绿进行混色。

首先,让我们确定红和绿在选定的色彩空间和色彩模型中的坐标。它们是:

颜色

绿

1.0

0.0

0.0

绿

0.0

1.0

0.0

接着我们给三种不同的混色组合分配坐标值:

混色 1

混色 2

混色 3

绿

1.0

0.75

0.5

0.25

0.0

绿

0.0

0.25

0.5

0.75

1.0

0.0

0.0

0.0

0.0

0.0

为了得出这些颜色在屏幕上的显示效果,我们要先把每组数值通过当前色彩空间的 TRC 进行换算:

../../_images/Basicreading3trcsv2.svg

然后我们将得到的数值填入相应的位置。不难发现,下表的最终数值和一开始的混色表格的数值存在较大差异。

../../_images/red_green_mixes_trc.svg

上面的实验很好地解释了为什么颜色在线性空间中的混色结果更为明亮和柔和。但这里有一个很现实的问题:虽然线性空间在物理上更准确,但 sRGB 对色彩空间的利用更高效,所以绝大多数图像还是选择了 sRGB TRC 来进行编码。不过在这个例子中使用后者的效果并不好:sRGB 在某些坐标上给出了比线性空间 暗得多的数值

现在我们终于搞懂了为什么不同的 TRC 会有不同的混色特性。为了进一步强化对这个原理的感性认识,我们在下图中对几种典型的 TRC 的混色效果进行了一次横向比较。从左到右我们准备了四组颜色渐变,每组渐变又列举了三种混色方式的效果,从左到右分别为:线性空间、sRGB TRC 空间、Lab L*TRC 空间。

../../_images/3trcsresult.png

现在你可能会想问:怎样才能启用线性空间?有一个选项来控制它吗?答案是:你要通过特定的 ICC 特性文件来使用线性空间。Krita 已经自带了一系列线性 ICC 特性文件:

  • scRGB (linear)

  • elle 系列中所有后缀为“g10”的特性文件,如 sRGB-elle-v2-g10.icc 等。

每个“elle”系列特性文件最后的数字代表了该空间的伽玛值。1.0 为线性空间,大于 1.0 就是伽玛值校正空间。“srgbtrc”是初版 sRGB 特性文件所采用的特殊的伽玛校正曲线。

在使用色彩空间浏览器时,你可以从“估算伽玛值”一项看出该空间是否为 TRC 空间 (如果是 1.0 则为线性空间)。Krita 3.0 里面可在 TRC 窗口部件中找到此项,它看起来和上方的曲线图一模一样。

即使你不怎么绘画,只是需要为视频游戏和 3D 渲染制作材质,使用线性空间依然可以减少引擎内的转换环节,从而提高渲染速度。

线性空间有一个最为明显的缺点:把一种颜色与黑、白混色时,黑色的效果非常不明显,而白色的效果非常强势,这是因为在线性空间中浅灰色所占的比例比深灰色要大得多。说到底,尽管线性空间在物理学上是准确的,在配合基于物理学的游戏渲染引擎和光线追踪时效果更好,但 Krita 毕竟是一个绘画工具,如果你习惯了在符合人类感知特点的 sRGB TRC 空间下面进行混色,没有人会因此刁难你。