树莓派+Neopixel:如果减少RGB LED的亮度,是否意味着某些颜色无法呈现?

4

关于控制WS2812B RGB LED条的Python库neopixel(rpi_ws281x),通过将每个像素子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)


然而,如果我想将RGB(255、187、120)的颜色呈现为50%的亮度:在我的看来,数据框的位被限制在每像素最大值(127, 127, 127) - 根据上面的代码,因此上述颜色无法显示?
我的理解正确吗?
请问有人可以解释一下该库中亮度控制/调光功能是如何工作的吗? 它不应该降低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()

enter image description here

1个回答

1
颜色值不会被截断,而是乘以亮度系数。所以255变成了127127变成了63
颜色(255, 187, 120)将变为(127, 93, 60)
这意味着您将均匀失去所有更亮的颜色“变体”。
CCT为3200K的颜色(定义为(255, 187, 120))在(127, 93, 60)时仍然为3200K,因为颜色之间的关系保持不变。如果您使用动态范围更高的LED,则可以将3200K定义为(1023, 375, 239)
但需要注意的是,这些LED的亮度不是线性函数。通常,从016的亮度跳变比从111127的更加明显,因此,在这个意义上,您将会失去一些颜色。如果在LED上覆盖一块黑布,只透过50%的光线,您将获得更准确的颜色。

嗨,我应用中颜色重要性的原因是为了显示和维持正确的相关色温度(CCT)。3200K的CCT需要RGB值为(255, 187, 120)。因此,我考虑根据用户需求以降低功率显示正确的颜色。在这种情况下,也许我应该关闭50%的像素。 - siva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接