如何计算RGB+A+W(琥珀色+白色)从RGB为led
本文关键字:白色 led RGB RGB+A+W 何计算 计算 琥珀色 | 更新日期: 2023-09-27 18:12:12
我需要编写一个函数,需要RGB(0-255)输入和输出5个值来驱动RGBAW LED(集成芯片,在一个模块中具有红色,蓝色,绿色,琥珀色和白色单个LED)。我的函数的输出必须是5x 0-255的值。我的首选语言是c#,但我可能会从任何语言转换。
我基本上有一个RGB输入(称为Ri, Gi, Bi),每个都在0-255。假设led被校准为相同的光输出。从输出中,我想计算出5个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,用户指南也链接在那里(没有说明这些是如何校准的,这个灯具不是高端的,所以这可能是为什么,我认为我们只需要假设它们是校准的,就这个问题而言)。
首先,您需要校准LEDs以获得归一化系数
-
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
白色 你需要平衡白与白。理想情况下,您应该找到与
W
值匹配的R,G,B
值。并创建函数Rw(W),Gw(W),Bw(W)
将
W
与RGB
LEDs匹配。这并不容易,可能是一些带有像素拾取工具的网络摄像头会有所帮助(但也必须平衡)。 琥珀同样你需要找到
Ra(A),Ga(A),Ba(A)
将
A
与RGB
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
琥珀可以放松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
作为黄色平衡(温暖)
我不能测试,所以这只是一个猜测,我的头:
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颜色。