我现在进退两难。让我告诉你吧,这真是太不舒服了,所以我想向你寻求明智的建议。

这是交易。你们可能还记得,你们可以看到这个视频-我正在玩一对伪机器人头,每个都有几个smad (smad)史蒂夫和麦克斯的炫酷显示屏)的眼睛。

我的第一个问题是,当我试图拍摄这些视频时,led太亮了,导致我的相机传感器过载,图像被洗掉了。我的第二个问题是,我将要开始显示一个丰富的颜色,我想要应用伽玛校正。

让我们从亮度开始。为了拍摄我的视频,我创建了一个简单的modify亮度()函数来降低我的颜色的亮度一个固定的百分比。

我的24位颜色由3个8位字段组成,它们存储红、绿和蓝(RGB)通道值。这些RGB值可以是十进制的0到255(十六进制的0x00到0xFF)。24位的值存储在32位的字中,最有意义的8位字节仍未使用。

假设我希望将24位颜色的亮度降低到其原始值的50%。我首先将它分成RGB通道,如下图(a)所示。接下来,我修改每个通道的亮度。最后,我从修改过的RGB值重建一个新的24位颜色,如下图(b)所示。

分割和重建24位颜色值(点击图像查看更大的版本-图像来源:maxmaxfield)

下一个问题是伽玛校正。我对这种工作方式的简单理解如下。如果我们使用脉宽调制(PWM)来改变led的亮度,led的表现正如我们所期望的那样,50%的占空比确实导致50%的亮度,如下(a)所示。

Gamma校正(点击图片查看大图-图片来源:Max Maxfield)

问题是,我们的眼睛有一种内在的非线性,如(b)所示,其中指定这种非线性的方程是一个棘手的幂律函数。解决方案是使用(c)中所示的幂律函数的反函数来修改led的亮度,结果是我们的眼睛最终看到的是我们最初期望它们看到的东西。

“伽玛校正”是我们给这个幂律函数的逆的应用所起的名字。结果是,我们在led上看到的颜色更多……我不确定正确的单词是什么,但不管它是什么,颜色更多的是什么。

Adafruit的聪明小伙们已经就这个话题写了很多文章(见LED技巧:伽玛校正).作为这项工作的一部分,他们提供了一个方便的查询表,如下所示。

伽玛校正对照表(点击图片查看大图-图片来源:Max Maxfield)

在这种情况下,表中的索引是与一个RGB通道相关联的原始0到255颜色值,而从表中返回的值是gamma校正后的版本。

这意味着-至于修改亮度-如果我希望应用gamma校正到一个24位颜色值,我首先需要将它分割成它的RGB通道,应用gamma校正到每个通道,然后从修改的RGB值重建一个新的24位颜色。

当然,我也可以通过将24位颜色分割成RGB通道,然后在构建新的24位颜色值之前执行两种操作(修改亮度和应用gamma校正)来简化事情并减少计算数量。

所有这些都让我们陷入了两难的境地(这是最糟糕的一种):我应该先修改亮度,然后应用伽马校正,还是我应该先应用伽马校正,然后修改亮度?说你什么?在这个领域你有什么神秘的知识想和我们分享吗?