diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 63b280dbe..b0f4b55f3 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -285,7 +285,7 @@ public: void InverseBlurNoise_Local (const struct local_params& lp, LabImage* original, LabImage* transformed, const LabImage* const tmp1, int cx, int cy); void Reti_Local (int call, const float hueplus, const float huemoins, const float hueref, const float dhue, const float chromaref, const float lumaref, const struct local_params& lp, float **deltE, LabImage* original, LabImage* transformed, const LabImage* const tmp1, int cx, int cy, int chro); void InverseReti_Local (const struct local_params& lp, LabImage* original, LabImage* transformed, const LabImage* const tmp1, int cx, int cy, int chro); - void Contrast_Local (int call, LabImage * bufcontorig, float ** buflightc, float moy, const float hueplus, const float huemoins, const float hueref, const float dhue, const float chromaref, float pm, struct local_contra &lco, float lumaref, float av, const struct local_params& lp, float **deltE, LabImage* original, LabImage* transformed, int cx, int cy); + void Contrast_Local (int call, float ave, LabImage * bufcontorig, float ** buflightc, float moy, const float hueplus, const float huemoins, const float hueref, const float dhue, const float chromaref, float pm, struct local_contra &lco, float lumaref, float av, const struct local_params& lp, float **deltE, LabImage* original, LabImage* transformed, int cx, int cy); void cbdl_Local (int call, int sp, float **loctemp, const float hueplus, const float huemoins, const float hueref, const float dhue, const float chromaref, const float lumaref, const local_params& lp, float **deltE, LabImage* original, LabImage* transformed, int cx, int cy); void BlurNoise_Local (int call, int sp, LabImage* tmp1, const float hueplus, const float huemoins, const float hueref, const float dhue, const float chromaref, const float lumaref, const local_params& lp, float **deltE, LabImage* original, LabImage* transformed, int cx, int cy); void TM_Local (int call, int sp, LabImage* tmp1, const float hueplus, const float huemoins, const float hueref, const float dhue, const float chromaref, const float lumaref, const local_params& lp, float **deltE, LabImage* original, LabImage* transformed, int cx, int cy); diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index b00cfdeb9..43329ebcc 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -45,7 +45,7 @@ #define CLIPC(a) ((a)>-42000?((a)<42000?(a):42000):-42000) // limit a and b to 130 probably enough ? #define CLIPL(x) LIM(x,0.f,40000.f) // limit L to about L=120 probably enough ? #define CLIPLOC(x) LIM(x,0.f,32767.f) -#define CLIPLIG(x) LIM(x,0.f, 100.f) +#define CLIPLIG(x) LIM(x,0.f, 99.5f) #define CLIPCHRO(x) LIM(x,0.f, 140.f) namespace rtengine @@ -1832,12 +1832,13 @@ struct local_contra { float al, bl; }; -void ImProcFunctions::Contrast_Local (int call, LabImage * bufcontorig, float ** buflightc, float moy, const float hueplus, const float huemoins, const float hueref, const float dhue, const float chromaref, float pm, struct local_contra & lco, float lumaref, float av, const struct local_params & lp, float **deltE, LabImage * original, LabImage * transformed, int cx, int cy) +void ImProcFunctions::Contrast_Local (int call, float ave, LabImage * bufcontorig, float ** buflightc, float moy, const float hueplus, const float huemoins, const float hueref, const float dhue, const float chromaref, float pm, struct local_contra & lco, float lumaref, float av, const struct local_params & lp, float **deltE, LabImage * original, LabImage * transformed, int cx, int cy) { // BENCHFUN // contrast - perhaps for 4 areas if need // I tried shmap adaptaed to Lab, but no real gain and artifacts const float localtype = lumaref; // always spot area + // const float localtype = ave; // always spot area const float ach = (float)lp.trans / 100.f; float reducac; @@ -1923,27 +1924,31 @@ void ImProcFunctions::Contrast_Local (int call, LabImage * bufcontorig, float ** for (int x = 0; x < transformed->W; x++) { int lox = cx + x; -#ifdef __SSE2__ - float rhue = atan2Buffer[x]; - float rchro = sqrtBuffer[x]; -#else - float rhue = xatan2f (original->b[y][x], original->a[y][x]); - float rchro = sqrt (SQR (original->b[y][x]) + SQR (original->a[y][x])) / 327.68f; -#endif - int zone; int begx = int (lp.xc - lp.lxL); int begy = int (lp.yc - lp.lyT); if (lox >= (lp.xc - lp.lxL) && lox < (lp.xc + lp.lx) && loy >= (lp.yc - lp.lyT) && loy < (lp.yc + lp.ly)) { - // float localFactor = 1.f; - // calcTransition (lox, loy, ach, lp, zone, localFactor); + +#ifdef __SSE2__ + float rhue = atan2Buffer[x]; + float rchro = sqrtBuffer[x]; +#else + float rhue = xatan2f (original->b[y][x], original->a[y][x]); + float rchro = sqrt (SQR (original->b[y][x]) + SQR (original->a[y][x])) / 327.68f; +#endif //prepare shape detection float khu = 0.f; float kch = 1.f; bool kzon = false; float fach = 1.f; - float cli = (buflightc[loy - begy - 1][lox - begx - 1]); + float cli = 1.f; + + if (lp.curvact == true) { + + cli = (buflightc[loy - begy - 1][lox - begx - 1]); + } + //parameters for linear interpolation in function of real hue float apluscligh = (1.f - cli) / delhu; float bpluscligh = 1.f - apluscligh * hueplus; @@ -1951,6 +1956,7 @@ void ImProcFunctions::Contrast_Local (int call, LabImage * bufcontorig, float ** float bmoinscligh = 1.f - amoinscligh * huemoins; float realcligh = 1.f; + float realcligh2 = cli; @@ -1981,7 +1987,7 @@ void ImProcFunctions::Contrast_Local (int call, LabImage * bufcontorig, float ** // algo with detection of hue ==> artifacts for noisy images ==> denoise before - if (lp.sens < 20.f) { //to try... + if (lp.sens < 100.f) { //to try... //hue detection if ((hueref + dhue) < M_PI && rhue < hueplus && rhue > huemoins) { //transition are good if (rhue >= hueplus - delhu ) { @@ -2092,10 +2098,14 @@ void ImProcFunctions::Contrast_Local (int call, LabImage * bufcontorig, float ** falL *= pow (rchro / kcr, lp.iterat / 10.f); } + int zone; + float localFactor = 1.f; calcTransition (lox, loy, ach, lp, zone, localFactor); float kdiff = 1.f; + float modu = 1.f ;//realclig / cli; + float localty = localtype; if (rL > 0.01f) { //to avoid crash with very low gamut in rare cases ex : L=0.01 a=0.5 b=-0.9 @@ -2109,113 +2119,103 @@ void ImProcFunctions::Contrast_Local (int call, LabImage * bufcontorig, float ** case 1: { // inside transition zone if (lp.curvact == false) { - - if (original->L[y][x] < 32768.f) { - float factorx = localFactor; - float prov100 = original->L[y][x] / 32768.f; - float prov = prov100 * 100.f; - bool contin = true; + modu = 1.f; + } else { + modu = realcligh / (cli + 0.001f);//avoid divide by zero + } - if (contin) { - if (prov > localtype) { - if (prov >= localtype && prov < 50.f + localtype / 2.f) { - float core = (lco.alsup2 * prov + lco.blsup2) ; - core *= factorx; + if (original->L[y][x] < 32768.f) { + float factorx = localFactor; + float prov100 = original->L[y][x] / 32768.f; + float prov = prov100 * 100.f; + bool contin = true; - transformed->L[y][x] = 327.68f * (prov + pm * (prov - localtype) * (core) * kch * fach * falL); - } else { - float core = lco.aDY * (lco.aaa * prov100 * prov100 + lco.bbb * prov100 + lco.ccc); - core *= factorx; + if (contin) { - transformed->L[y][x] = 327.68f * (prov + pm * (prov - localtype) * (core) * kch * fach * falL); - } - } else { //inferior - if (2.f * prov > localtype && prov < localtype) { - float core = (lco.alsup * prov + lco.blsup) ; - core *= factorx; + if (prov > localty) { + if (prov >= localty && prov < 50.f + localty / 2.f) { + float core = (lco.alsup2 * prov + lco.blsup2) ; + core *= factorx; - transformed->L[y][x] = 327.68f * (prov - pm * (localtype - prov) * core * kch * fach * falL); - } else if (2.f * prov <= localtype) { - float core = prov * lco.alinf * (lco.aa * prov100 * prov100 + lco.bb * prov100); + transformed->L[y][x] = 327.68f * (prov + pm * (prov - localty) * (core) * kch * fach * falL * modu); + } else { + float core = lco.aDY * (lco.aaa * prov100 * prov100 + lco.bbb * prov100 + lco.ccc); - core *= factorx; + core *= factorx; - transformed->L[y][x] = 327.68f * (prov - pm * (localtype - prov) * core * kch * fach * falL); - } + transformed->L[y][x] = 327.68f * (prov + pm * (prov - localty) * (core) * kch * fach * falL * modu); + } + } else { //inferior + if (2.f * prov > localty && prov < localty) { + float core = (lco.alsup * prov + lco.blsup) ; + core *= factorx; + + transformed->L[y][x] = 327.68f * (prov - pm * (localty - prov) * core * kch * fach * falL * modu); + } else if (2.f * prov <= localtype) { + float core = prov * lco.alinf * (lco.aa * prov100 * prov100 + lco.bb * prov100); + + core *= factorx; + + transformed->L[y][x] = 327.68f * (prov - pm * (localty - prov) * core * kch * fach * falL * modu); } } - } else { - transformed->L[y][x] = original->L[y][x]; } - - break; - } else { - float lumnew = bufcontorig->L[loy - begy - 1][lox - begx - 1]; - - float factorx = localFactor; - float fli = 1.f; - fli = ((100.f + realcligh * falL ) / 100.f);//luma transition - float lightcont = lumnew; - float diflc = lightcont * fli - original->L[y][x]; - kdiff *= fach * kch; - diflc *= kdiff ; - diflc *= factorx; //transition - - transformed->L[y][x] = CLIPL (1.f * (original->L[y][x] + diflc)); - } + + + else { + transformed->L[y][x] = original->L[y][x]; + } + + break; } case 2: { // inside selection => full effect, no transition if (lp.curvact == false) { - - if (original->L[y][x] < 32768.f) { - float prov100 = original->L[y][x] / 32768.f; - float prov = prov100 * 100.f; - - bool contin = true; - - if (contin) { + modu = 1.f; + } else { + modu = realcligh / (cli + 0.001f); + } - if (prov > localtype ) { - if (prov >= localtype && prov < 50.f + localtype / 2.f) { - float core = (lco.alsup2 * prov + lco.blsup2) ; - transformed->L[y][x] = 327.68f * (prov + pm * (prov - localtype) * core * kch * fach * falL); - } else { - float core = lco.aDY * (lco.aaa * prov100 * prov100 + lco.bbb * prov100 + lco.ccc); - transformed->L[y][x] = 327.68f * (prov + pm * (prov - localtype) * core * kch * fach * falL); - } - } else { //inferior - if (2.f * prov > localtype && prov < localtype) { - float core = (lco.alsup * prov + lco.blsup) ; - transformed->L[y][x] = 327.68f * (prov - pm * (localtype - prov) * core * kch * fach * falL); - } else if (2.f * prov <= localtype) { - float core = prov * lco.alinf * (lco.aa * prov100 * prov100 + lco.bb * prov100); - transformed->L[y][x] = 327.68f * (prov - pm * (localtype - prov) * core * kch * fach * falL); - } + + if (original->L[y][x] < 32768.f) { + float prov100 = original->L[y][x] / 32768.f; + float prov = prov100 * 100.f; + + bool contin = true; + + if (contin) { + + + + if (prov > localty ) { + if (prov >= localty && prov < 50.f + localty / 2.f) { + float core = (lco.alsup2 * prov + lco.blsup2) ; + transformed->L[y][x] = 327.68f * (prov + pm * (prov - localty) * core * kch * fach * falL * modu); + } else { + float core = lco.aDY * (lco.aaa * prov100 * prov100 + lco.bbb * prov100 + lco.ccc); + transformed->L[y][x] = 327.68f * (prov + pm * (prov - localty) * core * kch * fach * falL * modu); + } + } else { //inferior + if (2.f * prov > localty && prov < localty) { + float core = (lco.alsup * prov + lco.blsup) ; + transformed->L[y][x] = 327.68f * (prov - pm * (localty - prov) * core * kch * fach * falL * modu); + } else if (2.f * prov <= localtype) { + float core = prov * lco.alinf * (lco.aa * prov100 * prov100 + lco.bb * prov100); + transformed->L[y][x] = 327.68f * (prov - pm * (localty - prov) * core * kch * fach * falL * modu); } } - } else { - transformed->L[y][x] = original->L[y][x]; } } else { - float lumnew = bufcontorig->L[loy - begy - 1][lox - begx - 1]; - float fli = 1.f; - fli = ((100.f + realcligh * falL ) / 100.f);//luma transition - float lightcont = lumnew; - float diflc = lightcont * fli - original->L[y][x]; - kdiff *= fach * kch; - diflc *= kdiff ; - transformed->L[y][x] = CLIPL (1.f * (original->L[y][x] + diflc)); + transformed->L[y][x] = original->L[y][x]; } - } } } @@ -3737,7 +3737,7 @@ void ImProcFunctions::Lab_Local (int call, int sp, float** shbuffer, LabImage * } } - } else if (lp.inv || lp.invret) { //exterior + } else if (lp.inv || lp.invret) { //exterior || lp.curvact ave = 0.f; n = 0; #pragma omp parallel for reduction(+:ave,n) @@ -3801,7 +3801,7 @@ void ImProcFunctions::Lab_Local (int call, int sp, float** shbuffer, LabImage * float dhueret = ared * lp.sensh + bred; //delta hue retinex - constexpr float maxh = 2.5f; // 4 amplification contrast above mean + constexpr float maxh = 3.5f; // 3.5 amplification contrast above mean constexpr float maxl = 2.5f; // 3 reductio contrast under mean @@ -4391,7 +4391,7 @@ void ImProcFunctions::Lab_Local (int call, int sp, float** shbuffer, LabImage * ch = (cclocalcurve[chromat * adjustr ]) / ((chromat + 0.00001f) * adjustr); //ch between 0 and 0 50 or more if (ch <= 1.f) {//convert data curve near values of slider -100 + 100, to be used after to detection shape - chpro = 100.f * ch - 100.f; + chpro = 99.f * ch - 99.f; } else { chpro = CLIPCHRO (ampli * ch - ampli); //ampli = 25.f arbitrary empirical coefficient between 5 and 50 } @@ -4413,7 +4413,7 @@ void ImProcFunctions::Lab_Local (int call, int sp, float** shbuffer, LabImage * lL = lighLnew / lighL; if (lL <= 1.f) {//convert data curve near values of slider -100 + 100, to be used after to detection shape - clighL = 100.f * lL - 100.f; + clighL = 99.f * lL - 99.f; } else { clighL = CLIPLIG (amplil * lL - amplil); //ampli = 25.f arbitrary empirical coefficient between 5 and 150 } @@ -4500,6 +4500,7 @@ void ImProcFunctions::Lab_Local (int call, int sp, float** shbuffer, LabImage * int bfh, bfw; float clighc = 0.f; const float localtype = lumaref; + // const float localtype = ave; float reducac; float corered; @@ -4527,9 +4528,6 @@ void ImProcFunctions::Lab_Local (int call, int sp, float** shbuffer, LabImage * ImProcFunctions::secondeg_begin (reducac, vi, lco.aa, lco.bb);//parabolic ImProcFunctions::secondeg_end (reducac, vinf, lco.aaa, lco.bbb, lco.ccc);//parabolic - - - if (call <= 3) { //simpleprocess, dcrop, improccoordinator int GW = transformed->W; int GH = transformed->H; @@ -4552,8 +4550,8 @@ void ImProcFunctions::Lab_Local (int call, int sp, float** shbuffer, LabImage * for (int ir = 0; ir < bfh; ir++) //fill with 0 for (int jr = 0; jr < bfw; jr++) { bufcontorig->L[ir][jr] = 0.f; - bufcontorig->a[ir][jr] = 0.f; - bufcontorig->b[ir][jr] = 0.f; + // bufcontorig->a[ir][jr] = 0.f; + // bufcontorig->b[ir][jr] = 0.f; } @@ -4563,6 +4561,8 @@ void ImProcFunctions::Lab_Local (int call, int sp, float** shbuffer, LabImage * float maxc = -10000.f; float minc = +10000.f; // float core = 0.f; + float localty; + localty = localtype; for (int y = 0; y < transformed->H ; y++) //{ for (int x = 0; x < transformed->W; x++) { @@ -4578,29 +4578,31 @@ void ImProcFunctions::Lab_Local (int call, int sp, float** shbuffer, LabImage * clighc = 1.f; corered = 0.f; + if (lp.cont != 0.f && lp.curvact) { float cL; - float amplil = 20.f; + float amplil = 150.f; float prov100 = bufcontorig->L[loy - begy - 1][lox - begx - 1] / 32768.f; float prov = prov100 * 100.f; + cL = 1.f; - if (prov > localtype) { - if (prov >= localtype && prov < 50.f + localtype / 2.f) { + if (prov > localty) { + if (prov >= localty && prov < 50.f + localty / 2.f) { float core = (lco.alsup2 * prov + lco.blsup2) ; - corered = prov + pm * (prov - localtype) * (core); + corered = prov + pm * (prov - localty) * (core); } else { float core = lco.aDY * (lco.aaa * prov100 * prov100 + lco.bbb * prov100 + lco.ccc); - corered = prov + pm * (prov - localtype) * (core); + corered = prov + pm * (prov - localty) * (core); } } else { - if (2.f * prov > localtype && prov < localtype) { + if (2.f * prov > localty && prov < localty) { float core = (lco.alsup * prov + lco.blsup) ; - corered = prov - pm * (localtype - prov) * core; - } else if (2.f * prov <= localtype) { + corered = prov - pm * (localty - prov) * core; + } else if (2.f * prov <= localty) { float core = prov * lco.alinf * (lco.aa * prov100 * prov100 + lco.bb * prov100); - corered = prov - pm * (localtype - prov) * core; + corered = prov - pm * (localty - prov) * core; } } @@ -4608,23 +4610,33 @@ void ImProcFunctions::Lab_Local (int call, int sp, float** shbuffer, LabImage * cL = corered / prov; if (cL <= 1.f) {//convert data curve near values of slider -100 + 100, to be used after to detection shape - clighc = 100.f * cL - 100.f; + clighc = 99.f * cL - 99.f; } else { - clighc = CLIPLIG (amplil * cL - amplil); //ampli = 25.f arbitrary empirical coefficient between 5 and 150 + clighc = CLIPLIG (amplil * cL - amplil); //arbitrary empirical coefficient between 5 and 150 + } + + + if (clighc > maxc) { + maxc = clighc; + } + + if (clighc < minc) { + minc = clighc; } buflightc[loy - begy - 1][lox - begx - 1] = clighc; } - - } } + printf ("min=%2.2f max=%f", minc, maxc); + + } - Contrast_Local (call, bufcontorig, buflightc, moy, hueplus, huemoins, hueref, dhue, chromaref, pm, lco, lumaref, av, lp, deltE, original, transformed, cx, cy); + Contrast_Local (call, ave, bufcontorig, buflightc, moy, hueplus, huemoins, hueref, dhue, chromaref, pm, lco, lumaref, av, lp, deltE, original, transformed, cx, cy); if (call <= 3) { diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 61139b666..5ff4bd9c7 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -61,7 +61,7 @@ Locallab::Locallab (): locYT (Gtk::manage (new Adjuster (M ("TP_LOCAL_HEIGHT_T"), 0, 1500, 1, 250))), centerX (Gtk::manage (new Adjuster (M ("TP_LOCALLAB_CENTER_X"), -1000, 1000, 1, 0))), centerY (Gtk::manage (new Adjuster (M ("TP_LOCALLAB_CENTER_Y"), -1000, 1000, 1, 0))), - circrad (Gtk::manage (new Adjuster (M ("TP_LOCALLAB_CIRCRADIUS"), 4, 100, 1, 18))), + circrad (Gtk::manage (new Adjuster (M ("TP_LOCALLAB_CIRCRADIUS"), 4, 150, 1, 18))), thres (Gtk::manage (new Adjuster (M ("TP_LOCALLAB_THRES"), 1, 35, 1, 18))), proxi (Gtk::manage (new Adjuster (M ("TP_LOCALLAB_PROXI"), 0, 60, 1, 20))), lightness (Gtk::manage (new Adjuster (M ("TP_LOCALLAB_LIGHTNESS"), -100, 100, 1, 0))),