颜色混合超过2种颜色

时间:2012-11-02 18:05:51

标签: c# .net colors

我正在尝试找到一种基于%数量混合颜色的算法。我正在进行一个选举项目,并且希望能够在比赛中为每个候选人分配不同的颜色,然后根据候选人获得多少投票来创建“结果”颜色。

这个问题:

Is there an algorithm for color mixing that works like mixing real colors?

接近我要问的问题 - 但我可能需要将3种或4种或5种颜色混合在一起。我知道这最终是一个非常复杂的问题 - 但我很好奇建议的方法是用2种以上的颜色来做这件事。所以,我可能会:

红色(40%),绿色(10%),蓝色(50%)

OR

红色(40%),黄色(5%),蓝色(10%),橙色(45%)

再一次,我知道最后一个例子可能会产生某种灰色或棕色或黑色 - 这很好。我的问题是我甚至没有试图解决这个问题的算法。


编辑: 所以 - 在发布此消息后,我意识到我真正想要实现的基本上是PAINT颜色混合。换句话说,我不希望LIGHT颜色混合,我想模拟PAINT混合会发生什么 - 因为这是我一直“期待”的“可预测”结果 - 并且很难获得。

我找到了这个链接:http://painting.about.com/library/blpaint/blcolormixingpalette1.htm

与我正在努力完成的事情非常接近 - 并且在我最初的想法中暴露出一个小小的“缺陷”。所展示的是,即使我可以使用此算法混合多达6种颜色,实际的“数据”总是分解为3种基色。

即便如此 - 这非常接近。

感谢所有为此主题做出贡献的人 - 所有这些建议对于探索这个令人惊讶的复杂问题/领域非常有帮助。

3 个答案:

答案 0 :(得分:6)

您是否尝试过简单地加权?

d.R = a.R*0.25 + b.R*0.25 + c.R*0.5
d.G = a.G*0.25 + b.G*0.25 + c.G*0.5
...
where a, b, c are the colors you're mixing

从我的研究来看,似乎没有任何一个正确的答案,但似乎产生最合适的效果。此外,我不认为简单地混合颜色会在infograph上显示任何内容。你最好尝试一些非常精细的抖动http://en.wikipedia.org/wiki/Dither#Digital_photography_and_image_processing

答案 1 :(得分:1)

这完全取决于color model中的原色。看起来你正在使用RGB color model,这意味着所有颜色都可以用红色,绿色和蓝色混合来表示。

也就是说,任何红色,绿色或蓝色的颜色都会将它们分解为红色,绿色和蓝色对应物,然后将这些权重乘以整体重量。

在你的第二个例子中:

  

红色(40%),黄色(5%),蓝色(10%),橙色(45%)

黄色和橙色需要分解。假设你有橙色的Color实例,你可以这样做:

orangeRed = o.R * .05;
orangeBlue = o.B * .05;
orangeGreen = o.G * .05;

这实际上可以在所有 Color个实例中进行推广(对于原色,RGB中只有一个会有一个值)然后可以得到总和和加权平均值来得到你的混合颜色。

执行此操作的简单扩展方法是:

static Color Mix(this IEnumerable<Tuple<Color, double>> colors)
{
    // The red, green, and blue values.
    double red = 0.0, green = 0.0, blue = 0.0;

    // The denominator for the weighted average for a color.
    double denominator = byte.MaxValue * 3.0;

    // Cycle through the colors.
    foreach (Tuple<Color, double> color in colors)
    {
        // Get the weighted average value for each component, and then
        // multiply that by the weight for the color.
        red   += ((color.Item1.R / denominator) * color.Item2);
        green += ((color.Item1.G / denominator) * color.Item2);
        blue  += ((color.Item1.B / denominator) * color.Item2);
    }

    // Create the color and return.
    return Color.FromArgb((int) red, (int) green, (int) blue);
}

答案 2 :(得分:1)

RGB颜色系统对于这样的计算是不好的,因为它不像我们人类感知颜色那样工作。例如,我们只是将黄色视为绿色和红色的混合物。 第一步是在颜色空间中转换颜色,其中您有一个亮度坐标和两个颜色坐标。 这可以是HLS或CIELAB。 HLS转换更简单,但CIELAB中的坐标代表了更好的人体色彩体验。该色彩空间中的相等距离​​在人类感知中至少大致相等。

在此颜色空间中,您有L,A和B的坐标。对于所有颜色,L应该相同。您的基色应该位于灰点周围的圆上,因此它们具有相同的距离,并且没有颜色比其他颜色更强。所以你基本上在飞机上有几个点,需要计算这些点的加权中点。您将此点转换回RGB。