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)
请注意,由于上述原因,此答案不能模拟油漆混合.相反,它提供了直观的颜色混合,而不是基于任何物理世界的现实.
实际上,你从混合(减色)黄色和青色中获得绿色.黄色为红色+绿色(255,255,0),青色为绿色+蓝色(0,255,255).现在制作相反的颜色:蓝色(0,0,255)和红色(255,0,0).将它们相加混合,你会得到紫色(255,0,255).使其相反,你变绿(0,255,0).
换句话说,你可以得到一个减法混合作为两种颜色的对立面的加法混合的反面.
| 归档时间: |
|
| 查看次数: |
4417 次 |
| 最近记录: |