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

Ωme*_*ega 6 colors weighted-average color-space

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

  1. 当我拥有这些颜色时,如何计算这4种颜色的混合(L,a,b)

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

use*_*321 10

假设你有这样的结构:

typedef struct LabColor {
    uint8_t L;
    uint8_t a;
    uint8_t b;
} LabColor;
Run Code Online (Sandbox Code Playgroud)

以及其中4个的数组:

LabColor colors[4];
getMeSomeColors (colors);
Run Code Online (Sandbox Code Playgroud)

和重量:

float weights[4];
getMeSomeWeights (weights);
Run Code Online (Sandbox Code Playgroud)

一种可能的混合方法是:

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);
Run Code Online (Sandbox Code Playgroud)

假设权重都在0和1之间.如果不是,那么你必须做一些钳制.如果权重总和为1,则可以跳过除法步骤.

有无数种其他方式来混合颜色.如果这个没有做你想要的,你需要提供更多细节,你想要什么.


Mar*_*som 5

最真实的结果将来自将您的L*a*b*值转换为线性(非伽马校正的)RGB空间,对这些值求和并转换回来.这就是物理光源相互作用的方式.

L*a*b*色彩空间并没有发明了色彩处理,因为它本质上是非线性的.

  • 在这种情况下,Mark绝对正确 - 将您的颜色转换为线性RGB并将它们添加到一起.如果你想要逼真的照明,你也需要考虑到下降 - 这就是灯光越远离你的距离越远的方式. (3认同)
  • @ user1215106,谁说过"混合模式倍增"?我说"总和".虽然在您的情况下您可能正在寻找"混合",但这需要指定每种颜色的顺序和不透明度. (2认同)
  • @ user1215106,我完全清楚CIELAB是如何以及为何存在的.我仍然认为它是用于颜色量化,而不是颜色计算. (2认同)