BjörnOttosson最近发表了一篇博客,介绍Oklab。该博客声称Oklab比以前具有更好的感知色彩空间。它激起了我的兴趣,我想自己看看。
在探索可感知的色彩空间时,我发现一种交互式的渐变工具非常有用,因此我在此处复制了一个:
大多数图像处理是使用设备色彩空间(最常见的是sRGB)完成的,并且大多数库和接口都公开了该色彩空间。即使图像编辑工具或标准(例如CSS)暴露了其他色彩空间,使用设备色彩空间仍然是最常见的。但是对于某些用例,可感知的色彩空间可以提供更好的结果。
基本上,颜色理论的中心问题是如何感知颜色(在物理意义上)。三色性假设基本上将颜色在三维空间中划分为等价类,并且显示设备通常通过混合三种加法基色来生成颜色:熟悉的红色,绿色和蓝色。
在理想的感知色彩空间中,空间中两点的距离将与色差感知紧密相关。换句话说,被“恰到好处的差异”分开的所有对将被等距离分开。
事实证明,这种事情只不过是使橙皮变平,因为颜色感知本来就不是欧几里得。换句话说,围绕色相圆的可感知的不同步长与直接穿过灰色的步长之比,比普通欧几里得空间中的圆所期望的大。
即使这样,也可以像地图投影一样,创建接近于感知均匀性的色空间,并且可用于各种任务。其中一个是本博客文章的主要重点,是更平滑的渐变。
渐变当然与色标非常相似,并且良好的感知色空间可用作这些色标的基础。更好的方法是使用真实的颜色外观模型,如Matplotlib的“更好的默认颜色图”中所做的那样,并且在该视频中得到了很好的解释和启发(它还简要介绍了颜色科学)。
感知色彩空间的主要应用是图像处理,尤其是更改图像的色彩饱和度。在这个特定的地方,色相均匀性很重要,因为您不希望色相发生变化。另外,在将彩色图像转换为黑白时,亮度的预测尤为重要。
感知色空间也是调色板的程序化操纵的良好基础,例如创建彼此特别相关的颜色集,或从另一种颜色派生出明暗模式。例如,按钮的正常/悬停/活动/禁用状态可能是同一色相的不同亮度和饱和度值,因此色相偏移是不希望的。特别是,我认为标准混合模式的未来发展应该至少可以选择在高质量的感知色彩空间中进行混合。
而且,正如Björn所述,拾色器小部件可以受益于良好的感知空间。特别是应该有可能在不影响色调的情况下调整亮度和饱和度。
关于感知色彩空间的许多文献都针对图像压缩,主要有两个动机。首先,由于压缩会增加错误,因此通常需要将这些错误均匀地分布在感知空间中。在特定阴影区域中出现明显突出的伪影根本不是一件好事。其次,良好的压缩取决于明度和色度信息的清晰分离,因为后者可以得到更好的压缩。
综上所述,在某些情况下,您绝对不想使用感知空间。通常,对于图像过滤,抗锯齿和alpha合成,您想使用线性空间(尽管此处有些微妙之处)。甚至在某些情况下,您想使用设备空间,因为设备色域通常是很好的立方体,而在其他颜色空间中它的形状却相当复杂。
这篇博客文章将以渐变为主要视角来研究感知色彩空间。它们是某些缺陷(尤其是缺乏色调均匀性)的非常敏感的工具,并且本身就是一个有用的目标。
中性色的传递函数是任何颜色空间的字面主干。通常称为“伽马”,它是计算机图形学中最常被误解的主题之一。 Poynton的论文是权威性的论文,我向感兴趣的读者推荐,但将尝试总结要点。
渐变的理想传递函数从黑色到白色在感知上的步长相等。通常,CIELAB中的传递函数被认为接近于感知上的统一,但是与以往一样,在颜色感知中,真相要复杂一些。
尤其是,感知取决于观看条件。其中包括环境光,还包括环境。被白色包围的相同渐变会比被黑色包围的渐变更暗。有关环绕声影响亮度感知的功能的极有说服力的演示,请参阅秋吉的幻觉页面,例如此页面。
另一个复杂之处在于,眼睛接收到的光包括所谓的“遮盖眩光”,这是显示器反射的一部分环境光,因为它的黑色不是完美的吸收体(在类似电影的环境中,遮盖眩光的问题少得多) )。
实际的CIELAB传递函数不是一个完美的立方根规则,而是在近黑色区域中包含一个线性段(sRGB传递函数相似,但参数不同)。在存在遮盖眩光的情况下,此段增加了渐变的感知均匀性,还使查找表可以可靠地使变换可逆。
关于感知如何随观看条件而变化的科学很好,并且CIECAM颜色外观模型具有可以在已知这些参数时对其进行微调的参数。但实际上,收视条件尚不清楚,最好的方法是采用最佳猜测或折衷方案。
HDR是一个不同的故事,我需要深入探讨一下ICtCp颜色空间。
在标准动态范围内,您基本上会假定视觉系统适合一组特定的观看条件(实际上,sRGB指定了一组精确的观看条件,包括监视器亮度,白点和室内照明)。从黑色到白色的感知上均匀的梯度对于图像编码也很有用,因为如果您设置步数,以使每个步都不容易察觉,则它会为每个样本使用最少的位数,同时忠实地渲染图像而不会出现伪影。在sRGB中,256电平对于大多数用途来说勉强够用,尽管在显示渐变时步通常是可见的,在这种情况下,眼睛对量化误差最敏感。
但是,在HDR中,这种方法不太有效。由于来自显示设备的亮度值范围更广,并且对观看条件的假设也较弱(在电影观看中,较暗的房间很常见),因此人类视觉系统可能随时适应于非常亮或非常暗的观看条件。在后一种情况下,与适应较亮的条件相比,它对接近黑色的渐变要敏感得多,反之亦然。如果针对任一单个亮度级别进行调整,则当匹配匹配时结果会很好,否则效果会很差。
因此,HDR使用不同的方法。它使用一个模型(称为Barten模型,在Poynton论文的图4.6中显示),该模型在所有可能的适应条件下,在每个亮度水平上都可以感知到最小的对比度阶跃。目的是确定步骤的顺序,以使每个步骤都处于在任何观看条件下都可以感知的阈值之下。
SMPTE ST 2084传递函数基本上是对经验Barten模型的数学曲线拟合,并具有以下特性:在12位代码字的情况下,每一步都小于Barten模型所预测的最小感知差异的0.9。亮度范围从0.001到10,000尼特(7个数量级)。 “扩展动态范围图像的感知EOTF”演示文稿(PDF)中有更多细节和内容。
也就是说,尽管它非常精致,并且与经验的Barten曲线非常吻合,但是在任何一种特定的观看条件下,它在感知上都不统一。特别是,ST 2084曲线的斜率将在黑色附近停留太长的时间(表示在黑暗的观察条件下更容易看到的范围)。要亲自查看,请尝试上面的交互式资源管理器中的黑+白按钮。
我们基本上可以将曲线放置在从“太暗”(ST 2084)到“太亮”(线性光)的范围内,所有其他曲线介于两者之间。 CIELAB是一个相当不错的中位数(尽管这可能表达了我的个人喜好),其中IPT较浅,Oklab较暗。
我发现比约恩(Björn)支持纯立方根的论点并不完全令人信服,但这也许是一个悬而未决的问题。 CIELAB和sRGB都使用黑色附近的有限导数区域。限制导数对于更精确的基于LUT的计算是否重要?也许在2021年,我们几乎总是会选择ALU而不是LUT。条件部分也不理想,尤其是在GPU上,分支会影响性能。我个人将探讨形式为$ f(x)= a +(b + cx)^ \ gamma $的传递函数,将其约束为$ f(0)= 0 $和$ f(1)= 1 $,因为它们是GPU友好,并具有平滑的派生。 JPEG XL中使用的XYB颜色空间显然也使用了偏差而不是分段线性区域。 (来源:Oklab上的HN线程,因为我不容易找到文档)
CIELAB,IPT,ICtCp和Oklab都共享一个简单的体系结构:一个3x3矩阵,一个非线性函数和另一个3x3矩阵。除了简单之外,该体系结构还很容易反转。许多其他色彩空间要复杂得多,而CIECAM就是一个特别糟糕的犯罪者。
该体系结构中各种颜色空间之间的主要区别在于非线性函数,该函数确定了如上所述的黑白渐变。一旦就位,剩下的参数就会相对较少。可以通过手动操作或使用自动优化程序来优化成本函数,从而优化这些功能。
特别是,ICtCp源自ST 2084传递函数,然后针对色相线性度和良好的亮度预测进行了优化。需要注意的重要一点是,在HDR环境中进行良好的亮度预测并不意味着亮度步长在感知上是一致的,而是具有相同报告亮度的颜色具有相同的感知亮度。 ICtCp在后一种标准中表现良好,但在前一种标准中表现不佳;从根本上讲,它的色彩空间适合HDR。
在色调线性方面,我的评估是IPT,ICtCp和Oklab都相当不错,并且比CIELAB有了很大的改进。这并不出乎意料,因为它们都针对高质量的Ebner-Fairchild数据集进行了色调线性度的优化。
为什么CIELAB在蓝色范围内出现如此严重的色调偏移,这一直是我一个谜。我认为其中有些只是对矩阵参数的不良调整,但还有一个更深层次的问题。深蓝色和白色的加和混合会导致向紫色的色调转变。如果詹姆斯·克莱克·麦克斯韦(James Clerk Maxwell)混合足够强的蓝色,他将能够在旋转陀螺实验中观察到这一点。我不确定确切何时首次提到。
最近的研究表明,改变高斯光谱的带宽但保留其峰值波长,往往会改变感知到的色彩饱和度,同时又保持色相的恒定性。使用高斯光谱派生色相线性色彩空间的作者对此进行了观察,并试图利用这一事实从第一原理而非实验数据中得出色相线性色彩空间(也非常类似于IPT)。结果好坏参半;结果非常好,但并不完美,这也许说明优化过程始终对优化标准中的缺陷非常敏感。无论如何,我发现该论文可以提供直观的见解,以说明为什么这个问题不是那么简单,尤其是为什么与中性相加的附加光混合不能保持色调。
关于亮度,Oklab博客提出比IPT更准确的预测。我最初对此主张表示怀疑(这与埃伯纳论文中的类似主张并不完全一致,尤其是参见图69和71),但经过仔细研究,我同意。以下图像应帮助您自己验证此主张:
第一个是IPT中具有相同亮度(I)值的色标的集合,第二个是Oklab中具有相同亮度(L)的色标的集合。在我眼中,第二个具有更均匀的亮度,而在IPT中,蓝色太暗,而黄绿色太亮。
也可以客观地评估此声明。 CIELAB中的L *轴已广泛用于预测亮度。因此,偏离它是一个不好的信号。下图显示了随机颜色的散点图,水平轴为CIELAB L *,垂直轴为IPT和Oklab的明度轴:
可以看出,Oklab在亮度等级上与CIELAB的关联更为紧密,而IPT则有相当大的差异。我也很感兴趣地看到ICtCp与CIELAB也有很强的相关性,尽管由于传递函数而存在明显的非线性。
亮度差异不会对渐变产生巨大影响,但会影响图像处理操作,例如更改饱和度。因此,我不建议将IPT用作这些操作的色彩空间,而建议Oklab则更为舒适。
我没有仔细评估此声明,部分原因是它与高质量渐变的相关性受到限制。色度的相对变化当然非常重要,但是归因于高度饱和颜色的绝对色度值与渐变无关紧要。即便如此,定量数据仍表明Oklab是更准确的预测指标,并且很容易相信,因为IPT并未针对此标准进行精心优化。
良好的感知色彩空间可以产生更高质量,更均匀的渐变。尽管CIELAB广受欢迎且广为人知,但其色相变化却是一个问题。最初的IPT色彩空间是一个很大的进步:它在保持相同的简单结构的同时,具有更好的色相稳定性。就是说,它对亮度和色度的预测调整得不太好。
IPT的理想特性启发了一系列IPT式色彩空间,主要区别在于传递函数的选择。显然,该家族包括ICtCp,该ICtCp使用了针对HDR优化的传递函数(但可悲的是,它使其不太适合通用)。类似于IPT的色彩空间的现代配方是选择一个传递函数,然后优化矩阵参数以实现色调线性和准确预测亮度和色度。 Oklab基本上是应用该配方的结果,从多维数据集根传递函数开始。
对于当今使用CIELAB的大多数应用,IPT和Oklab都是更好的选择。 尽管Oklab确实具有更好的色度和亮度预测,但它们之间的选择是一个判断标准。 有没有更好的色彩空间? 我认同。 我个人希望在近黑色区域(更接近CIELAB)看到传递函数具有更多的对比度,但这是一个判断。 我还认为,可以根据更高质量的数据进行优化; 索引现有颜色空间会保留该空间中的所有缺陷。 也许最大的担忧是,没有任何明确的竞争者会成为CIELAB后的标准。 Oklab的另一种说法是具有更高质量的数据,以及建立共识的过程,可能正是这样。 同时,我强烈建议您使用Oklab进行更好的渐变等任务。 这篇博客文章从与BjörnOttson和Jacob Rus的交谈中受益匪浅,尽管我的错误当然是我自己的。