18 #ifndef PIC_GL_FILTERING_FILTER_BILATERAL_2DS_HPP 19 #define PIC_GL_FILTERING_FILTER_BILATERAL_2DS_HPP 21 #include "../../util/std_util.hpp" 23 #include "../../gl/filtering/filter.hpp" 24 #include "../../util/file_lister.hpp" 25 #include "../../gl/point_samplers/sampler_random_m.hpp" 152 for(
int i = 0; i < testing; i++) {
161 double ms = double(timeVal) / (double(testing) * 1000000.0);
162 printf(
"Stochastic Bilateral Filter on GPU time: %f ms\n",
ms);
167 FILE *file = fopen(nameTime.c_str(),
"w");
170 fprintf(file,
"%f",
ms);
176 imgOut->
Write(nameOut);
218 uniform sampler2D u_tex;
219 uniform isampler2D u_poisson;
220 uniform sampler2D u_rand;
221 uniform
int nSamples;
222 uniform
float sigma_s_sq_2;
223 uniform
float sigma_r_sq_2;
224 uniform
int kernelSize;
225 uniform
float kernelSizef;
229 vec3 color = vec3(0.0, 0.0, 0.0);
230 ivec2 coordsFrag = ivec2(gl_FragCoord.xy);
233 vec3 colRef = texelFetch(u_tex, coordsFrag, 0).xyz;
236 float shifter = texture(u_rand, gl_FragCoord.xy).x;
238 for(
int i = 0; i < nSamples; i++) {
240 ivec3 coords = texelFetch(u_poisson, ivec2(i, shifter), 0).xyz;
243 tmpCol = texelFetch(u_tex, coordsFrag.xy + coords.xy, 0).xyz;
244 vec3 tmpCol2 = tmpCol - colRef;
245 float dstR = dot(tmpCol2.xyz, tmpCol2.xyz);
246 int coordsz = coords.x * coords.x + coords.y * coords.y;
247 float tmp = exp(-dstR / sigma_r_sq_2 -
float(coordsz) / sigma_s_sq_2);
248 color.xyz += tmpCol * tmp;
252 f_color = vec4(weight > 0 ? (color / weight) : colRef, 1.0);
258 uniform sampler2D u_tex;
259 uniform sampler2D u_edge;
260 uniform isampler2D u_poisson;
261 uniform sampler2D u_rand;
262 uniform
int nSamples;
263 uniform
float sigma_s_sq_2;
264 uniform
float sigma_r_sq_2;
268 vec3 color = vec3(0.0, 0.0, 0.0);
269 ivec2 coordsFrag = ivec2(gl_FragCoord.xy);
271 vec3 colRef = texelFetch(u_tex, coordsFrag, 0).xyz;
272 vec3 edgeRef = texelFetch(u_edge, coordsFrag, 0).xyz;
275 float shifter = texture(u_rand, gl_FragCoord.xy, 0).x;
277 for(
int i = 0; i < nSamples; i++) {
279 ivec3 coords = texelFetch(u_poisson, ivec2(i, shifter), 0).xyz;
282 vec3 tmpEdge = texelFetch(u_edge, coordsFrag.xy + coords.xy, 0).xyz;
283 vec3 tmpEdge2 = tmpEdge - edgeRef;
284 float dstR = dot(tmpEdge2.xyz, tmpEdge2.xyz);
285 float tmp = exp(-dstR / sigma_r_sq_2 -
float(coords.z) / sigma_s_sq_2);
288 vec3 tmpCol = texelFetch(u_tex, coordsFrag.xy + coords.xy, 0).xyz;
289 color.xyz += tmpCol * tmp;
293 f_color = vec4(weight > 0.0 ? color / weight : colRef, 1.0);
299 uniform sampler2D u_tex;
300 uniform isampler2D u_poisson;
301 uniform sampler2D u_rand;
302 uniform sampler2D u_mask;
303 uniform
int nSamples;
304 uniform
float sigma_s_sq_2;
305 uniform
float sigma_r_sq_2;
309 vec3 color = vec3(0.0, 0.0, 0.0);
310 ivec2 coordsFrag = ivec2(gl_FragCoord.xy);
313 float w = texelFetch(u_mask, coordsFrag, 0).x;
314 vec3 colRef = texelFetch(u_tex, coordsFrag, 0).xyz;
319 float shifter = texture(u_rand, gl_FragCoord.xy, 0).x;
321 for(
int i = 0; i < nSamples; i++) {
323 ivec3 coords = texelFetch(u_poisson, ivec2(i, shifter), 0).xyz;
325 tmpCol = texelFetch(u_tex, coordsFrag.xy + coords.xy, 0).xyz;
326 vec3 tmpCol2 = tmpCol - colRef;
327 float dstR = dot(tmpCol2.xyz, tmpCol2.xyz);
328 float tmp = exp(-dstR / sigma_r_sq_2 -
float(coords.z) / sigma_s_sq_2);
329 color.xyz += tmpCol * tmp;
333 color = weight > 0.0 ? color / weight : colRef;
334 f_color = vec4(color.xyz * w + (1 - w) * colRef.xyz, 1.0);
336 f_color = vec4(colRef.xyz, 1.0);
358 flag = (this->sigma_s !=
sigma_s);
363 flag = flag || (this->sigma_r !=
sigma_r);
368 int halfKernelSize = kernelSize >> 1;
372 printf(
"Window: %d\n", halfKernelSize);
384 Vec2i window =
Vec2i(halfKernelSize, halfKernelSize);
396 printf(
"Number of samples: %d\n",
ms->
nSamples);
406 float sigma_s_sq_2 = 2.0f * this->sigma_s * this->
sigma_s;
407 float sigma_r_sq_2 = 2.0f * this->sigma_r * this->
sigma_r;
static std::string getFileNumber(std::string nameFile, std::string nameExt)
Definition: file_lister.hpp:36
static ImageGL * execute(ImageGL *imgIn, float sigma_s, float sigma_r)
execute
Definition: filter_bilateral_2ds.hpp:113
TechniqueGL technique
Definition: display.hpp:45
int channels
Definition: filter_radial_basis_function.hpp:80
static int getKernelSize(float sigma)
KernelSize computes the size of a kernel in pixel give its sigma.
Definition: precomputed_gaussian.hpp:121
T * delete_s(T *data)
delete_s
Definition: std_util.hpp:123
ImageGL * setupAux(ImageGLVec imgIn, ImageGL *imgOut)
setupAux
Definition: filter_bilateral_2ds.hpp:187
GLuint generateTextureGL(GLenum target, GLenum format_type, bool mipmap)
generateTextureGL
ImageGL * allocateOutputMemory(ImageGLVec imgIn, ImageGL *imgOut, bool bDelete)
allocateOutputMemory
Definition: display.hpp:217
void bind()
bind
Definition: display.hpp:189
GLuint glBeginTimeQuery()
glBeginTimeQuery
Definition: timings.hpp:29
#define MAKE_STRING(input_string)
Definition: filter_bilateral_2ds.hpp:29
PIC_INLINE ImageGLVec SingleGL(ImageGL *img)
SingleGL creates a single for filters input.
Definition: image_vec.hpp:39
ImageGL * imageRand
Definition: filter_bilateral_2ds.hpp:71
void releaseAux()
releaseAux
Definition: filter_bilateral_2ds.hpp:100
GLuint64 glEndTimeQuery(GLuint64 ret)
glEndTimeQuery
Definition: timings.hpp:46
Definition: filter_bilateral_2ds.hpp:29
std::vector< std::string > fragment_sources
Definition: filter_bilateral_2ds.hpp:73
The ImageGL class.
Definition: image.hpp:42
Vec< 2, int > Vec2i
Vec2i.
Definition: vec.hpp:829
Definition: filter_bilateral_2ds.hpp:29
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
PIC_INLINE int getValueBF(BF_TYPE type)
getValueBF
Definition: filter_bilateral_2ds.hpp:36
void setUniform1f(const char *name_uniform, float value0)
SetUniform1f.
Definition: display.hpp:247
BF_TYPE type
Definition: filter_bilateral_2ds.hpp:67
virtual ImageGL * Process(ImageGLVec imgIn, ImageGL *imgOut)
Process.
Definition: display.hpp:258
The FilterGLBilateral2DS class.
Definition: filter_bilateral_2ds.hpp:63
float sigma_s
Definition: filter_bilateral_2ds.hpp:66
void updateGL(Vec< N, int > window, int nSamples)
updateGL
Definition: sampler_random_m.hpp:129
MRSamplersGL< 2 > * ms
Definition: filter_bilateral_2ds.hpp:70
The FilterGL class.
Definition: filter.hpp:35
BF_TYPE
Definition: filter_bilateral_2ds.hpp:29
void setRand(unsigned int seed)
setRand
Definition: filter_radial_basis_function.hpp:1392
GLuint generateTexture()
generateTexture
Definition: sampler_random_m.hpp:151
std::string genBilString(std::string type, float sigma_s, float sigma_r)
genBilString
Definition: string.hpp:366
The FilterGL class.
Definition: display.hpp:35
The MRSamplersGL class.
Definition: sampler_random_m.hpp:45
#define PIC_INLINE
Definition: base.hpp:33
static ImageGL * execute(std::string nameFile, std::string nameOut, float sigma_s, float sigma_r, int testing=1)
execute
Definition: filter_bilateral_2ds.hpp:133
The ImageGL class.
Definition: display.hpp:42
The Vec class.
Definition: display.hpp:35
int width
Definition: filter_radial_basis_function.hpp:80
bool initStandard(std::string version_number, std::string vertex_shader_source, std::string fragment_shader_source, std::string name)
initStandard
Definition: display.hpp:114
ImageGLVec param
Definition: display.hpp:49
Definition: point_samplers.hpp:51
void unbind()
unbind
Definition: display.hpp:197
void loadToMemory()
loadToMemory
std::string vertex_source
Definition: display.hpp:57
Definition: bilateral_separation.hpp:25
BF_TYPE
Definition: display.hpp:29
FilterGLBilateral2DS(float sigma_s, float sigma_r, BF_TYPE type)
FilterGLBilateral2DS.
int nSamples
Definition: display.hpp:53
float sigma_r
Definition: filter_bilateral_2ds.hpp:66
ImageGL * getImage()
getImage
Definition: display.hpp:89
void update(float sigma_s, float sigma_r, BF_TYPE type)
update
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
void release()
release
Definition: display.hpp:85
void setUniform1i(const char *name_uniform, int value0)
SetUniform.
Definition: display.hpp:236
void loadFromMemory()
loadFromMemory