我正在用C / C ++移植一段MATLAB代码,我需要将图中的许多RGB颜色映射到整数区间。
设[-1; 1]是函数可以有一个值的区间,我需要将-1和它下面的任何数字映射到一个颜色,+ 1和它上面的任何数字到另一个颜色,任何数字之间的数字-1和+1到边界之间的另一种颜色。显然数字是无限的,所以我不会担心我要绘制多少颜色,但如果我能在其中映射至少40-50种颜色,那就太棒了。
我想将[-1; 1]区间细分为X个子区间,并将它们中的每一个映射为RGB颜色,但这听起来非常枯燥乏味。
还有其他方法可以达到这个目的吗?如果没有,我应该如何在C / C ++中做到这一点?
答案 0 :(得分:5)
如果性能不是问题,那么我会做一些类似于高性能标记建议的事情,除非可以在HSV color space中进行:将S和V值固定在最大值并且线性地改变H值特定范围:
s = 1.0; v = 1.0;
if(x <= -1){h = h_min;}
else if(x >= 1){h = h_max;}
else {h = h_min + (h_max - h_min)*0.5*(x + 1.0);}
// then convert h, s, v back to r, g, b - see the wikipedia link
如果性能存在问题(例如,您尝试实时处理视频或其他内容),请提前计算rgb值并将其作为数组从文件加载。然后只需将x
的值映射到索引:
int r, g, b;
int R[NUM_COLORS];
int G[NUM_COLORS];
int B[NUM_COLORS];
// load R, G, B from a file, or define them in a header file, etc
unsigned int i = 0.5*(x + 1.0);
i = MIN(NUM_COLORS-1, i);
r = R[i]; g = G[i]; b = B[i];
答案 1 :(得分:0)
这是一个糟糕的解决方案。定义一个函数,它接受一个输入x,它是一个浮点数(或双精度数)并返回一个整数的三元组,每个整数在0-255范围内。当然,这个三元组是RGB颜色的规格。
该功能有3件;
if x<=-1 f[x] = {0,0,0}
if x>= 1 f[x] = {255,255,255}
if -1<x<1 f[x] = {floor(((x + 1)/2)*255),floor(((x + 1)/2)*255),floor(((x + 1)/2)*255)}
我不擅长编写C ++,所以我将其作为伪代码保留,你不应该把它变成有效的代码。
它不是一个非常好的功能的原因是在这个通过RGB颜色空间绘制的值之间没有自然的颜色渐变。我的意思是,这可能产生一系列颜色,这与大多数人对颜色应该如何变化的期望不一致。如果您是其中一个人,我邀请您根据需要修改该功能。
对于所有这些我责备RGB色彩空间,它不适合这种“相邻”颜色的简单计算。