5

%量に基づいて色を混合するアルゴリズムを見つけようとしています。私は選挙プロジェクトに取り組んでおり、レースの各候補者に異なる色を割り当て、その候補者が獲得した投票数に基づいて「結果の」色を作成できるようにしたいと考えています。

この質問:

実際の色を混ぜるように機能する混色のアルゴリズムはありますか?

私が尋ねている質問に近いです-しかし、潜在的に私は3、4、または5色を一緒に混ぜることができる必要があります。これは最終的には非常に複雑な質問であることを理解していますが、2色以上でこれを行うために提案された方法が何であるか興味があります。だから、私は持っているかもしれません:

赤(40%)、緑(10%)、青(50%)

また

赤(40%)、黄(5%)、青(10%)、オレンジ(45%)

繰り返しになりますが、最後の例ではおそらくある種のグレー、ブラウン、またはブラックが生成されることを私は知っています-そしてそれは問題ありません。私の問題は、この問題を解決しようとするアルゴリズムすら持っていないことです。


編集:それで、このメッセージを投稿した後、私が本当に達成しようとしていたのは基本的にペイントの混色であることに気づきました。言い換えれば、私はLIGHTの混色を望まず、PAINTの混色で何が起こるかをシミュレートしたいのです。これは、私が「期待」し続けた「予測可能な」結果であり、取得に問題があったためです。

私はこのリンクを見つけました:http://painting.about.com/library/blpaint/blcolormixingpalette1.htm

これは、私が達成しようとしていることに非常に密接に動作し、私の元のアイデアの小さな「欠陥」を明らかにします。このアルゴリズムを使用して最大6色を混合できても、実際の「データ」は常に3原色に分解されることが示されています。

それでも、これは非常に近いです。

このスレッドに貢献してくれたすべての人に感謝します-これらの提案はすべて、この驚くべき複雑な質問/フィールドの調査に非常に役立ちました。

4

3 に答える 3

7

単純に加重和を取ってみましたか?

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

私の調査によると、正解は 1 つではないようですが、最も適切な効果を生み出すと思われるものは何でもそうです。さらに、単純に色をブレンドするだけでは、実際にインフォグラフ上で何かが示されるとは思いません。本当に細かいディザhttp://en.wikipedia.org/wiki/Dither#Digital_photography_and_image_processingのようなものを試したほうがいいでしょう

于 2012-11-02T18:22:58.813 に答える
2

RGBカラーシステムは、人間が色を知覚するようには機能しないため、このような計算には適していません. たとえば、私たちは黄色を緑と赤の混合として認識しません。最初のステップは、明度座標と色の 2 つの座標を持つ色空間で色を変換することです。これは、HLS または CIELAB のいずれかです。HLS 変換はより単純ですが、CIELAB の座標は人間の色体験をより適切に表現します。この色空間での等距離は、人間の知覚では少なくともほぼ等距離です。

この色空間には、座標 L、A、および B があります。L は、すべての色で同じでなければなりません。ベースカラーはグレーポイントの周りの円上にある必要があるため、それらは同じ距離を持ち、他の色よりも強い色はありません. したがって、基本的に平面にいくつかの点があり、これらの点の重み付けされた中間点を計算する必要があります。このポイントを RGB に変換します。

于 2012-11-03T23:50:08.957 に答える
1

それはすべてあなたのカラーモデルの原色に依存します。RGBカラーモデルを使用しているようです。つまり、すべての色を赤、緑、青の組み合わせで表すことができます。

とは言うものの、赤、緑、または青以外の色は、それらを赤、緑、青の対応する色に分解してから、それらの重みに全体の重みを掛けます。

2番目の例では:

赤(40%)、黄(5%)、青(10%)、オレンジ(45%)

黄色とオレンジは分解する必要があります。オレンジのインスタンスがあると仮定すると、次のColorことができます。

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

これは実際にはすべての Colorインスタンスにわたって一般化でき(原色の場合、の1つだけでR、値がGありBます)、合計と加重平均を使用して混合色を取得できます。

これを行う簡単な拡張方法は次のとおりです。

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);
}
于 2012-11-02T18:28:21.297 に答える