如何遍历 RGB 中的可见光谱?

Posted

技术标签:

【中文标题】如何遍历 RGB 中的可见光谱?【英文标题】:How do I iterate through the visible spectrum of colours in RGB? 【发布时间】:2014-01-05 11:45:10 【问题描述】:

我正在使用 freeglut 在屏幕上绘制一些形状,并希望根据与每个对象关联的值来调整它们的颜色。值范围从0.01.0,我希望这些代表鲜红色到紫色,数字在可见光谱中呈线性缩放。

问题是,我需要用 RGB 颜色代码(每种颜色代码为 0.0 到 1.0)来表示这些。有没有一些简单的方法来实现这一点?

【问题讨论】:

RGB 不是一个很好的色彩空间。我会考虑在HSL or HSV 中工作,它有一个“色调”轴,然后在必要时转换回 RGB。 您可以使用 HSL 颜色轻松完成此操作,迭代颜色通道并将其转换为 RGB 您会遇到的主要问题是,RGB 并没有覆盖大部分可见色彩空间。如果您真的想代表整个可见光谱,您将不得不在广色域色彩空间中工作,或者更好的是在接触色彩空间中工作。但请注意,没有 广泛可用的显示设备能够表示所有可见颜色;从技术上讲,它可以通过现有技术使用在其滤色轮中使用超过 3 种颜色的视频投影仪来完成。 这是我的更好的波长 -> RGB 转换:***.com/a/22681410/2521214 【参考方案1】:

感谢 cmets,我不知道 HSV。我在网上找到了以下内容:

void pSetHSV( float h, float s, float v ) 
    // H [0, 360] S and V [0.0, 1.0].
    int i = (int)floor(h/60.0f) % 6;
    float f = h/60.0f - floor(h/60.0f);
    float p = v * (float)(1 - s);
    float q = v * (float)(1 - s * f);
    float t = v * (float)(1 - (1 - f) * s);
    switch (i) 
        case 0: glColor3f(v, t, p);
        break;
        case 1: glColor3f(q, v, p);
        break;
        case 2: glColor3f(p, v, t);
        break;
        case 3: glColor3f(p, q, v);
        break;
        case 4: glColor3f(t, p, v);
        break;
        case 5: glColor3f(v, p, q);
    

来源:http://forum.openframeworks.cc/t/hsv-color-setting/770

【讨论】:

为什么常规的 RGB 空间不起作用? astrouw.edu.pl/~jskowron/colors-x11/rgb.html 之类的东西?

以上是关于如何遍历 RGB 中的可见光谱?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法遍历表(listobject)列中的可见单元格?

opencv C++ 三重for循环遍历RGB图像像素(逐像素操作操作像素值遍历像素遍历)

【光谱数据分析】Pix4Dmapper(一)

GetDIBits 遍历位图 获取像素的颜色值(RGB)

GetDIBits 遍历位图 获取像素的颜色值(RGB)

遍历用户表单中的所有组合框并使用名称进行验证并使它们可见