6

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

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

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

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);

一种可能的混合方法是:

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 回答