如果我有两种颜色由RGB值定义,我可以平均红色,绿色和蓝色值然后组合以定义看起来像两者的视觉平均值的第三种颜色吗?
即NewColor =(R1 + R2)/ 2,(G1 + G2)/ 2,(B1 + B2)/ 2
EDIT1:感谢所有回复.对于我目前的需求,我只处理颜色相同的颜色对,所以我认为平均它们会起作用.但是,我将尝试转换到Lab Space以确保假设是正确的,并且该技术将来会有用.
EDIT2:这是我的结果FWIW.Color1和Color2是我的两种颜色,两个中间列是分别在L a b空间和平均RGB中取平均值的结果.在这种情况下,两种颜色之间没有太大差异,因此平均技术的输出差异是微妙的.

arn*_*tjw 24
几个答案建议转换为Lab颜色空间 - 这可能是更复杂的颜色操作的好方法.
但是,如果您只需要快速获取两种颜色的平均值,则可以在RGB空间中完成.您只需要注意一个警告:您必须在对它们求平均值之前对RGB值求平方,然后取结果的根.(如果你只是取平均值,结果将会太暗.)
像这样:
NewColor = sqrt((R1^2+R2^2)/2),sqrt((G1^2+G2^2)/2),sqrt((B1^2+B2^2)/2)
Run Code Online (Sandbox Code Playgroud)
这是一个很棒的视频,解释了为什么这种方法有效:https://www.youtube.com/watch?v = LKnqECcg6Gw
我不知道从感知的角度来看,对于组件的简单平均值是否是"最佳"(听起来像心理学家的问题),但这里有一些使用简单组件平均的例子.

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