2010-10-05 113 views
1

我有一个像素数组与我想要转换为RGB图像相关联的强度(作为0和1之间的浮点数)。如何在C++中创建伪彩色图像?

最简单的方法是将每个值乘以255,并将其赋值给R + G + B以获得灰度图像,但我认为使用整个颜色范围来显示更细微的差异会更好。

据我所知,这被称为伪/彩色图像,但我很难找到它的算法。现在,我使用此代码,但我想知道是否有一个更聪明的/更快的方式做到这一点:

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

此外,是否有任何标准的调色板,我应该为这个使用?

+0

那么那些应该可能是别的如果是,一件事...... – FrustratedWithFormsDesigner 2010-10-05 13:23:07

+1

我在ifs中使用return,所以应该使它们变得没有必要。 – Nils 2010-10-05 13:39:35

+0

噢,没关系。没有真正习惯于这种编码stlye。 – FrustratedWithFormsDesigner 2010-10-05 13:53:10

回答

3

您可以改为使用HSV或HSL

尝试使用0到1的值设置色调,并使用饱和度和值的常量。您会发现很多示例代码可将您的HSV值转换为RGB值。

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

当你看到一个“人工色素”的形象,这往往是使用什么。好处是图像的所有区域都很亮,图像的“黑暗”部分只是呈现出不同的颜色。

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

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

+0

我想这会工作,如果OP的“强度”被用于三个值中的任何一个,只要其他两个保持不变。 – FrustratedWithFormsDesigner 2010-10-05 13:37:06

+0

是的,但是将它固定在色调上会创造一个五光十色的图像,各个层次的亮度都很清晰。您也只能将色相范围的一部分映射到0-1范围,因此您可以创建一个图像,通过红色从冷蓝色变为热黄色。 – 2010-10-05 13:40:55

+0

我尝试过创建一个HSL/HSV,这似乎工作得很好,谢谢!一个错误的调色板会更好,但是我在实现时遇到了一些麻烦 - 实际上是否有一些聪明的方法可以做到这一点(作为我的强度的函数)还是实际上必须对所有颜色进行硬编码? – Nils 2010-10-06 19:29:13

0

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