这很难。首先,一组 RGB 值不定义颜色。它们需要根据它们所指的原色(颜色空间)来解释,例如 sRGB、Rec.709、Rec.2020、Adobe RGB (1998) 等。
此外,我们通常遇到的 RGB 值与线性光不成比例:它们是使用非线性函数(伽马)“编码”的。有时(主要在视频应用程序中)“黑色”的值不是零,而是从零偏移,对于 8 位值通常为 16。而“白色”不是 255 而是 235。sRGB 和 Rec.709 共享 RGB 原色,但它们的 gamma 函数不同。
颜色空间转换从删除任何黑色偏移开始,使黑色为零。如果 gamma 函数中有断点(如 sRGB 和 Rec.709),则需要仔细缩放 RGB 值,使“white”为 1.0。
然后,通过执行原始伽马函数的逆来“解码”伽马。(一个答案建议对值进行平方,这是伽马解码的近似值。)现在您在某些颜色空间中具有线性光 RGB 值。此时,您可以从该颜色空间转换为 Lab 空间。大多数从 RGB 到 Lab 的转换都经过一个称为 XYZ 的中间颜色空间。
嵌套函数调用的步骤:
Lab = XYZ2Lab(RGB2XYZ(gamma_decode(offset_and_scale(RGB), gammaFunction ), RGB 颜色空间))
(实验室空间是在 1976 年开发的,旨在创建标准 CIE XYZ 空间的感知均匀扭曲。(Luv 是另一种尝试。)这个想法是两种颜色之间的欧几里得(直线)距离刚好- 任何两种颜色的距离明显不同(1“JND”)。Lab中两种颜色之间的距离称为“delta-E”。简单的delta欧几里得距离公式现在称为dE76。见https:/ /en.wikipedia.org/wiki/Color_difference)
在您的情况下,您可以平均两种 Lab 颜色以获得新的 Lab 颜色,然后反转所有转换以在您选择的颜色空间中返回 RGB。
这会让你接近,但不能保证,因为“颜色”是人类的感知,而不是物理量,并且众所周知难以可靠地表征。实验室在感知统一方面实际上并没有那么好。因此,他们没有修复 Lab,而是提出了一个新的、更复杂的 delta-E 函数,并内置了另一个 warp:DE94。这更好,但并不完美,因此在 2000 年出现了另一个提议:DE2000。也更好但并不完美。有关更多信息,请参见上面的 Wiki 页面。
如果 DE2000 不够好(或太复杂!),您可能会看看 Lab 的替代品ICtCp,它声称比 Lab 在感知上更统一。