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

Colors 如何计算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

我有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];
    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之间。显然,根据重量的不同,您可能需要一些夹紧。我将把它作为练习留给读者。