Colors 如何计算CIELAB L*a*b*模型中定义的4种颜色的混合?
我有4种颜色,从RGB转换为CIELABL*a*b*modelColors 如何计算CIELAB L*a*b*模型中定义的4种颜色的混合?,colors,color-space,weighted-average,Colors,Color Space,Weighted Average,我有4种颜色,从RGB转换为CIELABL*a*b*model 当我有(L,a,b)时,如何计算这4种颜色的混合 如果我想将权重(w1、w2、w3、w4)放在这4种颜色上,最大权重为1,最小权重为0(无),我如何计算相同的混合 假设您有这样一个结构: typedef struct LabColor { uint8_t L; uint8_t a; uint8_t b; } LabColor; 以及其中4个的数组: LabColor colors[4]; getMeSome
(L,a,b)
时,如何计算这4种颜色的混合(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);
float LSum=0.0;
浮动aSum=0.0;
浮点数bSum=0.0;
浮动权重总和=0.0;
对于(int i=0;i<4;i++)
{
LSum+=((浮动)颜色[i].L*权重[i]);
aSum+=((浮动)颜色[i].a*权重[i]);
bSum+=((浮动)颜色[i].b*权重[i]);
权重总和+=权重[i];
}
LabColor结果;
结果L=(uint8_t)(LSum/权重和);
结果a=(uint8_t)((aSum/weightSum)+127);
结果b=(单位8_t)((bSum/权重和)+127);
这假设权重都在0和1之间。如果没有,那么你必须做一些夹紧。如果权重总和为1,则可以跳过除法步骤
有无数种其他方法可以混合颜色。如果这一个不能满足您的需要,您需要提供更多关于您需要什么的详细信息。最现实的结果将来自将
L*a*b*
值转换为线性(非伽马校正)RGB
空间,求和这些值,然后再转换回来。这就是物理光源如何相互作用
L*a*b*
颜色空间不是为颜色操纵而发明的,因为它本身就是非线性的。你认为这种混合会产生什么?您可以通过加权将4种颜色的分量平均在一起,得到有效的颜色。但是如果没有更多的信息,很难说它们是否是你所期望的颜色。你有没有试过用它们各自的权重相乘,然后按分量相加,再除以4?如果这不能给你你所期望的,你能更准确地说出你所期望的吗?如果你发布一张图片,它会有帮助。你是否仅仅包含了一组编程语言标签,希望吸引尽可能多的潜在观众?@ DavIDo-我包括那些我用了10年的编程语言。不管你的经验如何,当前的标签集(PHP、JavaScript、C++、C、Perl)与你的问题无关,它们应该被删除。RGB混合不会产生真实的颜色:@user1215106,谁说过“混合模式倍增”?我说“和”。虽然在您的案例中,您可能正在寻找“混合”,但这需要指定每种颜色的顺序和不透明度。与RGB和CMYK颜色模型不同,Lab color设计用于近似人类视觉-。CIE实验室*(CIELAB)是国际照明委员会指定的最完整的颜色空间(法国国际照明委员会,因此其CIE首字母)。它描述了人眼可以看到的所有颜色,并被创建为一个独立于设备的模型,用作参考。@user1215106,我非常清楚CIELAB是如何以及为什么会存在的。我仍然坚持认为它是用于颜色量化,而不是颜色计算。在这种情况下,Mark是绝对正确的-将您的颜色转换为线性RGB并将它们相加。如果你想要真实的照明,你还需要考虑到衰减——这就是离灯光越远,灯光看起来越暗的方式。从a开始,你除以权重之和,而不是平均值。因此,您将执行result.L=(uint8_t)((float)LSum/wSum)
,其中wSum=weights[0]+weights[1]+weights[2]+weights[3]
@RahulNarain很好!谢谢你接电话。我已经修正了。a和b是Lab*空间中的有符号值。@ergosys好的,我已经更新了它,假设它们在-127和127之间。显然,根据重量的不同,您可能需要一些夹紧。我将把它作为练习留给读者。