diff --git a/rtengine/dirpyr_equalizer.cc b/rtengine/dirpyr_equalizer.cc index ac8f16f07..a3bde4374 100644 --- a/rtengine/dirpyr_equalizer.cc +++ b/rtengine/dirpyr_equalizer.cc @@ -25,7 +25,6 @@ #include #include #include -#include #ifdef _OPENMP #include @@ -64,15 +63,19 @@ namespace rtengine { } if (lastlevel==0) return; + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - LUTf rangefn(0x20000); + LUTf rangefn(0x10000); + + int intfactor = 1024;//16384; + //set up range functions for (int i=0; i<0x10000; i++) { - rangefn[i] = (int)((thresh/((double)(i) + thresh))); + rangefn[i] = (int)((thresh/((double)(i) + thresh))*intfactor); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -96,7 +99,7 @@ namespace rtengine { int scale = scales[level]; //int thresh = 100 * mult[5]; - dirpyrlo[0] = array2D (srcwidth, srcheight); + dirpyrlo[0] = allocArray (srcwidth, srcheight); dirpyr_channel(src, dirpyrlo[0], srcwidth, srcheight, rangefn, 0, scale, mult ); @@ -106,7 +109,7 @@ namespace rtengine { { scale = scales[level]; - dirpyrlo[level] = array2D(srcwidth, srcheight); + dirpyrlo[level] = allocArray(srcwidth, srcheight); dirpyr_channel(dirpyrlo[level-1], dirpyrlo[level], srcwidth, srcheight, rangefn, level, scale, mult ); @@ -126,6 +129,7 @@ namespace rtengine { //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + for(int level = lastlevel - 1; level > 0; level--) { idirpyr_eq_channel(dirpyrlo[level], dirpyrlo[level-1], buffer, srcwidth, srcheight, level, mult ); @@ -148,6 +152,17 @@ namespace rtengine { } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + for(int i = 0; i < lastlevel; i++) + { + freeArray(dirpyrlo[i], srcheight); + } + + freeArray(buffer, srcheight); + + + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } void ImProcFunctions::dirpyr_channel(float ** data_fine, float ** data_coarse, int width, int height, LUTf & rangefn, int level, int scale, const double * mult ) @@ -178,10 +193,8 @@ namespace rtengine { float val=0; float norm=0; - for(int inbr=(i-scalewin); inbr<=(i+scalewin); inbr+=scale) { - if (inbr<0 || inbr>height-1) continue; - for (int jnbr=(j-scalewin); jnbr<=(j+scalewin); jnbr+=scale) { - if (jnbr<0 || jnbr>width-1) continue; + for(int inbr=MAX(0,i-scalewin); inbr<=MIN(height-1,i+scalewin); inbr+=scale) { + for (int jnbr=MAX(0,j-scalewin); jnbr<=MIN(width-1,j+scalewin); jnbr+=scale) { float dirwt = DIRWT(inbr, jnbr, i, j); val += dirwt*data_fine[inbr][jnbr]; norm += dirwt; @@ -201,7 +214,7 @@ namespace rtengine { void ImProcFunctions::idirpyr_eq_channel(float ** data_coarse, float ** data_fine, float ** buffer, int width, int height, int level, const double * mult ) { float noisehi = 1.33*noise*mult[4]/pow(3,level), noiselo = 0.66*noise*mult[4]/pow(3,level); - LUTf irangefn(0x20000); + float * irangefn = new float [0x20000]; for (int i=0; i<0x20000; i++) { if (abs(i-0x10000)>noisehi || mult[level]<1.0) { @@ -225,7 +238,9 @@ namespace rtengine { buffer[i][j] += irangefn[hipass+0x10000] * hipass ; } } - + + delete [] irangefn; + }