混合两个RGB颜色矢量以得到结果

时间:2009-12-12 02:15:07

标签: math colors rgb vector paint

我正在尝试混合两个源RGB矢量来创建第三个“合成矢量”,它是前两个的直观组合。

理想情况下,我可以模仿“真正的油漆混合特性”,但为了简单起见,我试图找到一种方法,其结果看起来直观,就像你从组合两个源rgb得到的那样。

最低限度,这些特点:
RED + BLACK =深红色
RED + WHITE =浅红色

最佳,也具有真实的涂料特性:
RED + BLUE = PURPLE
RED + YELLOW = ORANGE
(等)

-

我目前通过添加两个源RGB矢量/ 255,然后归一化(并乘以255)来实现“懒惰方式”。 因此,使用这个:[Red =< 1,0,0> * 255] + [蓝色=< 0,0,1>给出Magenta =< 1,0,1> / sqrt(2)* 255,虽然其他颜色不太直观甚至可见......我需要更好的方法!请帮忙: - )

5 个答案:

答案 0 :(得分:16)

您的建议与加权平均值相同吗?

Average R = w1*R1 + w2*R2 + w3*R3 + ... + wn*Rn

Average G = w1*G1 + w2*G2 + w3*G3 + ... + wn*Gn

Average B = w1*B1 + w2*B2 + w3*B3 + ... + wn*Bn

w是加权分数,它们之和为1。

例如,

R1是要混合的第一种颜色的红色成分。

因此,如果你想均匀混合两种颜色,那就是:

Average R = 0.5*R1 + 0.5*R2

Average G = 0.5*G1 + 0.5*G2

Average B = 0.5*B1 + 0.5*B2

至于将结果颜色映射到命名颜色(“深红色”)可能只是做一个查找表并选择最接近的颜色?

答案 1 :(得分:10)

问题在于你试图将两种不同的颜色理论联系起来。 RGB是加色理论(从光源发出彩色光)。在这种情况下,你添加到混音中的光谱越多,你就越接近白色。

对于“油漆混合”,您需要模拟减色理论,该理论控制反射颜色混合的方式。 (即反射光,如油漆,不同的表面等)。这是一个overview

this page上的JavaScript是关于如何将RGB转换为CMYK的线索。

答案 2 :(得分:2)

混合RGB颜色以模拟减色混合(即,类似油漆的混合物)可以通过将RGB值转换为光谱反射率曲线,然后在那里进行混合来完成。这个问题与另一个stackoverflow.com/questions/10254022/非常相似,其中更详细地讨论了解决方案。

答案 3 :(得分:1)

我认为你应该在你的配色方案中真正定义“+”。

根据您的要求,我将它们翻译成估计的十六进制颜色代码,(rgb表示可以很容易地推断出来。)

RED     + BLACK   = DARK RED  
#ff0000 + #000000 = #800000
RED     + WHITE   = LIGHT RED
#ff0000 + #ffffff = #ff8080

optimally, also with real paint characteristics:
RED     + BLUE    = PURPLE
#ff0000 + #0000ff = #800080
RED     + YELLOW  = ORANGE
#ff0000 + #ffff00 = #ff8000

我没有看到一个确定的模式,你可以制定一些公式来实现这一目标。

约翰和尼尔斯的方法可能接近颜色,但可能没有达到确切的值。我建议你试一试。

修改
更新了错误的颜色代码。那么它现在确实更有意义。

答案 4 :(得分:1)

//您可以手动编写代码以返回。

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
print(s.getsockname()[0])
s.close()

//只是用一种愚蠢的方式证明了概念。一种数学方法会很有用!尽管有一段时间想了,但还没有时间解决这个问题。