71

RGB颜色的普通混合与绘画的混合颜色有很大的不同,它是光的混合而不是颜料的混合。

例如:

Blue (0,0,255) + Yellow (255,255,0) = Grey (128,128,128)

(应该是蓝色+黄色=绿色)

是否有任何已知的颜色混合算法可以像混合真实颜色一样工作?


我的方法

我已经尝试过以下操作:

将两种颜色转换为 HSV并混合色调(乘以从饱和度计算的系数),以及饱和度和值通道的简单平均值。然后我计算了两种颜色的平均亮度,并调整了生成的颜色以匹配这个亮度。这工作得很好,但色调混合有时是错误的,例如:

Red (Hue 0°) + Blue (Hue 240°) = Green (Hue 120°)

我发现有时我需要将色调值移动 360°(当色调之间的差异大于 180° 时)。

Red (Hue 360°) + Blue (Hue 240°) = Magenta/fuchsia (Hue 300°)

但是这种转变也不是很好,例如:

Cyan (Hue 179°) + Red (Hue 0°) = Hue 89.5°
Cyan (Hue 181°) + Red (Hue 0°) --> shifting is performed (the difference is greater than 180°)
Cyan (Hue 181°) + Red (Hue 360°) = Hue 270.5°

(Hue 179 + Red) 和 (Hue 181 + Red) 产生两种完全不同的颜色。


然后我尝试了 CIE Lab 色彩空间(如在 Photoshop 中),它旨在更接近人类感知颜色的方式。

我对每个对应的两个通道只使用了一个简单的平均值,但结果并不令人满意,例如,我从蓝色 (98, -16, 93) 和黄色 (30, 68,-112)。这些系数取自 Photoshop。

也许如果我使用一些不同于平均水平的操作,它可以工作,但我不知道是什么。


CMYK 也不起作用,结果就像在 RGB 或 LAB 中一样。


似乎在任何这些色彩空间中的微不足道的加色或减色混合都不会产生自然的结果。


工作实施

Krita – 绘画混音器

光栅图形编辑器 Krita 在某些时候实现了更逼真的颜色混合:http ://commit-digest.org/issues/2007-08-12/(Painterly 混合器插件)

他们说这是第一个使用描述颜料行为的 Kubelka 和 Munk 方程实现特殊技术的公共应用程序。

这是 Krita 混色的视频:https ://www.youtube.com/watch?v=lyLPZDVdQiQ

五十三的论文

在由FiftyThree开发的 iOS 版 Paper 应用程序中也有关于颜色混合的文章。他们描述了他们如何在该领域进行创新和实验,并提供混合蓝色和黄色的样本,从而产生绿色。然而,实际的过程或算法并没有真正描述在那里。

报价:

“在寻找一种好的混合算法时,我们最初尝试在各种颜色空间中进行插值:RGB、HSV 和 HSL,然后是 CieLAB 和 CieLUV。结果令人失望,”Chen 说。“我们知道红色和黄色应该产生橙色,或者红色和蓝色应该产生紫色——但无论你使用什么色彩空间,都没有办法得到这些颜色。有一个工程公理:做最简单的事情可能会奏效。好吧,我们现在已经尝试了最简单的方法,但他们甚至感觉都不对。”

似乎和 Krita 一样,Paper 实现了 Kubelka-Munk 模型:

[...] Kubelka-Munk 模型对每种颜色至少有六个值,包括每种 RGB 颜色的反射和吸收值。“虽然屏幕上颜色的外观可以用三个维度来描述,但颜色的混合实际上是在六维空间中发生的,”FiftyThree 的联合创始人兼首席执行官 Georg Petschnigg 解释道。Kubelka-Munk 的论文使团队能够将美学问题转化为数学框架。[...]

从所有这些信息来看,似乎基于 Kubelka-Munk 模型的实施可能是前进的方向,并提供更接近现实的结果。

尽管它看起来像一个复杂的过程,但我还没有看到太多关于如何实现这样的东西的好信息。


相关问题

这些问题是在这个问题之后发布的,都与同一件事有关。

他们都没有真正的答案。


其他相关链接和资源

4

7 回答 7

29

正确答案是否定的,因为“现实世界中的颜色混合”如何真正起作用没有正确的 工作模型。它太复杂和有条件,根本不像我们在学校学到的简单的红蓝黄东西(实际上它需要所有的化学和大量的物理和生物来解决)。

然而,简单的答案是:是的,使用减法混合而不是加法混合。

我们在小学学习的颜色混合是基于颜料组合,它是减色混合的一种形式(非常简单)。那就是我们加在一起的颜色越多,颜色就越深,因为每种颜料都会减去更多的光。

另一方面,几乎所有计算机配色方案都是叠加的,因为它们基于组合光波(非常简单),因此它们变得更亮,因为每种颜色都增加了一点光。

RGB+ 方案在某种程度上是对我们在大多数美国小学学习的减法方案(即 RBY-)的附加补充。但是,它们并不完全匹配,并且很难在它们之间进行转换(现在正在研究......)


好的,如果你只是想从 RGB 中的加法组合切换到减法组合,你可以使用下面的 reverse-bayesan 类型公式来组合两种颜色:

NewColor.R = (Color1.R * Color2.R)/255
NewColor.G = (Color1.G * Color2.G)/255
NewColor.B = (Color1.B * Color2.B)/255

调整色极的差异(G 到 Y,然后回到 G)要困难得多......


有人指出,这会为示例问题产生黑色,从技术上讲,这对于真正的减法系统是正确的,但是,如果您想要更多的稀释/减法系统,您可以试试这个:

NewColor.R = 255 - SQRT(((255-Color1.R)^2 + (255-Color2.R)^2)/2)
NewColor.G = 255 - SQRT(((255-Color1.G)^2 + (255-Color2.G)^2)/2)
NewColor.B = 255 - SQRT(((255-Color1.B)^2 + (255-Color2.B)^2)/2)

这会产生深灰色而不是黑色。但是要获得黄色或任何接近的东西,您仍然必须解决配色方案的极点对齐问题。

于 2009-08-29T13:47:35.213 回答
5

组合颜色有两种不同的可能性:

  1. 加法混合(如 RGB)

  2. 减法混合(如 CMYK)

所以在减色混合中,结果是你所期望的,但没有蓝色,而是有青色:

黄色 + 青色 = 绿色

一般来说,减色混合只是从白色“带走”(过滤),而加色混合是从黑色加起来。(减色的基色与加色相反:红色->青色;绿色->品红色;蓝色->黄色)

因此,如果您从应用过滤器的白屏开始:

min(白色(255,255,255),黄色(255,255,0),青色(0,255,255))=绿色(0,255,0)

于 2009-08-29T13:33:39.537 回答
2

在 krita 中有以逼真的方式混合颜色的代码: https ://projects.kde.org/projects/calligra/repository/revisions/master/show/krita/plugins/extensions/painterlyframework 。

请注意,包含光源文件的代码是 GPLv2+。它可以从 RGB 转换为波长,进行合成并转换回来。

于 2012-04-21T06:22:18.437 回答
1

我认为您组合色调的问题在于您是通过将两个角度相加并除以二来实现的。正如您所注意到的,结果通常没有意义。我认为你最好将角度转换为单位圆上的笛卡尔坐标,对它们进行平均,然后找到结果点的角度(忽略大小)。

于 2011-12-21T18:40:37.880 回答
1

对 RGB 颜色进行减法混合的一种方法是首先将 RGB 颜色转换为光谱反射曲线。转换相当简单,一旦完成,您可以对反射率曲线进行真正的减法混合,然后将结果转换回 RGB。还有另一个类似的问题:stackoverflow.com/questions/10254022/,其中更详细地讨论了这个过程。

于 2015-04-30T12:03:26.093 回答
1

想知道计算 RGB 值的反转是否有效。由于它是关于光的减法,从技术上讲,减法部分可以通过简单的数学计算出来。

例如青色+黄色

青色 = 0x00ffff 黄色 = 0xffff00

它们的反转是 0xff0000 和 0x0000ff,这意味着它们完全吸收了红光和蓝光。它们的 1:1 混合应该吸收一半的红光和蓝光(因为混合的另一半仍然可以反射一些红光和蓝光),这与 (0xff0000 + 0x00ffff) / 2 = 0x7f007f 一致。现在我们从 0xffffff 中减去这个值,我们得到 0x80ff80,它是绿色的!

于 2016-10-13T03:16:25.867 回答
0

检查此实现以了解加法、减法和其他混合算法。

功能齐全(用java编写),因此您可以测试需要混合的任何颜色,看看它是否符合您的需求。

正如其他回应所指出的那样,在减法 CMYK 算法中,蓝色+黄色(确切地说是青色+黄色)是绿色。自己看

于 2013-01-30T04:45:45.143 回答