将颜色映射到区间

3
我正在将一个MATLAB代码转换为C/C++,需要将图表中的许多RGB颜色映射到整数区间。

假设[-1;1]是函数可取值的区间,我需要将-1及其以下的任何数字映射到一种颜色,+1及其以上的任何数字映射到另一种颜色,在-1和+1之间的任何数字都映射到两个边界之间的另一种颜色。显然数字是无限的,所以我并不担心要映射多少种颜色,但如果能够至少映射40-50种颜色就会很好。

我想将[-1;1]区间细分为X个子区间,并将每个子区间映射到RGB颜色,但这听起来像是一项令人非常无聊和漫长的工作。

有没有其他方法来实现这一点? 如果没有,我应该如何在C/C++中实现它?

2个回答

5
如果性能不是问题,那么我会做类似于High Performance Mark提出的建议,但也许可以在HSV颜色空间中进行:将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];

2
HSV几乎是在编程中处理颜色的标准选择,而不会让人发疯。 - pmr
HSV还有一个优点,比RGB更好地模拟了我们的眼睛是如何工作的。 - Joel

0
这是一个不太好的解决方案。定义一个函数,它接受一个浮点数(或双精度浮点数)作为输入,并返回三个整数,每个整数的范围在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颜色空间,它不适合进行“相邻”颜色的简单计算。


1
这实际上会产生一个从黑到白的渐变,我认为是通过各种灰色阴影来实现的。 - Joel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接