PICCANTE  0.4
The hottest HDR imaging library!
color.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_COLORS_COLOR_HPP
19 #define PIC_COLORS_COLOR_HPP
20 
21 #include "../base.hpp"
22 
23 #include "../util/math.hpp"
24 #include "../util/vec.hpp"
25 
26 namespace pic {
27 
33 template<uint N>
34 void scaleTau(Vec<N, float> &in, const Vec<N, float> &tau)
35 {
36  for (int i = 0; i < N; i++) {
37  in.data[i] *= expf(-tau.data[i]);
38  }
39 }
40 
47 template<uint N>
48 void scaleTau(Vec<N, float> &in, const Vec<N, float> &sigma_t, const Vec<N, float> &tau)
49 {
50  for (int i = 0; i < N; i++) {
51  in.data[i] *= expf(-tau.data[i] * sigma_t.data[i]);
52  }
53 }
54 
61 template<uint N>
62 void scaleTau(Vec<N, float> &in, const Vec<N, float> &sigma_t, float t)
63 {
64  for (int i = 0; i < N; i++) {
65  in.data[i] *= expf(-sigma_t.data[i] * t);
66  }
67 }
68 
74 template<uint N>
76 {
77  return 0.213f * in.data[0] +
78  0.715f * in.data[1] +
79  0.072f * in.data[2];
80 }
81 
86 template<uint N>
88 {
89  for (int i = 0; i < N; i++) {
90  in.data[i] = in.data[i] * 0.5f + 0.5f;
91  }
92 }
93 
101 template<uint N>
102 void importanceSampling(Vec<N, float> &in, float e, int &channel, float &pdf)
103 {
104  float sum = 0.0f;
105  for(uint i = 0; i < N; i++) {
106  sum += in.data[i];
107  }
108 
109  if(sum > 0.0f) {
110  float CDF[N];
111  CDF[0] = in.data[0] / sum;
112  for(uint i = 1; i < (N - 1); i++) {
113  CDF[i] = (CDF[i - 1] + in.data[i]) / sum;
114  }
115  CDF[N - 1] = 1.0f; // sanity check
116 
117  for(uint i = 0; i < N; i++) {
118  if(e <= CDF[i]) {
119  channel = i;
120  pdf = in.data[i] / sum;
121  }
122  }
123  } else {
124  channel = int(e * float(N - 1));
125  pdf = 1.0f / float(N);
126  }
127 }
128 
137 template<uint N>
138 Vec<N, float> convertToLDR(Vec<N, float> &in, float exposure = 1.0f, float gammaCor = 2.2f, float maxVal = 255.0f)
139 {
140  Vec<N, float> ret = in.clone();
141  ret *= exposure;
142 
143  vecGamma(ret, 1.0f / gammaCor);
144  ret *= maxVal;
145  ret.clamp(0.0f, maxVal);
146 
147  return ret;
148 }
149 
150 } // end namespace pic
151 
152 #endif /* PIC_COLORS_COLOR_HPP */
153 
void importanceSampling(Vec< N, float > &in, float e, int &channel, float &pdf)
importanceSampling
Definition: color.hpp:102
void vecGamma(Vec< N, float > &ret, float g)
Definition: vec.hpp:777
unsigned int uint
Definition: base.hpp:23
float colorLuminance(Vec< N, float > &in)
colorLuminance
Definition: color.hpp:75
T data[N]
Definition: vec.hpp:38
void scaleTau(Vec< N, float > &in, const Vec< N, float > &tau)
scaleTau
Definition: color.hpp:34
void clamp(T min, T max)
clamp
Definition: vec.hpp:324
Vec< N, T > clone()
Definition: vec.hpp:171
Definition: bilateral_separation.hpp:25
Vec< N, float > convertToLDR(Vec< N, float > &in, float exposure=1.0f, float gammaCor=2.2f, float maxVal=255.0f)
convertToLDR
Definition: color.hpp:138
The Vec class.
Definition: vec.hpp:35
void colorSaturate(Vec< N, float > &in)
colorSaturate
Definition: color.hpp:87