如何在C ++中创建伪彩色图像?

时间:2010-10-05 13:17:47

标签: c++

我有一个像素数组,它有一个相关的强度(作为一个介于0和1之间的浮点数),我想将其转换为RGB图像。

最简单的方法是将每个值乘以255并将其分配给R + G + B以获得灰度图像,但我认为最好使用一系列颜色来显示更精细的差异。< / p>

据我所知,这称为伪/假彩色图像,但我很难找到算法。现在我正在使用这段代码,但我想知道是否有更聪明/更快的方法:

 if(intensity <= 0.25) {
  p->r = 0;
  p->g = 0;
  p->b = (intensity) * 4 * 255;
  return;
 }

 if(intensity <= 0.5) {
  p->r = 0;
  p->g = (intensity - 0.25) * 4 * 255;
  p->b = 255;
  return;
 }

 if(intensity <= 0.75) {
  p->r = 0;
  p->g = 255;
  p->b = (0.75 - intensity) * 4 * 255;
  return;
 }

 if(intensity <= 1.0) {
  p->r = (intensity - 0.75) * 4 * 255;
  p->g = (1.0 - intensity) * 4 * 255;
  p->b = 0;
  return;
 }

此外,我应该使用任何标准调色板吗?

2 个答案:

答案 0 :(得分:3)

您可以改用 HSV或HSL

尝试使用0到1的值来设置Hue并使用常量来表示饱和度和值。您将找到大量用于将HSV值转换为RGB值的示例代码。

http://en.wikipedia.org/wiki/HSL_and_HSV

当您看到“人工色彩”图像时,通常会使用此图像。好处是图像的所有区域都是明亮的,图像的“暗”部分只是出现不同的颜色。

如果你使用HSL,你也可以在0-1范围的大部分时间内将亮度设置为50%,但允许它在接近结束时上升(例如从0.9到1),这将有助于带来非常强烈的你的图像部分白色。

另一种选择是使用 False调色板。在这里,您只需创建一个8位图像,并为其创建适合您需要的调色板。这些here...

有一些很好的例子

答案 1 :(得分:0)

定义一组RGB值及其对应的强度。图像中的每个强度都位于这两个点之间 - 您可以乘以常量并截断,然后在数组中查找它们。获得两个RGB值后,根据图像强度与两个端点强度之间的距离在它们之间进行插值。