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

时间:2013-04-07 21:47:28

标签: c# colors pixel spectrogram

我需要将0.0到1.0的值转换为它们的颜色表示(每个值都是一个像素)。我正在制作一个频谱图,因此像素应该是最亮的值(如下图所示)。

我该怎么做?我在C#工作,但普遍适用的解决方案也很好。

示例:

enter image description here

2 个答案:

答案 0 :(得分:5)

这个答案不仅应该向您展示如何从单个浮点值创建颜色,而且输出应该非常类似于显示的强度标度。

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))
    );
}

我在记事本++中这样做了,所以没有经过测试。但你应该明白这一点; - )

当然,您可以使用它来创建查找表。这完全取决于你; - )


由于我无法将此图片放在评论中,以下是如何获得此解决方案的过程: figure 1

  1. 识别“纯”颜色。我的意思是8色调色板中的每个组件都是255或零。
  2. 画出虚线。你知道这些点的rgb值。
  3. 线性插值。
  4. 步骤3由代码中的LinearStep()函数完成,每个斜率调用一次。增加上升斜率,减去下降斜率。如果您对此不确定,请尝试使用原始颜色映射。我希望你能从这里拿走它: - )

答案 1 :(得分:1)

你在这里看到的是使用伪彩色或假彩色。根据应用领域的不同,palettes倾向于使用,您展示的那个看起来很像thermography中常用的那个,但还有其他几个可能更适合您的使用领域。而顺便说一句,这种调色板的构造比仅循环通过rgb组件要复杂得多。

当我使用假彩色图像时,我们使用了查找表,因为它是(并且可能是)迄今为止获得与输入值对应的颜色的最快方法。你展示的那个似乎有256个不同的值(这并不奇怪),所以你需要一个包含256个颜色值的数组作为查找表。就个人而言,我建议编写一个小程序,通过读取您喜欢的色标中的像素来构建一些源代码,并在主程序中使用它。可能还准备好使用源代码或色标信息,也许关键词thermography和pseudocolor / false color可以帮助您进行搜索。