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 }
mrpt::min3
const T min3(const T &A, const T &B, const T &C)
Definition: core/include/mrpt/core/bits_math.h:124
mrpt::img::TColormap
TColormap
Different colormaps for use in mrpt::img::colormap()
Definition: color_maps.h:31
mrpt::max3
const T max3(const T &A, const T &B, const T &C)
Definition: core/include/mrpt/core/bits_math.h:129
mrpt::img::colormap
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
color_maps.h
mrpt::math::interpolate
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
mrpt::img::cmHOT
@ cmHOT
[New in MRPT 1.5.0]
Definition: color_maps.h:37
interp_fit.hpp
mrpt::img::TColorf::asTColor
TColor asTColor() const
Returns the 0-255 integer version of this color: RGBA_u8
Definition: TColor.h:101
mrpt
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
Definition: BaseAppDataSource.h:16
THROW_EXCEPTION
#define THROW_EXCEPTION(msg)
Definition: exceptions.h:67
mrpt::img::hot2rgb
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
mrpt::img::jet2rgb
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
mrpt::img
Definition: CCanvas.h:17
MRPT_START
#define MRPT_START
Definition: exceptions.h:241
mrpt::img::TColorf
An RGBA color - floats in the range [0,1].
Definition: TColor.h:89
mrpt::img::hsv2rgb
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
mrpt::img::TColor
A RGB color - 8bit.
Definition: TColor.h:26
mrpt::img::rgb2hsv
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
img-precomp.h
mrpt::img::cmGRAYSCALE
@ cmGRAYSCALE
Definition: color_maps.h:34
MRPT_END
#define MRPT_END
Definition: exceptions.h:245
mrpt::img::cmJET
@ cmJET
Definition: color_maps.h:35



Page generated by Doxygen 1.8.18 for MRPT 2.0.4 at Thu Sep 24 07:14:18 UTC 2020