gpt4 book ai didi

colors - 在 HSV/HSB 中淡出更多更自然的彩虹光谱

转载 作者:行者123 更新时间:2023-12-01 23:35:16 26 4
gpt4 key购买 nike

我正在尝试控制一些 RGB LED 并从红色渐变为紫色。我正在使用 HSV 到 RGB 的转换,这样我就可以从色调 0 扫描到色调 300(超出它会移回红色)。但我注意到的问题是,它似乎在光谱的青色和蓝色部分花费了太多时间。所以我查了一下HSV谱应该是什么样子,发现了这个L

enter image description here

我没有意识到超过一半的光谱花在绿色和蓝色之间。

但我真的希望它看起来更像这样:

enter image description here

与“标准”彩虹色完美融合。我想这最终会成为正常色调值的某种 S 曲线,但我不确定如何计算该曲线。

在内部处理这个问题的实际 HSV 到 RGB 算法会很棒(任何代码,尽管它是针对 Arduino 的)但即使只是解释我如何计算色调曲线也会非常感激。

最佳答案

http://www.fourmilab.ch/documents/specrend/有相当详细的描述如何将波长转换为 CIE 分量(大致对应于您眼中三种锥形传感器的输出),然后如何将其转换为 RGB 值(警告某些波长不t 在典型的 RGB 色域中具有 RGB 等价物)。

或者:有各种“感知均匀的颜色空间”,如 CIE L*a*b*(参见例如 http://en.wikipedia.org/wiki/Lab_color_space);您可以选择其中之一,沿着连接该空间中的起始颜色和结束颜色的直线采取相同的步骤,然后转换为 RGB。

不过,对于您的应用程序来说,其中任何一个都可能是矫枉过正,并且没有明显的理由说明它们应该比更简单和纯经验的东西好得多或任何好。那么为什么不执行以下操作:

  1. 选择起始颜色和结束颜色。为简单起见,我们假设它们在 HSV 空间中有 S=1 和 V=1。记下来。
  2. 查看您发布的色相“光谱”,找到一种在您看来介于起点和终点之间的颜色。记下来。
  3. 现在再次平分:找到开始和中间之间的中间位置以及中间和结尾之间的中间位置的颜色。
  4. 再重复一次或两次,这样您就可以将色调比例分为 8 或 16 个“感知上相等”的部分。
  5. 转换为 RGB,将它们粘贴到查找表中,然后在两者之间进行线性插值。
  6. 稍微调整 RGB 值,直到得到看起来不错的东西。

这完全是临时的,根本没有任何原则,但它可能会工作得很好,最终代码基本上是微不足道的:

void compute_rgb(int * rp, int * gp, int * bp, int t) {
// t in the range 0..255 (for convenience)
int segment = t>>5; // 0..7
int delta = t&31;
int a=rgb_table[segment].r, b=rgb_table[segment+1].r;
*rp = a + ((delta*(b-a))>>5);
a=rgb_table[segment].g; b=rgb_table[segment+1].g;
*gp = a + ((delta*(b-a))>>5);
a=rgb_table[segment].b; b=rgb_table[segment+1].b;
*bp = a + ((delta*(b-a))>>5);
}

(如果您不关心保存每个可用循环,您可以使代码更清晰一些)。

就其值(value)而言,我的眼睛将划分点放在大约 (0)、40、60、90、150、180、240、270、(300) 的色调值处。您的里程可能会有所不同。

关于colors - 在 HSV/HSB 中淡出更多更自然的彩虹光谱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5162458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com