PICCANTE  0.4
The hottest HDR imaging library!
filter_bilateral_2dg.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_GL_FILTERING_FILTER_BILATERAL_2DG_HPP
19 #define PIC_GL_FILTERING_FILTER_BILATERAL_2DG_HPP
20 
21 #include "../../base.hpp"
22 
23 #include "../../gl/filtering/filter.hpp"
24 #include "../../gl/filtering/filter_slicer.hpp"
25 #include "../../gl/filtering/filter_scatter.hpp"
26 #include "../../gl/filtering/filter_gaussian_3d.hpp"
27 
28 namespace pic {
29 
34 {
35 protected:
36  float sigma_s, sigma_r, s_S, s_R;
37 
41 
42 public:
44 
52  FilterGLBilateral2DG(float sigma_s, float sigma_r);
53 
60  ImageGL *Process(ImageGLVec imgIn, ImageGL *imgOut);
61 
69  static ImageGL *execute(ImageGL *imgIn, float sigma_s, float sigma_r)
70  {
72  GLuint testTQ1 = glBeginTimeQuery();
73  ImageGL *imgOut = filter->Process(SingleGL(imgIn), NULL);
74  GLuint64EXT timeVal = glEndTimeQuery(testTQ1);
75 
76  printf("Bilateral 2DG Filter on GPU time: %f ms\n",
77  double(timeVal) / 1000000.0);
78 
79  return imgOut;
80  }
81 
82  static ImageGL *execute(std::string nameIn, std::string nameOut,
83  float sigma_s, float sigma_r, int testing = 1)
84  {
85  Image tmp_imgIn(nameIn);
86  float maxVal = tmp_imgIn.getMaxVal()[0];
87  tmp_imgIn /= maxVal;
88  sigma_r = sigma_r / maxVal;
89 
90  ImageGL imgIn(&tmp_imgIn, true);
91  imgIn.generateTextureGL();
92 
93  FilterGLBilateral2DG *filter = new FilterGLBilateral2DG(sigma_s, sigma_r);//, imgIn.channels);
94 
95  ImageGL *imgOut = new ImageGL(1, imgIn.width, imgIn.height, 4,
96  IMG_GPU_CPU, GL_TEXTURE_2D);
97 
98  GLuint testTQ1;
99 
100  if(testing > 1) {
101  filter->Process(SingleGL(&imgIn), imgOut);
102 
103  testTQ1 = glBeginTimeQuery();
104 
105  for(int i = 0; i < testing; i++) {
106  filter->Process(SingleGL(&imgIn), imgOut);
107  }
108  } else {
109  testTQ1 = glBeginTimeQuery();
110  filter->Process(SingleGL(&imgIn), imgOut);
111  }
112 
113  // GLuint64EXT timeVal = glEndTimeQuery(testTQ1);
114 
115  // double ms = double(timeVal) / (double(testing) * 1000000.0);
116  // printf("Bilateral Grid on the GPU time: %g ms\n", ms);
117 
118  std::string sign = genBilString("G", sigma_s, sigma_r);
119 
120  /*
121  std::string nameTime = FileLister::FileNumber(sign, "txt");
122 
123  FILE *file = fopen(nameTime.c_str(), "w");
124 
125  if(file != NULL) {
126  fprintf(file, "%f", ms);
127  fclose(file);
128  }*/
129 
130  //Read from the GPU
131  *imgOut /= maxVal;
132  imgOut->loadToMemory();
133  imgOut->Write(nameOut);
134 
135  return imgOut;
136  }
137 };
138 
140 {
141  this->sigma_s = sigma_s;
142  this->sigma_r = sigma_r;
143 
144  s_S = 1.0f / sigma_s; //Spatial Sampling rate
145  s_R = 1.0f / sigma_r; //Range Sampling rate
146 
147  gridGL = NULL;
148  gridBlurGL = NULL;
149 
150  scatter = NULL;
151  gauss3D = new FilterGLGaussian3D(1.0f);
152  slicer = new FilterGLSlicer(s_S, s_R);
153 }
154 
156  ImageGL *imgOut)
157 {
158  if(imgIn[0] == NULL || imgIn.size() > 1) {
159  return imgOut;
160  }
161 
162  if(imgOut == NULL) {
163  imgOut = imgIn[0]->allocateSimilarOneGL();
164  }
165 
166  if(scatter == NULL) {
167  scatter = new FilterGLScatter(s_S, s_R, imgIn[0]->width, imgIn[0]->height);
168  }
169 
170  //splat
171  gridGL = scatter->Process(imgIn, gridGL);
172 
173  //blur
175 
176  //slice
177  imgOut = slicer->Process(DoubleGL(imgIn[0], gridBlurGL), imgOut);
178 
179  return imgOut;
180 }
181 
182 } // end namespace pic
183 
184 #endif /* PIC_GL_FILTERING_FILTER_BILATERAL_2DG_HPP */
185 
The FilterGLScatter class implement the bilateral grid approximation of the bilateral filter...
Definition: filter_scatter.hpp:32
Definition: image.hpp:37
The FilterGLBilateral2DG class.
Definition: filter_bilateral_2dg.hpp:33
The FilterGLScatter class implement the bilateral grid approximation of the bilateral filter...
Definition: display.hpp:32
GLuint generateTextureGL(GLenum target, GLenum format_type, bool mipmap)
generateTextureGL
FilterGLGaussian3D * gauss3D
Definition: filter_bilateral_2dg.hpp:39
ImageGL * allocateSimilarOneGL()
allocateSimilarOneGL
Definition: image.hpp:848
GLuint glBeginTimeQuery()
glBeginTimeQuery
Definition: timings.hpp:29
float s_S
Definition: filter_bilateral_2dg.hpp:36
static ImageGL * execute(ImageGL *imgIn, float sigma_s, float sigma_r)
execute
Definition: filter_bilateral_2dg.hpp:69
ImageGL * gridGL
Definition: filter_bilateral_2dg.hpp:40
ImageGL * Process(ImageGLVec imgIn, ImageGL *imgOut)
Process.
PIC_INLINE ImageGLVec SingleGL(ImageGL *img)
SingleGL creates a single for filters input.
Definition: image_vec.hpp:39
ImageGL * Process(ImageGLVec imgIn, ImageGL *imgOut)
Process.
Definition: filter_npasses.hpp:323
GLuint64 glEndTimeQuery(GLuint64 ret)
glEndTimeQuery
Definition: timings.hpp:46
The ImageGL class.
Definition: image.hpp:42
FilterGLSlicer * slicer
Definition: filter_bilateral_2dg.hpp:43
bool Write(std::string nameFile, LDR_type typeWrite, int writerCounter)
Write saves an Image into a file on the disk.
Definition: filter_radial_basis_function.hpp:1924
The FilterGLSlicer class.
Definition: filter_slicer.hpp:30
ImageGL * Process(ImageGLVec imgIn, ImageGL *imgOut)
Process.
float s_R
Definition: filter_bilateral_2dg.hpp:36
ImageGL * gridBlurGL
Definition: filter_bilateral_2dg.hpp:40
virtual ImageGL * Process(ImageGLVec imgIn, ImageGL *imgOut)
Process.
Definition: display.hpp:258
FilterGLBilateral2DG(float sigma_s, float sigma_r)
FilterGLBilateral2DG.
The FilterGL class.
Definition: filter.hpp:35
Definition: display.hpp:30
float sigma_s
Definition: filter_bilateral_2dg.hpp:36
FilterGLScatter * scatter
Definition: filter_bilateral_2dg.hpp:38
std::string genBilString(std::string type, float sigma_s, float sigma_r)
genBilString
Definition: string.hpp:366
The FilterGL class.
Definition: display.hpp:35
#define PIC_INLINE
Definition: base.hpp:33
The ImageGL class.
Definition: display.hpp:42
float sigma_r
Definition: filter_bilateral_2dg.hpp:36
int width
Definition: filter_radial_basis_function.hpp:80
The Image class stores an image as buffer of float.
Definition: image.hpp:60
void loadToMemory()
loadToMemory
The FilterGLSlicer class.
Definition: display.hpp:30
PIC_INLINE ImageGLVec DoubleGL(ImageGL *img1, ImageGL *img2)
DoubleGL creates a couple for filters input.
Definition: image_vec.hpp:52
Definition: bilateral_separation.hpp:25
std::vector< ImageGL * > ImageGLVec
ImageGLVec an std::vector of pic::ImageGL.
Definition: display.hpp:32
Definition: filter_gaussian_3d.hpp:30
float * getMaxVal(BBox *box, float *ret)
getMaxVal computes the maximum value for the current Image.
static ImageGL * execute(std::string nameIn, std::string nameOut, float sigma_s, float sigma_r, int testing=1)
Definition: filter_bilateral_2dg.hpp:82
std::vector< ImageGL * > ImageGLVec
ImageGLVec an std::vector of pic::ImageGL.
Definition: image_vec.hpp:32
int height
Definition: filter_radial_basis_function.hpp:80