为指定值指定的RGB调色板

时间:2011-10-27 13:46:51

标签: c math graphics colors rgb

我有一个函数f(x,y),大多是单调的,它会产生{0.0 .. 100.0}范围内的一些值。我想用不同的颜色作为2D图片绘制它们,其中(x,y)是坐标,其中独特的颜色代表功能的独特值。问题如下:我不知道如何将此函数的值映射到RGB颜色空间,保留顺序(可见)。我发现了这个。像:

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}&lt;&lt; 16 | {0 .. 0xFF}&lt;&lt;&lt; 8 | {0 .. 0xFF}],以便得到的RGB值明显可以吗?

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

更新:我正在寻找如何生成右侧的色度调色板: enter image description here

5 个答案:

答案 0 :(得分:2)

您可以尝试将值限制为最大值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 ...

答案 1 :(得分:2)

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

这似乎更适合这项任务。

和YUV - &gt; RGB转换非常简单。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

YUV或YCrCb可能适合,因为UV或CrCb尺寸可以被视为&#34;直角&#34;

如果您的某个尺寸像色调那样环绕,则为HSL / HSV。

答案 4 :(得分:0)

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