我有一个函数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值明显可以吗?
更新:我正在寻找如何生成右侧的色度调色板:
答案 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)
答案 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