【问题标题】:RGB palette designated for ordered values为有序值指定的 RGB 调色板
【发布时间】:2011-12-16 12:55:34
【问题描述】:

我有一个函数 f(x,y),主要是单调的,它产生一些在 {0.0 .. 100.0} 范围内的值。我想使用不同的颜色将它们绘制为 2D 图片,其中 (x,y) 是坐标,而独特的颜色代表函数的独特值。问题如下:我不知道如何将此函数的值映射到保留顺序的 RGB 颜色空间(可见)。我找到了那个smth。喜欢:

R = f(x,y) * 10.0f;
G = f(x,y) * 20.0f;
B = f(x,y) * 30.0f;
color = B<<16|G<<8|R; //@low-endian

效果很好,但生成的图片太暗了。如果我增加这些常数,事情不会变得更好,因为在某些时候颜色分量会大于 0xFF,所以它会溢出(一个颜色分量应该在 {0 .. 0xFF} 范围内。

您知道如何将值从 {0.0 .. 100.0} 映射到
RGB=[{0 .. 0xFF}

PS:也许你知道,在哪里可以找到更多关于相关理论的在线信息?我只记得 Foley/Van Dam 的 Comp.Graphics,但我没有这本书。

更新:我正在寻找如何生成像右侧那样的色度调色板:

【问题讨论】:

    标签: c math graphics colors rgb


    【解决方案1】:

    您可以尝试将这些值限制为最大 255 (0xff)。

    R = min((int)(f(x,y) * 10.0f), 0xff);
    G = min((int)(f(x,y) * 20.0f), 0xff);
    B = min((int)(f(x,y) * 30.0f), 0xff);
    

    编辑: 有很多不同的方法可以自动转换为颜色,但您可能会发现它们都不会产生您正在寻找的确切进展。由于您已经有了一张可接受的调色板图片,因此一种方法是创建一个 256 色的查找表。

    #define RGB(R,G,B) (B<<16|G<<8|R)
    
    int palette[256] = { RGB(0,0,0), RGB(0,0,128), ... };
    
    int greyscale = (int)(f(x,y) * 2.559999);
    assert(greyscale >= 0 && greyscale <= 255);
    int rgb = palette[greyscale];
    

    如果查找表太麻烦,还可以将灰度范围分成不同的子范围,并在每个范围的端点之间进行线性插值。

    int interpolate(int from, int to, double ratio)
    {
        return from + (int)((to - from) * ratio); 
    }
    if (greyscale <= 48)
    {
        R = 0;
        G = 0;
        B = interpolate(0, 255, greyscale/48.0);
    }
    else if (greyscale <= 96)
    {
        R = 0;
        G = interpolate(0, 255, (greyscale-48)/48.0);
        B = interpolate(255, 0, (greyscale-48)/48.0);
    }
    else if ...
    

    【讨论】:

    • 我试过了,不好看。例如,如果 blue-or/and-green 设置为 0xFF,则它不会显示纯红色
    • 说句公道话,一开始您并不太清楚自己在寻找什么 - 我认为从黑色到深红色到黄色到白色的渐变是可以的。在问题中添加示例调色板很有帮助。
    • 谢谢,这可能是最好的解决方案。
    【解决方案2】:

    实际上您可以使用YUV 颜色模型,因为它有点基于两个坐标,即 U 和 V。

    这似乎更适合这项任务。

    YUV -> RGB 转换非常简单。

    【讨论】:

      【解决方案3】:

      您可以将 RGB 转换为 HSL 并增加亮度/对比度。您可以在此页面上找到有关转换和其他有用信息的论坛:http://lodev.org/cgtutor/color.html

      【讨论】:

        【解决方案4】:

        使用不同的色彩空间,这意味着您可以轻松地将坐标分配给不同的颜色。

        YUV 或 YCrCb 可能适合,因为 UV 或 CrCb 尺寸可被视为“直角”

        或 HSL/HSV,如果您的某个维度像色调一样环绕。

        【讨论】:

          【解决方案5】:

          我相信您想要一个基于有序值的热图。然后你有不同类型的热图。解决方法在这里:http://www.andrewnoske.com/wiki/Code_-_heatmaps_and_color_gradients

          【讨论】:

            猜你喜欢
            • 2020-09-02
            • 2013-10-14
            • 2011-04-08
            • 2021-11-07
            • 1970-01-01
            • 1970-01-01
            • 2014-02-04
            • 1970-01-01
            • 2014-05-04
            相关资源
            最近更新 更多