18 #ifndef PIC_TONE_MAPPING_LISCHINSKI_TMO_HPP 19 #define PIC_TONE_MAPPING_LISCHINSKI_TMO_HPP 21 #include "../base.hpp" 22 #include "../util/math.hpp" 23 #include "../algorithms/lischinski_minimization.hpp" 24 #include "../tone_mapping/reinhard_tmo.hpp" 25 #include "../tone_mapping/tone_mapping_operator.hpp" 49 float minL, maxL, Lav;
51 images[0]->getMinVal(NULL, &minL);
52 images[0]->getMaxVal(NULL, &maxL);
53 images[0]->getLogMeanVal(NULL, &Lav);
58 int Z = int(ceilf(maxL_log - minL_log));
75 std::vector<float> *zones =
new std::vector<float>[Z];
76 float *fstop =
new float[Z];
77 float *Rz =
new float[Z];
82 for(
int i = 0; i <
images[0]->size(); i++) {
83 float L =
images[0]->data[i];
86 int zone =
CLAMP(
int(ceilf(L_log - minL_log)), Z);
87 zones[zone].push_back(L);
90 for(
int i = 0; i < Z; i++) {
91 if(!zones[i].empty()) {
92 std::sort(zones[i].begin(), zones[i].end());
93 Rz[i] = zones[i][zones[i].size() >> 1];
96 float Rz_s = Rz[i] *
alpha / Lav;
97 float f = (Rz_s * (1.0f + Rz_s / whitePoint_sq) ) / (1.0f + Rz_s);
110 for(
int i = 0; i <
images[0]->size(); i++) {
111 float L_log =
images[0]->data[i];
112 int zone =
CLAMP(
int(ceilf(L_log - minL_log)), Z);
113 images[1]->data[i] = fstop[zone];
Image * Process(ImageVec imgIn, Image *imgOut=NULL)
Process.
Definition: tone_mapping_operator.hpp:120
static float estimateAlpha(float LMin, float LMax, float logAverage)
estimateAlpha
Definition: reinhard_tmo.hpp:167
float whitePoint
Definition: lischinski_tmo.hpp:34
std::vector< Image * > ImageVec
ImageVec an std::vector of pic::Image.
Definition: image_vec.hpp:29
ImageVec images
Definition: tone_mapping_operator.hpp:35
The ToneMappingOperator class.
Definition: tone_mapping_operator.hpp:31
virtual Image * Process(ImageVec imgIn, Image *imgOut)
Process.
Definition: filter.hpp:390
The FilterLuminance class.
Definition: filter_luminance.hpp:33
void update(float alpha=0.15f, float whitePoint=1e6f)
update
Definition: lischinski_tmo.hpp:151
void updateImage(Image *imgIn)
updateImage
Definition: tone_mapping_operator.hpp:78
PIC_INLINE Image * LischinskiMinimization(Image *L, Image *g, Image *omega=NULL, float omega_global=1.0f, Image *gOut=NULL, float alpha=1.0f, float lambda=0.4f, float LISCHINSKI_EPSILON=1e-4f)
LischinskiMinimization.
Definition: lischinski_minimization.hpp:82
PIC_INLINE float log2fPlusEpsilon(float x)
log2fPlusEpsilon
Definition: math.hpp:395
static Image * execute(Image *imgIn, Image *imgOut)
execute
Definition: lischinski_tmo.hpp:163
Image * ProcessAux(ImageVec imgIn, Image *imgOut)
ProcessAux.
Definition: lischinski_tmo.hpp:42
float alpha
Definition: lischinski_tmo.hpp:34
LischinskiTMO(float alpha=0.15f, float whitePoint=1e6f)
LischinskiTMO.
Definition: lischinski_tmo.hpp:138
The Image class stores an image as buffer of float.
Definition: image.hpp:60
PIC_INLINE float pow2f(float x)
pow2f
Definition: math.hpp:405
FilterLuminance flt_lum
Definition: lischinski_tmo.hpp:32
PIC_INLINE ImageVec Single(Image *img)
Single creates an std::vector which contains img; this is for filters input.
Definition: image_vec.hpp:36
Definition: bilateral_separation.hpp:25
#define CLAMP(x, a)
Definition: math.hpp:77
static T * assign(T *data, int size, T *ret)
assign
Definition: array.hpp:464
Definition: lischinski_tmo.hpp:29
static float estimateWhitePoint(float LMin, float LMax)
estimateWhitePoint
Definition: reinhard_tmo.hpp:185