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

时间:2016-10-09 22:51:47

标签: c# math rgb led

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

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

我想确保光输出不会被白色褪色,例如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,用户指南也在那里链接(它没有说明这些是如何校准的,这个灯具不是'为了这个问题,我认为我们只需要假设它们在这个问题上就已经过校准了。

2 个答案:

答案 0 :(得分:2)

首先,您需要校准 LED 以获得归一化系数

  1. <强> R,G,B

    如果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. <强>白

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

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

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

  3. <强>琥珀

    同样你需要找到

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

    ARGB个LED匹配。如#2

  4. 混色

    校准后,您应该将R,G,B,A,W值线性化,以便在其上使用算术。因此,为了增强动态范围,假设Ri,Gi,Bi是您要驱动的输入颜色值。以下是 LED s

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

    所以White可以放松所有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
    

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

答案 1 :(得分:0)

我无法测试,所以这只是一个猜测,不在我的脑海中:

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颜色。