平均两种颜色定义线性渐变的最佳方法是什么?

如果我有两种RGB值定义的颜色,我可以平均红色,绿色和蓝色值,然后结合定义第三种颜色,看起来像两个视觉平均值?

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

编辑1:感谢所有的答复。 对于我目前的需求,我只处理相同颜色阴影的颜色对,所以我认为对它们进行平均就可以。 但是,我会尝试转换到实验室空间,以确保假设是真实的,技术在未来将有用。

编辑2:这是我的结果FWIW。 Color1和Color2是我的两种颜色,两个中间的列分别是L a b空间和RGB平均的结果。 在这种情况下,两种颜色之间没有太多的区别,所以平均技术的输出差异是微妙的。

颜色平均技术的视觉比较

看看这个问题的答案。

基本上,你想把颜色转换成一个叫Lab space的东西,并在那个空间里find它们的平均值。

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

几个答案build议转换为实验室颜色空间 – 这可能是更复杂的颜色操作的好方法。

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

喜欢这个:

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

这是一个伟大的video,这解释了为什么这种方法是有效的: https : //www.youtube.com/watch?v=LKnqECcg6Gw

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

我不知道从知觉的angular度来看,这些组件的简单平均值是否是“最好的”(这听起来像是一个心理学家的问题),但是这里有一些使用简单的组件平均的例子。

替代文字

红芥末绿色的是丑陋的,但插值似乎足够合理。

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

我认为,从正确的方向来看,答案是正确的,并且承认了丹·W所提到的对数底层。然而,恰当的几何平均值不是sqrt((C1 ^ 2 + C2 ^ 2)/ 2),而是sqrt (C1 * C2)。 所以平均颜色将是:

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

由此产生的颜色更接近我们所期望的。 您可以使用更高阶的根来推广到更多颜色,并通过为其组件添加指数来加权每种颜色。

这很难。 首先,一组RGB值没有定义颜色。 它们需要根据所涉及的色彩原色(色彩空间)进行解释,例如sRGB,Rec.709,Rec.2020,Adobe RGB(1998)等。

此外,我们通常遇到的RGB值与线性光不成比例:它们使用非线性函数(伽马)“编码”。 有时(主要是在video应用中),“黑色”的值不是零,而是从零开始偏移,对于8位值通常是16。 而“白色”不是255而是235. sRGB和Rec.709共享RGB原色,但是它们的伽马函数是不同的。

颜色空间转换从消除黑色偏移开始,黑色为零。 如果gamma函数有一个断点(比如sRGB和Rec.709),则需要仔细缩放RGB值,使“white”为1.0。

然后,通过执行原始伽马函数的反演来“解码”伽马。 (一个答案build议平方值,这是伽马解码的近似值。)现在,您在某些色彩空间中具有线性光RGB值。 此时,您可以将该颜色空间转换为Lab空间。 从RGB到Lab的大多数转换都经过一个名为XYZ的中间色彩空间。

嵌套函数调用的步骤如下:

Lab = XYZ2Lab(RGB2XYZ(gamma_decode(offset_and_scale(RGB), gammaFunction ), RGB颜色空间 ))

(实验室空间是在1976年开发的,目的是为了创build标准CIE XYZ空间的感知均匀翘曲(Luv是另一种尝试)。这个想法是两种颜色之间的欧几里得(直线)距离对于任何两种颜色来说,非常不同的(1“JND”)将是相同的距离,Lab中两种颜色之间的距离被称为“delta-E”,简单的三angular欧氏距离公式现在称为dE76。 /en.wikipedia.org/wiki/Color_difference )

在你的情况下,你可以平均两个实验室颜色来获得一个新的实验室颜色,然后扭转所有的转换回到你select的颜色空间的RGB。

这会让你接近,但不能保证,只是因为“色彩”是一种人的感知,而不是物理量,而且难以可靠地表征。 实验室在感知统一方面实际上并没有那么好。 因此,他们提出了一个新的,更复杂的Δ-E函数,而不是另外修正Lab:DE94。 这个更好,但不完美,所以2000年出现了另一个提案:DE2000。 还好,但不完美。 请参阅上面的Wiki页面了解更多信息。

如果DE2000不够好(或者太复杂!),你可以看一下Lab的另一个名为ICtCp的实验,它声称比实验更统一。

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

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

    1px的颜色是您缩放比例的平均颜色