MRPT  2.0.4
color_maps.cpp
Go to the documentation of this file.
1 /* +------------------------------------------------------------------------+
2  | Mobile Robot Programming Toolkit (MRPT) |
3  | https://www.mrpt.org/ |
4  | |
5  | Copyright (c) 2005-2020, Individual contributors, see AUTHORS file |
6  | See: https://www.mrpt.org/Authors - All rights reserved. |
7  | Released under BSD License. See: https://www.mrpt.org/License |
8  +------------------------------------------------------------------------+ */
9 
10 #include "img-precomp.h" // Precompiled headers
11 
12 #include <mrpt/img/color_maps.h>
13 #include <Eigen/Dense>
14 #include <mrpt/math/interp_fit.hpp>
15 
16 using namespace mrpt;
17 using namespace mrpt::img;
18 using namespace std;
19 
20 /*-------------------------------------------------------------
21  hsv2rgb
22 -------------------------------------------------------------*/
23 void mrpt::img::hsv2rgb(float h, float s, float v, float& r, float& g, float& b)
24 {
25  // See: http://en.wikipedia.org/wiki/HSV_color_space
26  h = max(0.0f, min(1.0f, h));
27  s = max(0.0f, min(1.0f, s));
28  v = max(0.0f, min(1.0f, v));
29 
30  int Hi = ((int)floor(h * 6)) % 6;
31  float f = (h * 6) - Hi;
32  float p = v * (1 - s);
33  float q = v * (1 - f * s);
34  float t = v * (1 - (1 - f) * s);
35 
36  switch (Hi)
37  {
38  case 0:
39  r = v;
40  g = t;
41  b = p;
42  break;
43  case 1:
44  r = q;
45  g = v;
46  b = p;
47  break;
48  case 2:
49  r = p;
50  g = v;
51  b = t;
52  break;
53  case 3:
54  r = p;
55  g = q;
56  b = v;
57  break;
58  case 4:
59  r = t;
60  g = p;
61  b = v;
62  break;
63  case 5:
64  r = v;
65  g = p;
66  b = q;
67  break;
68  }
69 }
70 
71 /*-------------------------------------------------------------
72  rgb2hsv
73 -------------------------------------------------------------*/
74 void mrpt::img::rgb2hsv(float r, float g, float b, float& h, float& s, float& v)
75 {
76  // See: http://en.wikipedia.org/wiki/HSV_color_space
77  r = max(0.0f, min(1.0f, r));
78  g = max(0.0f, min(1.0f, g));
79  b = max(0.0f, min(1.0f, b));
80 
81  float Max = max3(r, g, b);
82  float Min = min3(r, g, b);
83 
84  if (Max == Min)
85  {
86  h = 0;
87  }
88  else
89  {
90  if (Max == r)
91  {
92  if (g >= b)
93  h = (g - b) / (6 * (Max - Min));
94  else
95  h = 1 - (g - b) / (6 * (Max - Min));
96  }
97  else if (Max == g)
98  h = 1 / 3.0f + (b - r) / (6 * (Max - Min));
99  else
100  h = 2 / 3.0f + (r - g) / (6 * (Max - Min));
101  }
102 
103  if (Max == 0)
104  s = 0;
105  else
106  s = 1 - Min / Max;
107 
108  v = Max;
109 }
110 
111 /*-------------------------------------------------------------
112  colormap
113 -------------------------------------------------------------*/
115  const TColormap& color_map, const float col_indx_in, float& r, float& g,
116  float& b)
117 {
118  MRPT_START
119 
120  const float color_index = std::min(1.0f, std::max(.0f, col_indx_in));
121 
122  switch (color_map)
123  {
124  case cmJET:
125  jet2rgb(color_index, r, g, b);
126  break;
127  case cmGRAYSCALE:
128  r = g = b = color_index;
129  break;
130  case cmHOT:
131  hot2rgb(color_index, r, g, b);
132  break;
133  default:
134  THROW_EXCEPTION("Invalid color_map");
135  };
136  MRPT_END
137 }
138 
139 /*-------------------------------------------------------------
140  jet2rgb
141 -------------------------------------------------------------*/
142 void mrpt::img::jet2rgb(const float color_index, float& r, float& g, float& b)
143 {
144  static bool jet_table_done = false;
145  static Eigen::VectorXf jet_r, jet_g, jet_b;
146 
147  // Initialize tables
148  if (!jet_table_done)
149  {
150  jet_table_done = true;
151 
152  // Refer to source code of "jet" in MATLAB:
153  float JET_R[] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
154  0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
155  0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
156  0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
157  0.0625f, 0.125f, 0.1875f, 0.250f, 0.3125f, 0.375f,
158  0.4375f, 0.5f, 0.5625f, 0.625f, 0.6875f, 0.750f,
159  0.8125f, 0.875f, 0.9375f, 1.0f, 1.0f, 1.0f,
160  1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
161  1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
162  1.0f, 1.0f, 0.9375f, 0.875f, 0.8125f, 0.750f,
163  0.6875f, 0.625f, 0.5625f, 0.500000};
164  float JET_G[] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
165  0.0f, 0.0f, 0.0625f, 0.125f, 0.1875f, 0.250f,
166  0.3125f, 0.375f, 0.4375f, 0.5f, 0.5625f, 0.625f,
167  0.6875f, 0.750f, 0.8125f, 0.875f, 0.9375f, 1.0f,
168  1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
169  1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
170  1.0f, 1.0f, 1.0f, 1.0f, 0.9375f, 0.875f,
171  0.8125f, 0.750f, 0.6875f, 0.625f, 0.5625f, 0.5f,
172  0.4375f, 0.375f, 0.3125f, 0.250f, 0.1875f, 0.125f,
173  0.0625f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
174  0.0f, 0.0f, 0.0f, 0.000000};
175  float JET_B[] = {0.5625f, 0.625f, 0.6875f, 0.750f, 0.8125f, 0.875f,
176  0.9375f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
177  1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
178  1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
179  0.9375f, 0.875f, 0.8125f, 0.750f, 0.6875f, 0.625f,
180  0.5625f, 0.5f, 0.4375f, 0.375f, 0.3125f, 0.250f,
181  0.1875f, 0.125f, 0.0625f, 0.0f, 0.0f, 0.0f,
182  0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
183  0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
184  0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
185  0.0f, 0.0f, 0.0f, 0.000000};
186  const int N = sizeof(JET_B) / sizeof(JET_B[0]);
187 
188  jet_r.resize(N);
189  jet_g.resize(N);
190  jet_b.resize(N);
191  for (int i = 0; i < N; i++)
192  {
193  jet_r[i] = JET_R[i];
194  jet_g[i] = JET_G[i];
195  jet_b[i] = JET_B[i];
196  }
197  }
198 
199  // Return interpolate value:
200  r = math::interpolate(color_index, jet_r, 0.0f, 1.0f);
201  g = math::interpolate(color_index, jet_g, 0.0f, 1.0f);
202  b = math::interpolate(color_index, jet_b, 0.0f, 1.0f);
203 }
204 
205 void mrpt::img::hot2rgb(const float color_index, float& r, float& g, float& b)
206 {
207  static bool table_done = false;
208  static Eigen::VectorXf hot_r, hot_g, hot_b;
209 
210  // Initialize tables
211  if (!table_done)
212  {
213  table_done = true;
214 
215  // Refer to source code of "hot" in MATLAB:
216  float HOT_R[] = {0.041667f, 0.0833f, 0.125f, 0.166667f, 0.2083f, 0.250f,
217  0.291667f, 0.3333f, 0.375f, 0.416667f, 0.4583f, 0.5f,
218  0.541667f, 0.5833f, 0.625f, 0.666667f, 0.7083f, 0.750f,
219  0.791667f, 0.8333f, 0.875f, 0.916667f, 0.9583f, 1.0f,
220  1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
221  1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
222  1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
223  1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
224  1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
225  1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
226  1.0f, 1.0f, 1.0f, 1.0f};
227  float HOT_G[] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
228  0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
229  0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
230  0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
231  0.041667f, 0.0833f, 0.125f, 0.166667f, 0.2083f, 0.250f,
232  0.291667f, 0.3333f, 0.375f, 0.416667f, 0.4583f, 0.5f,
233  0.541667f, 0.5833f, 0.625f, 0.666667f, 0.7083f, 0.750f,
234  0.791667f, 0.8333f, 0.875f, 0.916667f, 0.9583f, 1.0f,
235  1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
236  1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
237  1.0f, 1.0f, 1.0f, 1.0f};
238  float HOT_B[] = {
239  0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
240  0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
241  0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
242  0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
243  0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
244  0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
245  0.0625f, 0.125f, 0.1875f, 0.250f, 0.3125f, 0.375f, 0.4375f, 0.5f,
246  0.5625f, 0.625f, 0.6875f, 0.750f, 0.8125f, 0.875f, 0.9375f, 1.0f};
247  const int N = sizeof(HOT_B) / sizeof(HOT_B[0]);
248 
249  hot_r.resize(N);
250  hot_g.resize(N);
251  hot_b.resize(N);
252  for (int i = 0; i < N; i++)
253  {
254  hot_r[i] = HOT_R[i];
255  hot_g[i] = HOT_G[i];
256  hot_b[i] = HOT_B[i];
257  }
258  }
259 
260  // Return interpolate value:
261  r = math::interpolate(color_index, hot_r, 0.0f, 1.0f);
262  g = math::interpolate(color_index, hot_g, 0.0f, 1.0f);
263  b = math::interpolate(color_index, hot_b, 0.0f, 1.0f);
264 }
265 
267  const TColormap& color_map, const float color_index)
268 {
269  float r, g, b;
270  colormap(color_map, color_index, r, g, b);
271  return mrpt::img::TColorf(r, g, b).asTColor();
272 }
void colormap(const TColormap &color_map, const float color_index, float &r, float &g, float &b)
Transform a float number in the range [0,1] into RGB components.
Definition: color_maps.cpp:114
TColormap
Different colormaps for use in mrpt::img::colormap()
Definition: color_maps.h:30
#define MRPT_START
Definition: exceptions.h:241
#define THROW_EXCEPTION(msg)
Definition: exceptions.h:67
T interpolate(const T &x, const VECTOR &ys, const T &x0, const T &x1)
Interpolate a data sequence "ys" ranging from "x0" to "x1" (equally spaced), to obtain the approximat...
Definition: interp_fit.hpp:17
STL namespace.
const T min3(const T &A, const T &B, const T &C)
void hot2rgb(const float color_index, float &r, float &g, float &b)
Computes the RGB color components (range [0,1]) for the corresponding color index in the range [0...
Definition: color_maps.cpp:205
void jet2rgb(const float color_index, float &r, float &g, float &b)
Computes the RGB color components (range [0,1]) for the corresponding color index in the range [0...
Definition: color_maps.cpp:142
[New in MRPT 1.5.0]
Definition: color_maps.h:37
void rgb2hsv(float r, float g, float b, float &h, float &s, float &v)
Transform RGB color components to HSV, all of them in the range [0,1].
Definition: color_maps.cpp:74
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
void hsv2rgb(float h, float s, float v, float &r, float &g, float &b)
Transform HSV color components to RGB, all of them in the range [0,1].
Definition: color_maps.cpp:23
#define MRPT_END
Definition: exceptions.h:245
An RGBA color - floats in the range [0,1].
Definition: TColor.h:88
TColor asTColor() const
Returns the 0-255 integer version of this color: RGBA_u8.
Definition: TColor.h:101
A RGB color - 8bit.
Definition: TColor.h:25
const T max3(const T &A, const T &B, const T &C)



Page generated by Doxygen 1.8.14 for MRPT 2.0.4 Git: 33de1d0ad Sat Jun 20 11:02:42 2020 +0200 at sáb jun 20 17:35:17 CEST 2020