给了我一个本质上是图像的数据集,但是图像中的每个像素都表示为-1到1(含)之间的值。我正在编写一个应用程序,该应用程序需要采用这些-1到1的灰度值,并将它们映射到MATLAB“Jet”色标(红-绿-蓝颜色渐变)的关联RGB值。
我很好奇是否有人知道如何采用线性值(如-1到1)并将其映射到此比例。请注意,我实际上并没有使用MATLAB(也不能),我只需要获取灰度值并将其放在Jet渐变中即可。
谢谢,
亚当
最佳答案
我希望这是您要寻找的:
double interpolate( double val, double y0, double x0, double y1, double x1 ) {
return (val-x0)*(y1-y0)/(x1-x0) + y0;
}
double blue( double grayscale ) {
if ( grayscale < -0.33 ) return 1.0;
else if ( grayscale < 0.33 ) return interpolate( grayscale, 1.0, -0.33, 0.0, 0.33 );
else return 0.0;
}
double green( double grayscale ) {
if ( grayscale < -1.0 ) return 0.0; // unexpected grayscale value
if ( grayscale < -0.33 ) return interpolate( grayscale, 0.0, -1.0, 1.0, -0.33 );
else if ( grayscale < 0.33 ) return 1.0;
else if ( grayscale <= 1.0 ) return interpolate( grayscale, 1.0, 0.33, 0.0, 1.0 );
else return 1.0; // unexpected grayscale value
}
double red( double grayscale ) {
if ( grayscale < -0.33 ) return 0.0;
else if ( grayscale < 0.33 ) return interpolate( grayscale, 0.0, -0.33, 1.0, 0.33 );
else return 1.0;
}
我不确定此比例尺是否与您链接的图像100%相同,但看起来应该非常相似。
更新
我根据找到的here的MatLab Jet调色板的描述重写了代码
double interpolate( double val, double y0, double x0, double y1, double x1 ) {
return (val-x0)*(y1-y0)/(x1-x0) + y0;
}
double base( double val ) {
if ( val <= -0.75 ) return 0;
else if ( val <= -0.25 ) return interpolate( val, 0.0, -0.75, 1.0, -0.25 );
else if ( val <= 0.25 ) return 1.0;
else if ( val <= 0.75 ) return interpolate( val, 1.0, 0.25, 0.0, 0.75 );
else return 0.0;
}
double red( double gray ) {
return base( gray - 0.5 );
}
double green( double gray ) {
return base( gray );
}
double blue( double gray ) {
return base( gray + 0.5 );
}
关于c++ - 灰度到红绿蓝(MATLAB Jet)色标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7706339/