RGBからCIELABL * a *b*モデルに変換した4色があります。
(L,a,b)
このような色ごとに持っている場合、これらの4つの色の混合をどのように計算できますか?(w1, w2, w3, w4)
最大1つの重みと最小0(なし)の重みを持つこのような4色に重みを付けたい場合、同じミックスを計算するにはどうすればよいですか?
RGBからCIELABL * a *b*モデルに変換した4色があります。
(L,a,b)
このような色ごとに持っている場合、これらの4つの色の混合をどのように計算できますか?
(w1, w2, w3, w4)
最大1つの重みと最小0(なし)の重みを持つこのような4色に重みを付けたい場合、同じミックスを計算するにはどうすればよいですか?
次のような構造があるとします。
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 になる場合は、除算ステップをスキップできます。
色をブレンドする方法は他にも無数にあります。これがあなたが望むことをしない場合は、あなたがしたいことについてより具体的に述べる必要があります.
最も現実的な結果は、L*a*b*
値を線形 (ガンマ補正されていない)RGB
空間に変換し、それらの値を合計して元に戻すことによって得られます。これは、物理的な光源がどのように相互作用するかです。
L*a*b*
色空間は本質的に非線形であるため、色操作のために発明されたものではありません。