将颜色映射到间隔

Mapping colors to an interval

本文关键字:色映射 颜色      更新时间:2023-10-16

我正在C/C++中移植一段MATLAB代码,我需要将图中的许多RGB颜色映射到一个整数区间。

设[-1;1]是函数可以具有值的区间,我需要将-1和它下面的任何数字映射到一种颜色,将+1和它上面的任意数字映射到另一种颜色。很明显,数字是无限的,所以我不担心我要映射多少种颜色,但如果我能在其中映射至少40-50种颜色,那就太好了。

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

还有其他方法可以做到这一点吗?如果没有,我应该如何在C/C++中做到这一点?

如果性能不是问题,那么我会做一些类似于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];

这是一个糟糕的解决方案。定义一个函数,它接受一个输入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颜色空间,它不适合这种简单的"相邻"颜色计算。