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

即新颜色 = (R1+R2)/2,(G1+G2)/2,(B1+B2)/2

编辑1:感谢您的所有回复。对于我当前的需求,我只处理具有相同颜色阴影的颜色对,因此我认为对它们进行平均会起作用。但是,我将尝试转换为实验室空间,以确保假设正确并且该技术在将来有用。

编辑2:这是我的结果 FWIW。Color1和Color2是我的两种颜色,中间两列是L平均的结果Ab 空间并分别对 RGB 进行平均。在这种情况下,两种颜色之间没有太大差异,因此平均技术的输出差异很微妙。

visual comparison of color averaging techniques

有帮助吗?

解决方案

看看答案这个问题

基本上,你要的颜色转换成一种叫做 Lab空间,并找到自己的平均在该空间。

Lab空间是表示颜色,其中是彼此接近的点是那些看起来彼此相似于人类的方法。

其他提示

几个答案建议转换成Lab色彩空间 - 这可能是为更复杂的颜色操作的好办法

但如果你只是需要一个快速的方式,采取两种颜色的平均水平,这可以在RGB空间来完成。你只需要介意一个警告:平均他们之前,您必须正视的RGB值,然后取结果的根源。 (如果单纯取平均,其结果将趋于太暗。)

像这样:

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

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

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

我不知道是否服用组分的简单平均值是从一个感知点(即听起来像一个心理学家问题)的“最佳”,但这里有几个使用简单的组件平均例子。

“替代文字”

在红 - 芥菜 - 绿一个是难看但插值似乎足够合理。

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

这是困难的。首先,一组RGB值没有定义的颜色。他们需要在它们所涉及的色彩原色(颜色空间),例如为sRGB,Rec.709,Rec.2020,Adobe RGB的(1998)等的光被解释

此外,RGB值作为我们通常遇到它们是不成比例的线性光:他们是“编码”使用非线性函数(伽玛)。有时(主要是在视频应用)的“黑”的值不是零,而是从零偏移,通常是16 8位值。和“白色”不等于255但235. sRGB和Rec.709份额RGB原色,但它们的伽马函数是不同的。

在彩色空间转换开始与去除任何黑色偏移,使得黑为零。如果伽玛功能中有一个断点(如sRGB和Rec.709做),你需要仔细缩放RGB值,使“白色”为1.0。

然后,“解码”的伽马通过执行原始伽玛函数的逆。 (一个答案建议平方值,这是伽马解码的近似。)现在你有一些颜色空间线性光RGB值。在这一点上,你可以从色彩空间转换为Lab空间转换。大多数转换从RGB到实验室去通过一个名为XYZ的中间色彩空间。

的步骤为嵌套函数调用:

实验室= XYZ2Lab(RGB2XYZ(gamma_decode(offset_and_scale(RGB), gammaFunction ), RGB颜色空间))

(Lab空间是在1976年开发了作为一种尝试来创建标准CIE XYZ空间的感知均匀翘曲。(LUV是另一个尝试。)的想法是,欧几里德(直线)两种颜色之间的距离即只是-显着不同的(1“JND”)将是任何两种颜色相同的距离。在实验室两种颜色之间的距离被称为“Δ-E”。简单的增量欧几里德距离式现在被称为dE76参见 https://en.wikipedia.org/wiki/Color_difference

在你的情况,你可以平均两个实验室的颜色来获得一个新的Lab颜色,然后反转所有转换要回RGB在您选择的色彩空间。

这将让你关闭,但不能保证,仅仅是因为“色”是一个人的感知,而不是一个物理量,并已出了名的难以可靠地表征。实验室实际上并没有在被知觉上一致的工作这么好。因此,而不是修复实验,他们提出了另一个经内置的一个新的,更复杂的三角-E功能:DE94。这是更好的,但并不完美,所以另一项建议于2000年出现了:DE2000。也更好,但并不完美。见上面Wiki页面获取更多信息。

如果DE2000不够好(或太复杂!),你可能有一个看一个替代实验室叫的 ICtCp 其声称是比实验室感知上更均匀。

我认为,从arntjw答案变为在正确的方向,并且识别对数底衬,如由Dan W.提到然而,正确的几何平均值不SQRT((C1 ^ 2 + C2 ^ 2)/ 2)但SQRT(C1 * C2)。所以平均颜色将是:

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

产生的颜色更接近我们所期望的。您可以通过添加一个指数,以它的组件使用更高阶的根源推广到更多的颜色和重量每一种颜色。

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

  • 将图像缩小至 1 像素 x 1 像素。

    1px 的颜色是您缩放后的平均颜色

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top