PICCANTE  0.4
The hottest HDR imaging library!
filter_color_conv.hpp
Go to the documentation of this file.
1 /*
2 
3 PICCANTE
4 The hottest HDR imaging library!
5 http://vcg.isti.cnr.it/piccante
6 
7 Copyright (C) 2014
8 Visual Computing Laboratory - ISTI CNR
9 http://vcg.isti.cnr.it
10 First author: Francesco Banterle
11 
12 This Source Code Form is subject to the terms of the Mozilla Public
13 License, v. 2.0. If a copy of the MPL was not distributed with this
14 file, You can obtain one at http://mozilla.org/MPL/2.0/.
15 
16 */
17 
18 #ifndef PIC_FILTERING_FILTER_COLOR_CONV_HPP
19 #define PIC_FILTERING_FILTER_COLOR_CONV_HPP
20 
21 #include "../filtering/filter.hpp"
22 #include "../colors/color_conv.hpp"
23 #include "../colors/color_conv_rgb_to_xyz.hpp"
24 #include "../colors/color_conv_xyz_to_logluv.hpp"
25 #include "../colors/color_conv_xyz_to_cielab.hpp"
26 
27 namespace pic {
28 
30 {
32  bool bDirection;
33 };
34 
38 class FilterColorConv: public Filter
39 {
40 protected:
41  std::vector<ColorConvTransform> list;
42  bool bDirection;
43  unsigned int n;
44  bool bEven;
45 
52  void ProcessBBox(Image *dst, ImageVec src, BBox *box)
53  {
54  if(n < 1) {
55  return;
56  }
57 
58  int channels = src[0]->channels;
59 
60  float *tmpCol = new float [channels];
61  float *tmp[2];
62 
63  tmp[1] = tmpCol;
64 
65  for(int j = box->y0; j < box->y1; j++) {
66 
67  for(int i = box->x0; i < box->x1; i++) {
68 
69  float *dataIn = (*src[0])(i, j);
70  float *dataOut = (*dst) (i, j);
71 
72  if(bEven) {
73  tmp[1] = dataOut;
74  tmp[0] = tmpCol;
75  } else {
76  tmp[0] = dataOut;
77  tmp[1] = tmpCol;
78  }
79 
80  if(bDirection) { //direct color transform
81  list[0].f->transform(dataIn, tmp[0], list[0].bDirection);
82  for(unsigned int k = 1; k < n; k++) {
83  list[k].f->transform(tmp[(k + 1) % 2], tmp[k % 2], list[k].bDirection);
84  }
85  } else { //inverse color transform
86  list[n - 1].f->transform(dataIn, tmp[0], !list[n - 1].bDirection);
87  for(unsigned int k = 1; k < n; k++) {
88  list[n - k - 1].f->transform(tmp[(k + 1) % 2], tmp[k % 2], !list[n - k - 1].bDirection);
89  }
90  }
91  }
92  }
93 
94  delete[] tmpCol;
95  }
96 
97 public:
98 
103  {
104  this->bDirection = true;
105  n = -1;
106  }
107 
113  void insertColorConv(ColorConv *transform, bool bDirection)
114  {
115  if(transform != NULL) {
116  ColorConvTransform entry;
117  entry.f = transform;
118  entry.bDirection = bDirection;
119 
120  list.push_back(entry);
121  }
122 
123  n = int(list.size());
124  bEven = (n % 2) == 0;
125  }
126 
131  void update(bool bDirection)
132  {
133  this->bDirection = bDirection;
134  }
135 
142  static Image *fromRGBtoXYZ(Image *imgIn, Image *imgOut)
143  {
144  ColorConvRGBtoXYZ cc_from_RGB_to_XYZ;
145 
146  FilterColorConv flt;
147 
148  flt.insertColorConv(&cc_from_RGB_to_XYZ, true);
149  return flt.Process(Single(imgIn), imgOut);
150  }
151 
158  static Image *fromRGBtoCIELAB(Image *imgIn, Image *imgOut)
159  {
160  ColorConvRGBtoXYZ cc_from_RGB_to_XYZ;
161  ColorConvXYZtoCIELAB cc_from_XYZ_to_CIELAB;
162 
163  FilterColorConv flt;
164 
165  flt.insertColorConv(&cc_from_RGB_to_XYZ, true);
166  flt.insertColorConv(&cc_from_XYZ_to_CIELAB, true);
167 
168  return flt.Process(Single(imgIn), imgOut);
169  }
170 
177  static Image *fromRGBtoLogLuv(Image *imgIn, Image *imgOut)
178  {
179  ColorConvRGBtoXYZ cc_from_RGB_to_XYZ;
180  ColorConvXYZtoLogLuv cc_from_XYZ_to_LogLuv;
181 
182  FilterColorConv flt;
183 
184  flt.insertColorConv(&cc_from_RGB_to_XYZ, true);
185  flt.insertColorConv(&cc_from_XYZ_to_LogLuv, true);
186 
187  return flt.Process(Single(imgIn), imgOut);
188  }
189 
196  static Image *fromCIELABtoRGB(Image *imgIn, Image *imgOut)
197  {
198  ColorConvRGBtoXYZ cc_from_RGB_to_XYZ;
199  ColorConvXYZtoCIELAB cc_from_XYZ_to_CIELAB;
200 
201  FilterColorConv flt;
202 
203  flt.insertColorConv(&cc_from_XYZ_to_CIELAB, false);
204  flt.insertColorConv(&cc_from_RGB_to_XYZ, false);
205 
206  return flt.Process(Single(imgIn), imgOut);
207  }
208 
215  static Image *fromCIELABtoRGB2(Image *imgIn, Image *imgOut)
216  {
217  ColorConvRGBtoXYZ cc_from_RGB_to_XYZ;
218  ColorConvXYZtoCIELAB cc_from_XYZ_to_CIELAB;
219 
220  FilterColorConv flt;
221 
222  flt.insertColorConv(&cc_from_RGB_to_XYZ, true);
223  flt.insertColorConv(&cc_from_XYZ_to_CIELAB, true);
224 
225  flt.update(false);
226 
227  return flt.Process(Single(imgIn), imgOut);
228  }
229 };
230 
231 } // end namespace pic
232 
233 #endif /* PIC_FILTERING_FILTER_COLOR_CONV_HPP */
234 
void ProcessBBox(Image *dst, ImageVec src, BBox *box)
ProcessBBox.
Definition: filter_color_conv.hpp:52
The BBox class manages the creation of bounding boxes for images.
Definition: bbox.hpp:29
bool bDirection
Definition: filter_color_conv.hpp:42
static Image * fromRGBtoLogLuv(Image *imgIn, Image *imgOut)
fromRGBtoLogLuv
Definition: filter_color_conv.hpp:177
The ColorConvXYZtoCIELAB class.
Definition: color_conv_xyz_to_cielab.hpp:36
std::vector< Image * > ImageVec
ImageVec an std::vector of pic::Image.
Definition: image_vec.hpp:29
int x0
Definition: bbox.hpp:32
The Filter class.
Definition: filter.hpp:50
The ColorConvRGBtoXYZ class.
Definition: color_conv_rgb_to_xyz.hpp:38
Definition: filter_color_conv.hpp:29
virtual Image * Process(ImageVec imgIn, Image *imgOut)
Process.
Definition: filter.hpp:390
unsigned int n
Definition: filter_color_conv.hpp:43
bool bEven
Definition: filter_color_conv.hpp:44
The FilterColorConv class.
Definition: filter_color_conv.hpp:38
bool bDirection
Definition: filter_color_conv.hpp:32
static Image * fromCIELABtoRGB(Image *imgIn, Image *imgOut)
fromCIELABtoRGB
Definition: filter_color_conv.hpp:196
int y0
Definition: bbox.hpp:32
FilterColorConv()
FilterColorConv.
Definition: filter_color_conv.hpp:102
std::vector< ColorConvTransform > list
Definition: filter_color_conv.hpp:41
void insertColorConv(ColorConv *transform, bool bDirection)
insertColorConv
Definition: filter_color_conv.hpp:113
The ColorConvXYZtoLogLuv class.
Definition: color_conv_xyz_to_logluv.hpp:28
The Image class stores an image as buffer of float.
Definition: image.hpp:60
PIC_INLINE ImageVec Single(Image *img)
Single creates an std::vector which contains img; this is for filters input.
Definition: image_vec.hpp:36
void update(bool bDirection)
update
Definition: filter_color_conv.hpp:131
Definition: bilateral_separation.hpp:25
ColorConv * f
Definition: filter_color_conv.hpp:31
static Image * fromRGBtoXYZ(Image *imgIn, Image *imgOut)
fromRGBtoXYZ
Definition: filter_color_conv.hpp:142
static Image * fromCIELABtoRGB2(Image *imgIn, Image *imgOut)
fromCIELABtoRGB2
Definition: filter_color_conv.hpp:215
The ColorConv class.
Definition: color_conv.hpp:26
static Image * fromRGBtoCIELAB(Image *imgIn, Image *imgOut)
fromRGBtoCIELAB
Definition: filter_color_conv.hpp:158