用于在两个其他之间找到颜色的算法 - 在绘制颜色的颜色空间中

Ale*_*der 27 algorithm rgb colors go color-space

当混合蓝色和黄色涂料时,结果是某种绿色.

我有两种颜色:

blue =(0,0,255)

和黄色=(255,255,0)

找到混合两种颜色的结果的rgb颜色的算法是什么,就像使用涂料时一样?算法产生的颜色不一定非常精确.对于上面的例子,它只需要看起来像某种绿色.

提前致谢.

编辑:这个用Go编写的函数,根据LaC的回答为我工作.

func paintMix(c1, c2 image.RGBAColor) image.RGBAColor { 
    r := 255 - ((255 - c1.R) + (255 - c2.R))
    g := 255 - ((255 - c1.G) + (255 - c2.G))
    b := 255 - ((255 - c1.B) + (255 - c2.B))
    return image.RGBAColor{r, g, b, 255}
}
Run Code Online (Sandbox Code Playgroud)

编辑#2 Allthought它设法混合青色和黄色,蓝色和黄色之间的混合变成黑色,这似乎不对.我还在寻找一种有效的算法.

编辑#3这是Go中一个完整的工作示例,使用HLS颜色空间:http://go.pastie.org/1976031.谢谢Mark Ransom.

编辑#4看起来更好的颜色混合的前进方式是使用Kubelka-Munk方程

Mar*_*som 12

油漆通过吸收起作用.你从白光(255,255,255)开始并乘以吸收因子.

蓝色涂料吸收所有撞击它的红色和绿色光.

黄色油漆会吸收所有撞击它的蓝光.

在一个完美的世界中,这意味着将黄色和蓝色涂料结合起来会产生黑色油漆,或者至多是泥灰色.在实践中,"蓝色"涂料偏向绿色,因此您会得到泥泞的绿色.我从未见过将黄色和蓝色混合在一起产生令人满意的绿色的例子.维基百科介绍了这个过程的一些复杂性:http://en.wikipedia.org/wiki/Primary_color#Subtractive_primaries

我认为你真正要问的是如何沿着色轮插入颜色.这应该与颜色在涂料中是吸收性还是在RGB显示器中的发光性无关.

编辑:通过在HSL颜色空间中工作,您可以获得所需的结果.这是Python中用于实现算法的一些代码; 平均色调是棘手的,并且基于我之前对平均角度的回答.

from colorsys import rgb_to_hls,hls_to_rgb
from math import sin,cos,atan2,pi

def average_colors(rgb1, rgb2):
    h1, l1, s1 = rgb_to_hls(rgb1[0]/255., rgb1[1]/255., rgb1[2]/255.)
    h2, l2, s2 = rgb_to_hls(rgb2[0]/255., rgb2[1]/255., rgb2[2]/255.)
    s = 0.5 * (s1 + s2)
    l = 0.5 * (l1 + l2)
    x = cos(2*pi*h1) + cos(2*pi*h2)
    y = sin(2*pi*h1) + sin(2*pi*h2)
    if x != 0.0 or y != 0.0:
        h = atan2(y, x) / (2*pi)
    else:
        h = 0.0
        s = 0.0
    r, g, b = hls_to_rgb(h, l, s)
    return (int(r*255.), int(g*255.), int(b*255.))

>>> average_colors((255,255,0),(0,0,255))
(0, 255, 111)
>>> average_colors((255,255,0),(0,255,255))
(0, 255, 0)
Run Code Online (Sandbox Code Playgroud)

请注意,由于上述原因,此答案不能模拟油漆混合.相反,它提供了直观的颜色混合,而不是基于任何物理世界的现实.


LaC*_*LaC 9

实际上,你从混合(减色)黄色和青色中获得绿色.黄色为红色+绿色(255,255,0),青色为绿色+蓝色(0,255,255).现在制作相反的颜色:蓝色(0,0,255)和红色(255,0,0).将它们相加混合,你会得到紫色(255,0,255).使其相反,你变绿(0,255,0).

换句话说,你可以得到一个减法混合作为两种颜色的对立面的加法混合的反面.