如何从 LED 的 RGB 计算 RGB+A+W(琥珀色 + 白色)

How to calculate RGB+A+W (Amber + White) from RGB for LEDs

我需要编写一个函数,它接受 RGB (0-255) 输入并输出 5 个值来驱动 RGBAW LED(在一个模块中具有红色、蓝色、绿色、琥珀色和白色独立 LED 的集成芯片)。我的函数的输出必须是 5x 0-255 值。我的首选语言是 C#,但我可能可以从任何语言转换。

我基本上有一个 RGB 输入(称为 Ri、Gi、Bi),每个输入都在 0-255。假定 LED 校准为相同的光输出。我想根据输出计算五个 LED(R、G、B、A、W)中的每一个的输出。

我想确保在使用 100% 红色 (Ri = 255) 时,光输出不会被白色冲掉。

该函数应如下所示:

public void CalculateRGBAW(byte ri, byte gi, byte bi, out byte r, out byte g, out byte b, out byte a, out byte w)
{
    r = ri;
    g = gi;
    b = bi;
    a = XXXXXXXXXXXXXXXXXXXXXXX;
    w = XXXXXXXXXXXXXXXXXXXXXXX;
}

这是将驱动的 LED 灯具类型:MARQ Gamut PAR H7,用户指南也链接在那里(没有说明如何校准这些灯具,这种灯具不高结束所以这可能就是为什么,我认为我们只需要假设就这个问题而言它们已经过校准)。

我无法测试,所以这只是我的猜测:

w = min (r, g, b)
a = min(r - w, g - w)  
r = r - w - a 
g = g - w - a  
b = b - w

看起来有点亮,不过,也许 w = w / 3 还有 a = a / 2..?您肯定需要调整实际的 LED 颜色。

首先你需要校准你的LED以获得归一化系数

  1. R,G,B

    if R=G=B 输出颜色应该是灰度阴影。要实现这一点,请使用比例系数,例如:

    R'=r*R
    G'=g*G
    B'=b*B
    

    其中 r,g,b 是比例系数,R,G,B 是您的理想输入值。 R',G',B' 是发送到您的 LED 驱动器的值。这个等式假设线性行为,如果不是这种情况,您需要将等式更改为多项式,例如:

    R'=r0 + r1*R + r2*R^2 + ...
    

    现在您发送 R'=G'=B'=10 并检查光色。如果不是白色,则减少超过白色的颜色。这样做直到你得到白色。

    R'=G'=B'=10 , R'=G'=B'=20 , R'=G'=B'=30 , ... 等更多初始值执行此操作,并在调整为白色后记住这些值。例如

     R` G` B`   beg
    10 10 12    10
    20 20 24    20
    30 30 36    30
    

    所以在这个例子中,蓝色的 LED 没有 R,G 的那么闪亮,因此需要对其进行缩放。从这几点你可以估计依赖是线性的没有偏移所以

    r=1
    g=1
    b=36/30=24/20=12/10=1.2
    

    你需要整数,这样你就可以使用像

    这样的定点算法
    b=(12*256)/10 = 307
    B'=(B*b)/256
    
  2. 白色

    你需要平衡白到白。理想情况下,您应该找到与 W 值匹配的 R,G,B 值。并创建函数

    Rw(W),Gw(W),Bw(W)
    

    将匹配 WRGB LEDs。这并不容易,可能一些带有像素拾取工具的网络摄像头会有所帮助(但也必须平衡)。

  3. 琥珀色

    同样你需要找到

    Ra(A),Ga(A),Ba(A)
    

    这将匹配 ARGB LED。如 #2

混色

校准后,您应该将 R,G,B,A,W 值线性化,以便您可以对它们进行算术运算。因此,为了增强您的动态范围,让我们假设 Ri,Gi,Bi 是您要驱动的输入颜色值。以下是 LEDs

的一些依赖项
         R   G   B
White = (W/3,W/3,W/3)
Amber = (A  ,A/2,0  )

所以白方可以减轻所有 R,G,B

W = min(Ri,Gi,Bi)/3
R = Ri-W
G = Gi-W
B = Bi-W

Amber 可以缓解 R,G 所以找到 A

A = R
if (A>G*2) A=G*2
R = Ri-A
G = Gi-A/2
B = Bi

当全部放在一起时

W = min(Ri,Gi,Bi)/3
A = Ri-W
if (A>(Gi-W)*2) A=(Gi-W)*2
R = Ri-W-A
G = Gi-W-A/2
B = Bi-W

所以现在您甚至可以在 <0-255> 之上使用 Ri,Gi,Bi(对于某些颜色)并且在 <0,255> 中仍然有 R,G,B。您还可以使用 W 作为亮度,使用 A 作为黄平衡(暖度)