Ωme*_*ega 6 colors weighted-average color-space
我有4种颜色,我从RGB转换为CIELAB L*a*b*模型.
当我拥有这些颜色时,如何计算这4种颜色的混合(L,a,b)?
如果我想(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,则可以跳过除法步骤.
有无数种其他方式来混合颜色.如果这个没有做你想要的,你需要提供更多细节,你想要什么.
最真实的结果将来自将您的L*a*b*值转换为线性(非伽马校正的)RGB空间,对这些值求和并转换回来.这就是物理光源相互作用的方式.
该L*a*b*色彩空间并没有发明了色彩处理,因为它本质上是非线性的.