作为颜色表示的值

时间:2011-08-24 21:10:48

标签: algorithm colors rgb

将值转换为颜色是众所周知的,我确实理解以下两种方法(在changing rgb color values to represent a value中有很好的描述)

  1. 值为灰色阴影
  2. Value as brightness of a base colour(例如brightness of blue
  3. 但是当我想使用全色范围(“所有颜色”)时,最佳算法是什么。当我使用8位RGB值的“灰度”时,我实际上有256种阴影(白色到黑色)的表示。但如果我使用整个范围,我可以使用更多的阴影。像this这样的东西。这也更容易识别。

    基本上我需要Javascript中的算法,但我想所有的代码,如C#,Java,伪代码都可以。底部的图例显示了编码,我正在为此寻找算法。

    因此有一系列值(例如1-1000),我可以将1表示为白色,将1000表示为黑色,但我也可以将1表示为黄色,将1000表示为蓝色。但是有一个标准算法吗?查看示例here,显示它们使用颜色间隔。我不仅想要使用灰色或改变亮度,还要使用所有颜色。

    这是visual demonstration(需要Flash)。给定颜色方案中表示的值,我的目标是计算颜色。

    我确实有一个线性颜色范围,例如从1-30000

    - 更新 -

    Here我发现这里叫做LabSpace:

      

    实验室空间是一种表示颜色的方式,其中彼此接近的点是那些看起来与人类相似的点。

    所以我需要的是一个算法来表示这个实验室空间中的线性值。

4 个答案:

答案 0 :(得分:1)

这取决于数据集的用途 例如,您可以通过更改范围内的亮度为每个值范围(0-100 - 红色,100-200 - 绿色,200-300 - 蓝色)指定颜色。

答案 1 :(得分:1)

垒,

您提供的示例不会创建渐变。相反,他们使用阵列中的N种预设颜色,并按照umbr指出的那样选择下一种颜色。像这样:

a = { "#ffffff", "#ff00ff", "#ff0000", "#888888", ... };
c = a[pos / 1000];

pos是你的值从1到30,000,c是你想要使用的颜色。 (你需要更好地定义索引而不是pos / 1000,以便在所有情况下都能正常工作。)

如果你想要一个渐变效果,你可以使用你指出的另一个答案所示的简单数学,虽然如果你想用任意数量的点来做,那就必须用三角形来完成。你需要做很多工作来确定三角形并正确定义每个点。

在JavaScript中,它会变慢。 (使用OpenGL它将是瞬时的,你甚至不必计算渐变,这将“比实时更快。”

答案 2 :(得分:1)

指定颜色有两种基本方法。一个是预定义的颜色列表(调色板),然后您的颜色值是此列表的索引。这是8位彩色系统的工作原理,以及GIF图像的工作原理。有一些Web安全颜色列表,例如http://en.wikipedia.org/wiki/Web_colors,通常适合8位值。通常相似的颜色是相邻的,但有时不相似。 调色板的优点是每个像素需要少量数据,但缺点是您可以同时在屏幕上显示不同颜色的数量。

另一种基本方法是指定颜色的坐标。一种方法是RGB,每种原色都有一个单独的值。另一种是色相/饱和度/亮度。 CMYK(青色,洋红色,黄色,有时是黑色)用于印刷。这通常被称为真彩色,当你使用像“所有颜色”这样的短语时,听起来你正在寻找像这样的解决方案。对于渐变而言,HSL可能非常适合您。例如,从颜色到灰色的渐变只会降低饱和度值。如果你想要的只是“纯”颜色,那么修正饱和度和亮度值并改变色调。 几乎所有的绘图系统都需要RGB,但从HSL到RGB的转换是直截了当的。 http://en.wikipedia.org/wiki/HSL_and_HSV

如果不能保留每种颜色的全部24位(每种颜色8位,32位颜色相同但添加透明通道),则可以使用15或16位颜色。它是相同的,但每种颜色不是8位,而是每次5(15位)或5-6-5(16位,绿色得到额外的位,因为我们的眼睛对绿色阴影更敏感)。这适合一个短整数。

答案 3 :(得分:1)

您需要的是传递功能 给定一个浮点数,传递函数可以生成一种颜色。

看到这个:

http://http.developer.nvidia.com/GPUGems/gpugems_ch39.html

和此:

http://graphicsrunner.blogspot.com/2009/01/volume-rendering-102-transfer-functions.html

第二篇文章说,isovalue介于[0,255]之间。但它不必在那个范围内。

通常,我们将任何浮点数缩放到[0,1]范围,并应用传递函数来获取颜色值。