我有 4 种颜色从 RGB 转换为 CIELAB L*a*b*模型。
(L,a,b)
当我有每种颜色时,如何计算这四种颜色的混合?(w1, w2, w3, w4)
如果我想在这 4 种颜色上加上 1 个最大和 0 个最小(无)权重,我该如何计算相同的混合?
我有 4 种颜色从 RGB 转换为 CIELAB L*a*b*模型。
(L,a,b)
当我有每种颜色时,如何计算这四种颜色的混合?
(w1, w2, w3, w4)
如果我想在这 4 种颜色上加上 1 个最大和 0 个最小(无)权重,我该如何计算相同的混合?
假设你有这样的结构:
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,则可以跳过除法步骤。
有无数种其他方法可以混合颜色。如果这个不符合您的要求,您需要提供更多关于您想要的细节。
最现实的结果将来自将您的L*a*b*
值转换为线性(未经过伽马校正)RGB
空间,对这些值求和,然后再转换回来。这就是物理光源相互作用的方式。
颜色空间不是为颜色处理而L*a*b*
发明的,因为它本质上是非线性的。