将值[0.0-1.0]映射到颜色增益

3
我需要将从0.0到1.0的值转换成它们的颜色表示(每个值都是一个像素)。我正在制作一个频谱图,因此,值越高,像素就越亮(如下图所示)。
我该如何做?我正在使用C#工作,但通用解决方案也可以。
示例:

你想让它看起来像这样吗?如果你只想要红色,只需使用 red = 255*value - Serdalis
不需要像上面的例子那样,我只想将其转换为颜色表示 - 但不仅仅是一种颜色(例如红色)。 - c0dehunter
1
你可以使用以下代码实现红、黄和绿色的颜色值:R = value*255, G = 255-R, B = 0 - Serdalis
2
创建一个数组,例如100个值 - 每个值0.01对应您输入的值(例如0.45将变成colors[45]),然后将像素更改为该数组中的颜色。 - MarcinJuraszek
2个回答

7

这个答案不仅会告诉你如何从一个浮点数值创建颜色,而且输出的结果应该与所示的强度比例尺相当吻合。

private float LinearStep(float x, float start, float width = 0.2f)
{
    if (x < start)
        return 0f;
    else if (x > start+width)
        return 1;
    else
        return (x-start) / width;
}

private float GetRedValue(float intensity)
{
    return LinearStep(intensity, 0.2f);
}

private float GetGreenValue(float intensity)
{
    return LinearStep(intensity, 0.6f);
}

private float GetBlueValue(float intensity)
{
    return LinearStep(intensity, 0f)
    - LinearStep(intensity, 0.4f)
    + LinearStep(intensity, 0.8f);
}

private Color getColor(float intensity)
{
    return Color.FromArgb(255,
        (int)(255*GetRedValue(intensity)),
        (int)(255*GetGreenValue(intensity)),
        (int)(255*GetBlueValue(intensity))
    );
}

我在notepad++中完成了这个操作,所以没有经过测试。但是你应该能理解这个想法 ;-)
当然,你可以使用它来创建查找表。这完全取决于你 ;-)
由于我无法将此图像放入评论中,因此以下是如何获得此解决方案的过程: figure 1
  1. 识别“纯”颜色。我的意思是调色板中每个组件都是255或零的颜色。
  2. 绘制虚线。您知道这些点的RGB值。
  3. 进行线性插值。
第3步由代码中的LinearStep()函数完成,每个斜率调用一次。升序斜率添加,降序斜率减去。如果您对此不确定,请尝试使用原始颜色地图进行此操作。希望你可以从这里开始 :-)

这个很好用,没有任何修改 :) 我应该如何调整浮点数以获得这个比例尺 - c0dehunter
1
看我的编辑,我详细说明了答案背后的思考过程 :-) - DasKrümelmonster

1
你所看到的是伪彩色或假彩色的使用。根据应用领域,不同的调色板 tend to be used,你展示的那个看起来很像热成像中常用的一个,但也有几个其他的可能更适合你的使用领域。构建这样的调色板要比仅仅通过循环rgb组件复杂一些。
当我使用假彩色图像时,我们使用查找表,因为它是(现在也可能是)远远最快的获取与输入值相对应的颜色的方法。你展示的那个似乎有256个不同的值(这并不奇怪),因此包含256个颜色值的数组将是你需要的所有查找表。我个人建议编写一个小程序,通过从你喜欢的颜色刻度读取像素来构造一些源代码,并在你的主程序中使用它。可能还会有可供使用的源代码或颜色刻度信息,也许关键词热成像和伪彩色/假彩色可以帮助你搜索。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接