如何生成假调色板

信息处理 颜色 增强 转换
2022-01-26 23:05:20

如何将灰度强度输入转换为如下图所示?

在此处输入图像描述

似乎没有响应(0,黑色)转换为深蓝色,然后通过其他颜色变为红色。

这些颜色是如何产生的?这些是否有任何标准的灰度到 RGB 转换功能?

我尝试在 CIE-LCH 模型中将强度表示为色调,然后通过 CIE-Lab 转换为 RGB。但结果不如这些 MRI 和 PET 扫描好。

另一种方法可能是彩虹,即从高频(紫蓝色)到低频(深红色)。但是有这个转换公式吗?

4个回答

您正在寻找的是一张彩色地图顾名思义,此过程基于某种映射将预定范围内的输入(单分量或灰度)值映射到某种其他颜色。我见过的实现通常在允许的输入范围内指定的多个控制点之间使用线性 RGB 插值。您展示的图像中使用的颜色图非常常见,从深蓝色开始,然后是青色、绿色、黄色、橙色,最后以红色结束。jet它在 MATLAB中称为颜色图。

因此,例如,对于范围内的输入强度,您可能有一个 RGB 查找表:[0,1]

0.0  -> (0, 0, 128)    (dark blue)
0.25 -> (0, 255, 0)    (green)
0.5  -> (255, 255, 0)  (yellow)
0.75 -> (255, 128, 0)  (orange)
1.0  -> (255, 0, 0)    (red)

然后,如果您想将值映射到颜色,那么您将在前两个数据点之间进行线性插值,如下所示:0.2

color = 1 / 5 * (0, 0, 128) / 0.25 + 4 / 5 * (0, 255, 0)
      = (0, 204, 26)

这将产生绿色青色,因为它接近绿色控制点。

除了@Jason R的回答,这里还有一些有用的链接来构建调色板:

http://blog.visual.ly/building-effective-color-scales/

很多调色板:

http://docs.idldev.com/mglib/vis/color/cptcity_catalog.html

一种可能性是将灰度范围线性映射到 0-360°(可能带有偏移),并从 HLS 转换为 RGB,具有最大的亮度和饱和度。

在此处输入图像描述

类来翻译 [0, 1 ] 之间显示的示例

//Color Gradient [0, 1] => Result (R, G, B) R, G, B [0, 1]
void GradientCor::set_value (double y, int y_min, int y_max) 
{
    /* 
      y = mx+b
      x -> y
      -0 -> -80
       1 -> 120
      m = dy/dx= 120 - (-80) = 200; b = y + mx = -80; x = (y-b)/m 
    */
    valor = (y-y_min)/(y_max - y_min);
}
    /*  
    0.0  -> (0, 0, 128)    (dark blue)
    0.25 -> (0, 255, 0)    (green)
    0.5  -> (255, 255, 0)  (yellow)
    0.75 -> (255, 128, 0)  (orange)
    1.0  -> (255, 0, 0)    (red) 
    x -> y para (dark blue) 
    0 -> 128
    0.25 -> 0
    m = dy/dx= 1020; b = y + mx = 128; y = mx+b
    result = y/255
    */
double GradientCor::get_R()
{
    if (valor <= 0.25)
        return 0; 
    else if (valor <= 0.5)
        return(double)(1020*valor - 255)/255;
    else return 1; 
}

double GradientCor::get_G()
{
    if (valor <= 0.25)
        return(double)(1020*valor)/255;
    else if (valor <= 0.5)
        return 1;
    else
        return(double)(-510*valor + 510)/255;
}

double GradientCor::get_B()
{
    if (valor <= 0.25)
        return (double)(-512*valor + 128)/255;
    else return 0;
}