如何计算CIELAB L * a * b *模型中定义的4种颜色的混合?

时间:2012-06-21 22:09:26

标签: colors color-space weighted-average

我有4种颜色,我从RGB转换为CIELAB L * a * b * 模型。

  1. 当我对每种颜色(L,a,b)时,如何计算这4种颜色的混合?

  2. 如果我想将重量(w1, w2, w3, w4)放在这4种颜色上,最多1个,最小0个(无)重量,我该如何计算相同的混合?

2 个答案:

答案 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*色彩空间不是为色彩操作而发明的,因为它本质上是非线性的。