我有4种颜色,我从RGB转换为CIELAB L * a * b * 模型。
当我对每种颜色(L,a,b)
时,如何计算这4种颜色的混合?
如果我想将重量(w1, w2, w3, w4)
放在这4种颜色上,最多1个,最小0个(无)重量,我该如何计算相同的混合?
答案 0 :(得分: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);
一种可能的混合方法是:
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,则可以跳过除法步骤。
有无数种其他方式来混合颜色。如果这个没有做你想要的,你需要提供更多细节,你想要什么。
答案 1 :(得分:5)
最真实的结果将来自将L*a*b*
值转换为线性(非伽马校正的)RGB
空间,对这些值求和并转换回来。这就是物理光源相互作用的方式。
L*a*b*
色彩空间不是为色彩操作而发明的,因为它本质上是非线性的。