有没有一种颜色混合的算法,就像混合真实颜色一样?

Tom*_*rek 59 language-agnostic algorithm blending colors color-space

RGB颜色的常见混合与绘画的混合颜色非常不同,它是混合光而不是混合颜料.

例如:

Blue (0,0,255) + Yellow (255,255,0) = Grey (128,128,128)
Run Code Online (Sandbox Code Playgroud)

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

是否有任何已知的混色算法,就像混合真实颜色一样?


我的方法

我已经尝试过以下内容:

将两种颜色转换为HSV并混合色调(乘以从饱和度计算的系数),以及饱和度和值通道的简单平均值.然后我从两种颜色计算平均亮度,并调整结果颜色以匹配此亮度.这很有效,但色调混合有时是错误的,例如:

Red (Hue 0°) + Blue (Hue 240°) = Green (Hue 120°)
Run Code Online (Sandbox Code Playgroud)

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

Red (Hue 360°) + Blue (Hue 240°) = Magenta/fuchsia (Hue 300°)
Run Code Online (Sandbox Code Playgroud)

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

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°
Run Code Online (Sandbox Code Playgroud)

(色调179 +红色)和(色调181 +红色)产生两种完全不同的颜色.


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

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

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


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


似乎在任何这些颜色空间中的微小添加剂和减色混合都不会产生自然的结果.


工作实施

Krita - 绘画混音师

光栅图形编辑器Krita在某些方面实现了更逼真的色彩混合:http://commit-digest.org/issues/2007-08-12/(Painterly mixer plugin)

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

以下是Krita混色的视频:https://www.youtube.com/watch?v = lyPZDVdQiQ

FiftyThree撰写的论文

FiftyThree开发的iOS应用程序中还有关于颜色混合的文章.他们描述了他们如何在该地区进行创新和实验,并提供混合蓝色和黄色的样品,从而产生绿色.但是,实际的过程或算法并没有真正描述过.

引用:

"在寻找良好的混合算法时,我们最初尝试在各种颜色空间内插入:RGB,HSV和HSL,然后是CieLAB和CieLUV.结果令人失望,"Chen说."我们知道红色和黄色应该产生橙色,或者红色和蓝色应该产生紫色 - 但无论你使用什么颜色空间,都没有办法达到这些颜色.有一个工程公理:做最简单的事情是好吧,我们现在已经尝试了最简单的方法,他们甚至感觉不太正确."

看起来和Krita一样,Paper实现了Kubelka-Munk模型:

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

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

即使它看起来像一个复杂的过程,我还没有看到很多关于如何实现这样的事情的好信息.


相关问题

这些问题都是在这一个问题之后发布的.

他们都没有真正的答案.


其他相关链接和资源

RBa*_*ung 25

正确的答案是否定的,因为没有正确 的工作如何"在现实世界中的色彩混合"真正起作用的模式.这是FAR过于复杂和有条件而且根本不像我们在学校学到的简单的红蓝黄色东西(事实上它需要所有的化学和大量的物理和生物学来解决).

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

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

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

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


好的,如果您只想从RGB中的添加剂组合切换到减色组合,您可以使用以下反向贝叶斯类型公式来组合两种颜色:

NewColor.R = (Color1.R * Color2.R)/255
NewColor.G = (Color1.G * Color2.G)/255
NewColor.B = (Color1.B * Color2.B)/255
Run Code Online (Sandbox Code Playgroud)

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


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

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)
Run Code Online (Sandbox Code Playgroud)

这会产生深灰色而不是黑色.但要获得黄色或任何接近,你仍然需要修复颜色方案的极对齐问题.


Pet*_*ker 5

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

  1. 添加剂混合(如RGB)

  2. 减法混合(如CMYK)

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

黄色+青色=绿色

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

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

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


Too*_*ter 3

2 分钟论文中展示了一项新颖的(2022 年 2 月)技术。

作者称之为“Mixbox”,该技术是开源的(算法可以在 github 上找到,但请注意许可证)。目前 Rebelle 5 正在实施这种混色技术,不久的将来可能会推出更多程序。

在我看来,它的最强点是它的实施简单性以及开箱即用的简单性。他们的论文(据说——我没有读过)也写得很好。