是否有一种颜色混合algorithm,像混合真实颜色一样工作?

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

例如:

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

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

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


我的方法

我已经尝试过了

将两种颜色转换为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 (difference is greater than 180°) Cyan (Hue 181°) + Red (Hue 360°) = Hue 270.5° 

(色相179 +红色)和(色相181 +红色)导致两种完全不同的颜色。


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

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

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


CMYK也没有工作 ,结果就像RGB或LAB。


似乎这些颜色空间中的平凡加法和减法混色都不会产生自然的结果。


工作实现

Krita – 绘画混合器

光栅graphics编辑器Krita曾经在一些地方实现了更真实的色彩混合: http ://commit-digest.org/issues/2007-08-12/(Painterly混合插件)

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

这是一个Krita混色video: https : //www.youtube.com/watch?v = lyLPZDVdQiQ

论文由五十三

还有一篇关于 FiftyThree开发的适用 于iOS的Paper应用程序中的颜色混合的文章 。 他们描述了他们如何在该地区进行创新和实验,并提供混合蓝色和黄色混合成绿色的样品。 但是,实际过程或algorithm在这里没有真正描述。

引用:

Chen说:“在寻找一个很好的混合algorithm的时候,我们最初尝试在RGB,HSV,HSL,CieLAB和CieLUV等各种色彩空间上进行插值,效果令人失望。 “我们知道红色和黄色应该是橙色的,或者红色和蓝色应该是紫色的,但是无论使用什么色彩空间,都没有办法达到这些颜色。有一个工程公理:做最简单的事情我们现在已经尝试了最简单的方法,他们甚至没有感觉到远程的权利。

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

Kubelka-Munk模型每种颜色至less有6个值,包括每种RGB颜色的reflection和吸收值。 FiftyThree的联合创始人兼首席执行官Georg Petschnigg解释说:“虽然屏幕上的颜色外观可以用三维来描述,但颜色的混合实际上是在六维空间中进行的。 Kubelka-Munk论文让团队将美学问题转化为math框架。 […]

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

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


相关问题

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

他们中没有人真的有答案。

  • 计算RGB中的混合颜色
  • 用于查找其他两种颜色之间的颜色的algorithm – 在绘制颜色的颜色空间中
  • 像Krita一样实施Kubelka-Munk来混合颜色(颜色),如油漆

其他相关的链接和资源

  • 在Twitter上searchKubelka-Munk
  • 混合涂料(!! Con 2016)由黛安娜廖
    • 幻灯片
    • video
  • Paint Inspired Color Mixing and Compositing for Visualization(N.Gossett,B.Chen)

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

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

我们在小学学到的混色是基于颜色组合,这是一种减色混合(非常简单)的forms。 那就是我们加在一起的颜色越多,颜色就越深,因为每种颜料都会减less一点点的光线。

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

RGB +scheme在某种程度上是对我们在大多数美国小学(即RBY-)学到的减法scheme的补充。 然而,他们不完全匹配,它们之间可能很难转换(研究现在…)


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

 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) 

这会产生深灰色而不是黑色。 但要获得黄色或任何接近的东西,你仍然必须解决颜色scheme的极点alignment问题。

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

  1. 加法混合 (如RGB)

  2. 减法混合 (如CMYK)

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

黄+青=绿

一般来说,减色混色就是从白色中“取走”(过滤),而加色混合则是从黑色加起来的。 (减色的基色与添加剂相反:红色 – >青色;绿色 – >品红色;蓝色 – >黄色)

所以,如果你开始使用白色屏幕应用filter:

分钟(白色(255,255,255),黄色(255,255,0),青色(0,255,255))=绿色(0,255,0)

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

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

我认为你把色相合并的问题是你把两个angular度加在一起,再除以二。 正如你所看到的,结果往往是没有意义的。 我认为你最好把angular度转换成单位圆上的笛卡尔坐标,对这些坐标进行平均,然后找出结果点的angular度(忽略幅度)。

一种做RGB减色混合的方法是首先将RGB颜色转换成光谱reflection曲线。 转换非常简单,一旦完成,您可以做一个真正的reflection曲线的减法混合,然后将结果转换回RGB。 还有另一个类似的问题: stackoverflow.com/questions/10254022/ ,这个过程更详细的讨论。

想知道如何计算RGB值的反转。 由于这是关于减光的技术上的减法部分可以通过简单的math计算。

例如青色+黄色

青色= 0x00ffff黄色= 0xffff00

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

检查添加,减less和其他混合alghoritms此实施 。

function齐全(在Java中编写),所以你可以testing你需要的任何颜色混合,看看它是否符合你的需求。

正如其他答复所指出的,在减法CMYK alghoritm上, 蓝色 + 黄色 (正好是青色 + 黄色 )是绿色 。 自己看