46

如果我有两种颜色由它们的 RGB 值定义,我可以平均红色、绿色和蓝色值,然后组合定义看起来像两者视觉平均值的第三种颜色吗?

即NewColor = (R1+R2)/2,(G1+G2)/2,(B1+B2)/2

EDIT1:感谢所有回复。对于我目前的需求,我只处理颜色相同的颜色对,所以我认为平均它们会起作用。但是,我将尝试转换为 Lab Space 以确保该假设是正确的,并且该技术将在未来有用。

EDIT2:这是我的结果 FWIW。Color1 和 Color2 是我的两种颜色,中间的两列分别是 L a b 空间平均和 RGB 平均的结果。在这种情况下,两种颜色之间没有太大差异,因此平均技术输出的差异是微妙的。

颜色平均技术的视觉比较

4

8 回答 8

29

几个答案建议转换为 Lab 颜色空间 - 这可能是更复杂的颜色处理的好方法。

但是如果你只是需要一种快速的方法来取两种颜色的平均值,这可以在 RGB 空间中完成。您只需要注意一个警告:您必须在平均 RGB 值之前对其进行平方,然后对结果求根。(如果你只是取平均值,结果往往会太暗。)

像这样:

NewColor = sqrt((R1^2+R2^2)/2),sqrt((G1^2+G2^2)/2),sqrt((B1^2+B2^2)/2)

这是一个很棒的视频,它解释了为什么这种方法很有效:https ://www.youtube.com/watch?v=LKnqECcg6Gw

于 2015-04-11T10:21:15.260 回答
26

看看这个问题的答案。

基本上,您希望将颜色转换为称为Lab 空间的东西,并在该空间中找到它们的平均值。

实验室空间是一种表示颜色的方式,其中彼此接近的点是那些在人类看来彼此相似的点。

于 2009-03-16T07:19:11.280 回答
7

我不知道从感知的角度来看,对组件进行简单平均是否是“最好的”(这听起来像是心理学家的问题),但这里有几个使用简单组件平均的例子。

替代文字

红芥绿的很丑,但插值似乎足够合理。

于 2009-03-16T07:01:26.923 回答
7

在HSL 颜色空间中进行平均可能会产生更好的结果。

于 2009-03-16T07:09:05.300 回答
4

是的。你可以像这样平均两种颜色。这是 OpenGL 用来将颜色混​​合在一起的方法(例如,在创建用于渲染远处物体的 Mip 贴图,或渲染 50% 透明纹理时)。对于许多情况,它快速、简单且“足够好”。然而,它并不完全真实,可能不会用于照片质量的图像。

于 2009-03-16T07:29:56.620 回答
4

这很难。首先,一组 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 在感知上更统一。

于 2017-06-28T20:24:12.833 回答
1

我认为,来自 arntjw 的答案朝着正确的方向发展,并识别了 Dan W 提到的对数底层。但是,正确的几何平均值不是 sqrt((C1^2+C2^2)/2),而是 sqrt (C1*C2)。所以平均颜色是:

NewColor = sqrt(R1*R2),sqrt(G1*G2),sqrt(B1*B2)

生成的颜色更接近我们的预期。您可以使用高阶根泛化到更多颜色,并通过向其分量添加指数来加权每种颜色。

于 2017-09-07T15:43:18.700 回答
-3

实际上有一个更简单的方法。

  • 将图像缩小到 1px x 1px。

    1px 的颜色是您缩放的任何颜色的平均颜色

于 2013-03-14T14:08:31.423 回答