6

RGBからCIELABL * a *b*モデルに変換した4色があります。

  1. (L,a,b)このような色ごとに持っている場合、これらの4つの色の混合をどのように計算できますか?

  2. (w1, w2, w3, w4)最大1つの重みと最小0(なし)の重みを持つこのような4色に重みを付けたい場合、同じミックスを計算するにはどうすればよいですか?

4

2 に答える 2

10

次のような構造があるとします。

typedef struct LabColor {
    uint8_t L;
    uint8_t a;
    uint8_t b;
} LabColor;

そしてそれらの4つの配列:

LabColor colors[4];
getMeSomeColors (colors);

および重み:

float weights[4];
getMeSomeWeights (weights);

考えられるブレンド方法の 1 つとして、次のようなものがあります。

float LSum = 0.0;
float aSum = 0.0;
float bSum = 0.0;
float weightSum = 0.0;
for (int i = 0; i < 4; i++)
{
    LSum += ((float)colors [ i ].L * weights [ i ]);
    aSum += ((float)colors [ i ].a * weights [ i ]);
    bSum += ((float)colors [ i ].b * weights [ i ]);
    weightSum += weights[i];
}
LabColor result;
result.L = (uint8_t)(LSum / weightSum);
result.a = (uint8_t)((aSum / weightSum) + 127);
result.b = (uint8_t)((bSum / weightSum) + 127);

これは、重みがすべて 0 から 1 の間であることを前提としています。そうでない場合は、クランプを行う必要があります。重みの合計が 1 になる場合は、除算ステップをスキップできます。

色をブレンドする方法は他にも無数にあります。これがあなたが望むことをしない場合は、あなたがしたいことについてより具体的に述べる必要があります.

于 2012-06-23T22:14:57.597 に答える
5

最も現実的な結果は、L*a*b*値を線形 (ガンマ補正されていない)RGB空間に変換し、それらの値を合計して元に戻すことによって得られます。これは、物理的な光源がどのように相互作用するかです。

L*a*b*色空間は本質的に非線形であるため、色操作のために発明されたものではありません。

于 2012-06-26T17:48:51.803 に答える