Raspberry Pi + neopixel:如果RGB LED的亮度降低,是否意味着某些颜色无法呈现?
Raspberry Pi + neopixel: If brightness of RGB LEDs are reduced, does that mean certain colors cannot be rendered?
参考python库neopixel
(rpi_ws281x),控制WS2812B RGB LED灯条,通过缩放像素中每个子LED的字节来调整亮度从 255 到 127 限制我们渲染某些颜色?
根据库,为了调光,执行以下代码:
def setBrightness(self, brightness):
"""Scale each LED in the buffer by the provided brightness. A brightness
of 0 is the darkest and 255 is the brightest.
"""
ws.ws2811_channel_t_brightness_set(self._channel, brightness)
但是,如果我想以 50% 的亮度渲染 RGB (255, 187, 120) 的颜色:在我看来,数据帧位 clipped capped每个像素最多 (127, 127, 127) - 根据上面的代码,上面的颜色无法显示?
我说得对吗?
谁能解释一下那个库中的亮度 control/dimming 函数是如何工作的?
它不应该降低 PWM 占空比以降低亮度(功率)吗?
请说明。谢谢。
更新:
通过绘制亮度与 CCT 的关系图,在较低的亮度下 (100% --> 75% --> 50% --> 25%),CCT 会增加。如何纠正?
import colour
import numpy as np
import matplotlib.pyplot as plt
data = np.array([255, 187, 120])
data75 = data*0.75
data50 = data*0.5
data25 = data*0.25
datas = [data, data75, data50, data25]
methods = ['daylight','kang2002','mccamy1992','hernandez1999']
def rgb2cct(x,y):
RGB = np.array(x)
XYZ = colour.sRGB_to_XYZ(RGB / 255)
xy = colour.XYZ_to_xy(XYZ)
CCT = colour.xy_to_CCT(xy, y)
#print(CCT)
return CCT
X =[100,75,50,25]
Y = []
for j in methods:
print(j)
for k,v in enumerate(datas):
u = rgb2cct(v,j)
Y.append(u)
def chunks(lst, n):
for i in range(0, len(lst), n):
yield lst[i:i + n]
plot = list(chunks(Y,4))
for i,j in zip(plot,methods):
plt.plot(X,i, label = j)
plt.axhline(y=3200, color = 'black', linewidth=0.5)
plt.legend()
plt.show()
颜色值未被剪裁,而是乘以亮度系数。所以255
变成了127
,127
变成了63
。
颜色 (255, 187, 120)
将变为 (127, 93, 60)
。
这意味着您将平均失去所有较亮的 "variants" 颜色。
3200K 的 CCT,定义为 (255, 187, 120)
,在 (127, 93, 60)
处仍为 3200K,因为颜色之间的关系保持不变。如果您的 LED 具有更高的动态范围,则 3200K 可以定义为 (1023, 375, 239)
.
但需要注意的一件事是这些 LED 的亮度为 not a linear function。通常从 0
到 16
的亮度跳跃比从 111
到 127
的亮度跳跃更明显,所以是的,从这个意义上说你会失去颜色。通过在 LED 上放一块黑色织物,让我们只通过 50% 的光,您可以获得更准确的颜色。
参考python库neopixel
(rpi_ws281x),控制WS2812B RGB LED灯条,通过缩放像素中每个子LED的字节来调整亮度从 255 到 127 限制我们渲染某些颜色?
根据库,为了调光,执行以下代码:
def setBrightness(self, brightness):
"""Scale each LED in the buffer by the provided brightness. A brightness
of 0 is the darkest and 255 is the brightest.
"""
ws.ws2811_channel_t_brightness_set(self._channel, brightness)
但是,如果我想以 50% 的亮度渲染 RGB (255, 187, 120) 的颜色:在我看来,数据帧位 clipped capped每个像素最多 (127, 127, 127) - 根据上面的代码,上面的颜色无法显示?
我说得对吗?
谁能解释一下那个库中的亮度 control/dimming 函数是如何工作的? 它不应该降低 PWM 占空比以降低亮度(功率)吗?
请说明。谢谢。
更新:
通过绘制亮度与 CCT 的关系图,在较低的亮度下 (100% --> 75% --> 50% --> 25%),CCT 会增加。如何纠正?
import colour
import numpy as np
import matplotlib.pyplot as plt
data = np.array([255, 187, 120])
data75 = data*0.75
data50 = data*0.5
data25 = data*0.25
datas = [data, data75, data50, data25]
methods = ['daylight','kang2002','mccamy1992','hernandez1999']
def rgb2cct(x,y):
RGB = np.array(x)
XYZ = colour.sRGB_to_XYZ(RGB / 255)
xy = colour.XYZ_to_xy(XYZ)
CCT = colour.xy_to_CCT(xy, y)
#print(CCT)
return CCT
X =[100,75,50,25]
Y = []
for j in methods:
print(j)
for k,v in enumerate(datas):
u = rgb2cct(v,j)
Y.append(u)
def chunks(lst, n):
for i in range(0, len(lst), n):
yield lst[i:i + n]
plot = list(chunks(Y,4))
for i,j in zip(plot,methods):
plt.plot(X,i, label = j)
plt.axhline(y=3200, color = 'black', linewidth=0.5)
plt.legend()
plt.show()
颜色值未被剪裁,而是乘以亮度系数。所以255
变成了127
,127
变成了63
。
颜色 (255, 187, 120)
将变为 (127, 93, 60)
。
这意味着您将平均失去所有较亮的 "variants" 颜色。
3200K 的 CCT,定义为 (255, 187, 120)
,在 (127, 93, 60)
处仍为 3200K,因为颜色之间的关系保持不变。如果您的 LED 具有更高的动态范围,则 3200K 可以定义为 (1023, 375, 239)
.
但需要注意的一件事是这些 LED 的亮度为 not a linear function。通常从 0
到 16
的亮度跳跃比从 111
到 127
的亮度跳跃更明显,所以是的,从这个意义上说你会失去颜色。通过在 LED 上放一块黑色织物,让我们只通过 50% 的光,您可以获得更准确的颜色。