有没有一种可以像混色一样工作的混色算法?

Is there an algorithm for color mixing that works like mixing real colors?

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

例如:

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

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

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

我的方法

我已经尝试过以下操作:

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

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

我发现有时需要将色相值偏移360°(当
色相大于180°)。

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

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

1
2
3
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°

(色调179 +红色)和(色调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混合器插件)

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

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

FiftyThree的论文

在FiftyThree开发的iOS版Paper应用中,也有一篇关于混色的文章。他们描述了他们在该地区的创新和实验方式,还提供了蓝色和黄色混合得到绿色的样本。但是,此处并未真正描述实际的过程或算法。

报价单:

"In searching for a good blending algorithm, we initially tried interpolating across various color-spaces: RGB, HSV, and HSL, then CieLAB and CieLUV. The results were disappointing," says Chen."We know red and yellow should yield orange, or that red and blue should make purple—but there isn't any way to arrive at these colors no matter what color-space you use. There's an engineering axiom: Do the simplest thing that could possibly work. Well, we had now tried the easiest possible approaches and they didn't feel even remotely right."

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

[...] the Kubelka-Munk model had at least six values for each color, including reflection and absorption values for each of the RGB colors."While the appearance of a color on a screen can be described in three dimensions, the blending of color actually is happening in a six-dimensional space," explains Georg Petschnigg, FiftyThree's co-founder and CEO. The Kubelka-Munk paper had allowed the team to translate an aesthetic problem into a mathematical framework. [...]

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

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

相关问题

这些问题都在同一问题之后发布。

他们都没有真正的答案。

  • 计算RGB中的混合色
  • 在两种颜色之间寻找颜色的算法-在绘画颜色的颜色空间中
  • 像Krita一样实现Kubelka-Munk来混合颜料等颜色

其他相关链接和资源

  • Twitter上的Kubelka-Munk搜索
  • 混合涂料(!! Con 2016)戴安娜·廖(Diana Liao)

    • 滑梯
    • 视频
  • 油漆启发的颜色混合和合成,以实现可视化(N. Gossett,B。Chen)


正确的答案是"否",因为对于"真实世界中的色彩混合"如何真正起作用,没有正确的工作模型。 FAR太复杂且有条件,根本不像我们在学校学到的简单的红蓝黄东西(实际上需要化学所有知识以及许多物理和生物学来解决)。

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

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

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

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

好的,如果您只想从RGB的加法组合转换为减法组合,则可以使用以下反向贝叶斯类型公式来组合两种颜色:

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

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

已经指出,这会为示例问题生成Black,从技术上讲,这对于真正的减法系统是正确的,但是,如果您想要更多的稀释/减法系统,则可以尝试以下方法:

1
2
3
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)

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


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

  • 添加剂混合(如RGB)

  • 减法混合(如CMYK)

  • 因此,在减色混合中,结果是您所期望的,但是没有蓝色,而是有青色:

    黄色+青色=绿色

    通常,减色混合只是从白色中"消除"(过滤),而加色混合是从黑色中累积。 (减色的基色与加色成反比:红色->青色;绿色->洋红色;蓝色->黄色)

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

    min(白色(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转换为波长,进行合成并转换回去。


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

    例如青色+黄色

    青色= 0x00ffff
    黄色= 0xffff00

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


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


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


    检查此实现中是否存在相加,相消和其他混合算法。

    具有完全的功能(用Java编写),因此您可以测试需要混合的任何颜色,并查看其是否适合您的需求。

    正如其他回应所指出的那样,在沉着的CMYK算法上,蓝色+黄色(恰好是青色+黄色)是绿色。自己看看