如何从 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以获得归一化系数
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
白色
你需要平衡白到白。理想情况下,您应该找到与 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
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
作为黄平衡(暖度)
我需要编写一个函数,它接受 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以获得归一化系数
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
白色
你需要平衡白到白。理想情况下,您应该找到与
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
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
作为黄平衡(暖度)