当混合蓝色和黄色油漆时,结果是某种绿色。
我有两种rgb颜色:
蓝色=(0,0,255)
黄色=(255,255,0)
找到两种颜色混合使用时产生的rgb颜色的算法是什么(就像使用油漆时会出现的一样)?该算法产生的颜色不必十分精确。对于上面的示例,它只需要看起来像某种绿色即可。
提前致谢。
编辑: 根据LaC的回答,用Go编写的此功能对我有用。
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} }
编辑#2 虽然如此,但设法将青色和黄色混合,蓝色和黄色之间的混合变为黑色,这似乎不太正确。我仍在寻找有效的算法。
编辑#3 这是Go中使用HLS颜色空间的完整工作示例:http : //go.pastie.org/1976031。谢谢马克·兰瑟姆。
编辑#4 似乎更好的混色方法是使用Kubelka-Munk方程
油漆通过吸收起作用。首先从白光(255,255,255)乘以吸收系数。
蓝色颜料吸收了所有击中它的红色和绿色光。
黄色油漆吸收了所有击中它的蓝光。
在一个理想的世界中,这意味着将黄色和蓝色的油漆混合会产生黑色的油漆,或至多是浑浊的灰色。实际上,“蓝色”涂料偏向绿色,因此您会得到浑浊的绿色。我从未见过将黄色和蓝色混合产生令人满意的绿色的示例。Wikipedia讨论了此过程的一些复杂性: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)
请注意,这个答案并 没有 效仿调漆,为上述原因。相反,它提供了直观的颜色混合,这是任何现实世界中都不存在的。