我有一个700万浮点正值的数据集,从10 ^( - 7)到10 ^(0)。我想以“线性方式”将浮点值转换为RGB值。直到现在我使用[255-const * | log(float value)|] / 255并且它工作,但我想知道是否有一种方法来转换值而不使用对数,也许(我希望如此),如果是否有一个OpenGL库,可以利用GPU来实现这一目标。
EDIT1: 值从10 ^( - 7)到10 ^(1)。我想以最快的方式获得转换,因为我需要一个快速程序(这就是我想使用GPU的原因)。
EDIT2: 是不是有一个OpenGL函数可以通过给出max和min来扩展你的值? 我有一个带有用户界面的程序,我想在程序运行时更改“值窗口”。 我想要这样的东西 Computerized tomography
EDIT3:这对我有帮助吗? http://glm.g-truc.net/0.9.3/api/a00157.html/
EDIT4:我想在Matlab中获得类似Jet colormap的东西 http://blogs.mathworks.com/images/loren/73/colormapManip_14.png
答案 0 :(得分:2)
我想这取决于你实际拥有这些值的位置。如果你在OpenGL中生成它们,那么你可以在OpenGL中执行转换,这将很快,然后提取数据。如果您使用的是CPU内存,那么将数据移入和移出GPU内存也需要一些时间。
对于这种循环,如果您使用优化-O3进行编译,编译器通常会对代码进行向量化优化(请参阅What is "vectorization"?)。这应该适用于GCC,MSVC和其他编译器。检查编译器的特定矢量化功能。
答案 1 :(得分:1)
由于unsigned char在0到255之间,你可以这样做:
int max = max_value_from_range;
int max = min_value_from_range;
if ( max == min ) return; // avoid to divide by 0
unsigned char out [RANGE_LEN]
for( int i = 0; i < RANGE_LEN; i++ )
out[i] = 255 * ( FLOAT_INPUT[i] - min ) / ( max - min );