我想要能够获取两个RGB-256向量并计算它们混合的结果,同时我也想为每个向量分配不同的权重。我已经使用Word颜色板进行过实验,并发现一些颜色确实按照加权平均值混合:
0.5*红(255,0,0) + 0.5*黄(255,255,0) = 橙(255,127,0)
但有些颜色则不是这样:
0.5*黄(255,255,0) + 0.5*蓝(0,0,255) = 灰(127,127,127)
而不是绿(0,255,0)
是否存在一个精确计算所有颜色的算法或者我只能使用查找表进行操作?
在这种情况下最大的问题是你基于误导性假设的期望。
混合黄色和蓝色会产生绿色的说法是一个极其简化的概括。因为它取决于使用什么样的黄色、蓝色以及比例。
此外,混合光线的效果与混合颜料相反。
当你想象一个色轮时,任何两种直接相对的颜色(1:1比例)混合起来,无论你使用哪种模型,总是会产生白色、黑色或灰色。实际上,这与现实相符。
尝试将你的颜色转换为HSV模型(色调-在色轮上为0°到360°,饱和度,值)。这个模型更接近人类感知颜色的方式,也允许你获得那些你期望发生但不切实际的结果。
花点时间熟悉这个模型,你会发现,例如,为了得到你想要的绿色(R:0 G:255 B:0 → H:120° S:100% V:100%)
,你需要:
混合黄色(R:255 G:255 B:0 → H:60° S:100% V:100%)
和青色(R:0 G:255 B:255 → H:180° S:100% V:100%)
这基本上只是值的平均数,但要注意,有三种不同的情况:
1:较大的H - 较小的H = 180°
在这种情况下,颜色相互对立 - 色调未定义
2:较大的H - 较小的H < 180°
(较大的H + 较小的H)/ 2 = 结果H
例如:您的情况:(60°+180°)/ 2 = 120°
3:较大的H - 较小的H > 180°
(较大的H + 较小的H + 360°)/ 2 - 360°
例如:(330°+30°+360°)/ 2 - 360° = 0
在RGB模型中,“黄色”与RYB模型中的黄色不同,当与蓝色混合时应该得到绿色。
例如:在RGB模型中,(255, 255, 0)比(0, 0, 255)“强度”大约两倍,而在RYB模型中,相等数量的黄色和蓝色应该得到绿色。同样,两种模型中的红色和蓝色也是不同的。
可以将它们视为向量空间RGB和R'Y'B'。
如果存在某种关系,例如:
R = i1*R' + j1*Y' + k1*B';
G = i2*R' + j2*Y' + k2*B';
B = i3*R' + j3*Y' + k3*B';
首先,您可以通过将RGB空间中的各个颜色(操作数)转换为R'Y'B'空间来进行代数运算。
有9个未知数(i、j、k变量),因此您需要9个方程式(这两个空间中的3个颜色相等性)。
不幸的是,我认为这些模型不会线性缩放,因此为了精度,您可能需要使用查找表。
另一个好主意可能是转换为HSV或YCbCr空间,因为在这些空间中,颜色信息更清晰地抽象出来。(如果存在RGB到RYB的转换,则RGB->YCbCr->RYB路线可能更容易找到)。
在我的应用程序中,无论是在暗色还是亮色主题中混合颜色都遇到了同样的问题,我正在寻找一个快速简单的解决方案。
在暗色主题中,我只需将RGB颜色进行或运算,结果还不错,但是在亮色主题中,这导致非常浅的颜色变得看不见。
我尝试了将颜色进行与运算,效果很好。蓝色+黄色给了我绿色,品红色+青色至少给了我蓝色。
因此,在暗色主题(黑色背景)中,我执行以下操作:
mixed_color = color1 | color2; // Dark theme, like RGB mixing
mixed_color = color1 & color2; // Light theme, like CMY mixing
虽然混合物中不太可能有任何现实主义,但对于我远离摄影软件的需求来说,这是非常令人满意的。