将颜色映射到间隔
Mapping colors to an interval
我正在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颜色空间,它不适合这种简单的"相邻"颜色计算。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 将函数类成员映射到类本身内部
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 使用std::函数映射对象方法
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++映射分割错误(核心转储)
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 内联映射初始化的动态atexit析构函数崩溃
- 使用"std::unordereded_map"映射到"std::list"对象
- 在 OpenGL 中将深度映射到颜色
- RGB颜色映射为归一化值
- 将OpenCV中的像素颜色映射到预定的颜色列表中
- Kinect v2 将颜色坐标映射到相机空间
- 将颜色映射到间隔
- 实时颜色映射从c++数组
- C++:有没有一种简单的方法可以将十六进制颜色"0xff2a2620""映射到更具可读性的字符串"lovelyBrown"?
- 在C/ c++中访问X11颜色映射的标准方法是什么?
- BGL depth_first_search错误与颜色映射