我需要编写一个带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,用户指南也在那里链接(它没有说明这些是如何校准的,这个灯具不是'为了这个问题,我认为我们只需要假设它们在这个问题上就已经过校准了。
答案 0 :(得分:2)
首先,您需要校准 LED 以获得归一化系数
<强> 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
<强>白强>
您需要平衡白色到白色。理想情况下,您应该找到与R,G,B
值匹配的W
值。并创建函数
Rw(W),Gw(W),Bw(W)
将W
与RGB
LED 匹配。这不是一件容易的事,可能是一些带有像素拾取工具的网络摄像头会有所帮助(但也必须保持平衡)。
<强>琥珀强>
同样你需要找到
Ra(A),Ga(A),Ba(A)
将A
与RGB
个LED匹配。如#2
混色
校准后,您应该将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颜色。