我需要将0.0到1.0的值转换为它们的颜色表示(每个值都是一个像素)。我正在制作一个频谱图,因此像素应该是最亮的值(如下图所示)。
我该怎么做?我在C#工作,但普遍适用的解决方案也很好。
示例:
答案 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))
);
}
我在记事本++中这样做了,所以没有经过测试。但你应该明白这一点; - )
当然,您可以使用它来创建查找表。这完全取决于你; - )
由于我无法将此图片放在评论中,以下是如何获得此解决方案的过程:
步骤3由代码中的LinearStep()函数完成,每个斜率调用一次。增加上升斜率,减去下降斜率。如果您对此不确定,请尝试使用原始颜色映射。我希望你能从这里拿走它: - )
答案 1 :(得分:1)
你在这里看到的是使用伪彩色或假彩色。根据应用领域的不同,palettes倾向于使用,您展示的那个看起来很像thermography中常用的那个,但还有其他几个可能更适合您的使用领域。而顺便说一句,这种调色板的构造比仅循环通过rgb组件要复杂得多。
当我使用假彩色图像时,我们使用了查找表,因为它是(并且可能是)迄今为止获得与输入值对应的颜色的最快方法。你展示的那个似乎有256个不同的值(这并不奇怪),所以你需要一个包含256个颜色值的数组作为查找表。就个人而言,我建议编写一个小程序,通过读取您喜欢的色标中的像素来构建一些源代码,并在主程序中使用它。可能还准备好使用源代码或色标信息,也许关键词thermography和pseudocolor / false color可以帮助您进行搜索。