例如:
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+红色)和(Hue 181+红色)混合会得到两种完全不同的颜色。
然后我尝试了CIE Lab颜色空间(就像在Photoshop中使用的那样),它被设计成更接近人类感知颜色。我只是对应两个通道的简单平均值,但结果并不理想,例如,从蓝色(98,-16,93)和黄色(30,68,-112)中得到了粉色(64,26,-9.5)。这些系数来自Photoshop。也许如果我使用了一些不同于平均值的操作,它可能会起作用,但我不知道该怎么做。
CMYK也不起作用,结果与RGB或LAB相同。
看起来在这些颜色空间中,既不是简单的加性混合也不是减性混合能够产生自然的结果。
可用实现
Krita – 画家混合器
光栅图形编辑器Krita曾经有一个更加逼真的颜色混合的可用实现:http://commit-digest.org/issues/2007-08-12/ (Painterly mixer插件)。
他们称这是第一个使用Kubelka和Munk方程描述颜料行为的特殊技术的公共应用。
这里是Krita颜色混合的视频演示:https://www.youtube.com/watch?v=lyLPZDVdQiQ
Paper by FiftyThree
iOS上的Paper应用程序中也有FiftyThree开发的颜色混合article about color blending in the Paper app for iOS。他们描述了他们在这一领域创新和实验的方式,并展示了将蓝色和黄色混合成绿色的样本。然而,实际的过程或算法并没有被真正描述。
引用:
"在寻找一个好的混合算法时,我们最初尝试了在各种颜色空间中进行插值:RGB、HSV 和 HSL,然后是 CieLAB 和 CieLUV。结果令人失望," Chen 说道。"我们知道红色和黄色应该产生橙色,或者红色和蓝色应该制造紫色,但无论使用哪种颜色空间,都没有办法得到这些颜色。有一条工程学原则:做能够起作用的最简单的事情。我们已经尝试了最简单的方法,但它们感觉根本不对。"看起来和 Krita 一样,Paper 实现了 Kubelka-Munk 模型:
"[...] Kubelka-Munk 模型对于每种颜色至少有六个值,包括每个 RGB 颜色的反射和吸收值。" FiftyThree 的联合创始人兼 CEO Georg Petschnigg 解释道:"虽然屏幕上颜色的外观可以用三维描述,但颜色的混合实际上是在一个六维空间中发生的。" Kubelka-Munk 论文使团队能够将审美问题转化为数学框架。
从所有这些信息来看,基于 Kubelka-Munk 模型的实现可能是未来的发展方向,并提供更接近真实的结果。
尽管看起来是一个复杂的过程,但我还没有看到很好的关于如何实现这样的东西的信息。
相关问题
这些问题是在此问题之后发布的,都与同一件事有关。
但它们中没有一个真正地回答了问题。
其他相关链接和资源
- 在Twitter上搜索Kubelka-Munk
- 混合颜料(!!Con 2016) by Diana Liao
- 启发式颜色混合和可视化的涂料组合(N. Gossett, B. Chen)