diff --git a/rtdata/languages/default b/rtdata/languages/default index d6f499638..a7f485a17 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1677,6 +1677,7 @@ TP_LENSPROFILE_USEDIST;Distortion correction TP_LENSPROFILE_USEVIGN;Vignetting correction TP_LOCALLAB_ACTIV;Blur luminance only TP_LOCALLAB_ARTIF;Reduce artifacts - Improve algoritm +TP_LOCALLAB_ARTIF_TOOLTIP;Only active for Color-light, and Retinex. TP_LOCALLAB_AVOID;Avoid color shift TP_LOCALLAB_BLUFR;Blur & Noise TP_LOCALLAB_CENTER_X;Center X diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 95c530c2f..063cd16f5 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -855,7 +855,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) int t_shariter = 30; int t_sensisha = 19; int t_inverssha = 0; - int t_qualityMethod = 0; + int t_qualityMethod = 2; int t_thres = 18; int t_proxi = 20; int t_noiselumf = 0; @@ -1500,7 +1500,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) int t_shariter = 30; int t_sensisha = 19; int t_inverssha = 0; - int t_qualityMethod = 0; + int t_qualityMethod = 2; int t_thres = 18; int t_proxi = 20; int t_noiselumf = 0; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index b0f4b55f3..21982c877 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -283,7 +283,7 @@ public: void addGaNoise (LabImage *lab, LabImage *dst, const float mean, const float variance, const int sk); void BlurNoise_Localold (int call, const struct local_params& lp, LabImage* original, LabImage* transformed, const LabImage* const tmp1, int cx, int cy); 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 Reti_Local (int call, float ** buflight, float **bufchro, 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, 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); diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 43329ebcc..6e6c7763f 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -47,6 +47,7 @@ #define CLIPLOC(x) LIM(x,0.f,32767.f) #define CLIPLIG(x) LIM(x,0.f, 99.5f) #define CLIPCHRO(x) LIM(x,0.f, 140.f) +#define CLIPRET(x) LIM(x,-99.5f, 99.5f) namespace rtengine { @@ -1359,7 +1360,7 @@ void ImProcFunctions::InverseReti_Local (const struct local_params& lp, LabImage -void ImProcFunctions::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 ImProcFunctions::Reti_Local (int call, float **buflight, float **bufchro, 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) { //local retinex @@ -1389,10 +1390,6 @@ void ImProcFunctions::Reti_Local (int call, const float hueplus, const float hue float strn = lp.str / 1.f; // we can chnage 1.f by 2 or...to chnage effect constexpr float delhu = 0.1f; //between 0.05 and 0.2 - const float aplus = (1.f - strn) / delhu; - const float bplus = 1.f - aplus * hueplus; - const float amoins = (strn - 1.f) / delhu; - const float bmoins = 1.f - amoins * huemoins; const float apl = (-1.f) / delhu; const float bpl = - apl * hueplus; @@ -1445,301 +1442,314 @@ void ImProcFunctions::Reti_Local (int call, const float hueplus, const float hue for (int x = 0; x < transformed->W; x++) { int lox = cx + x; + 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)) { + #ifdef __SSE2__ - float rhue = atan2Buffer[x]; - float rchro = sqrtBuffer[x]; + 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; + 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 - float rL = original->L[y][x] / 327.68f; - float eps = 0.f; + float rL = original->L[y][x] / 327.68f; + float eps = 0.f; - if (fabs (original->b[y][x]) < 0.001f) { - eps = 0.01f; - } + if (fabs (original->b[y][x]) < 0.001f) { + eps = 0.01f; + } - float kab = original->a[y][x] / (original->b[y][x] + eps); + float cli = 1.f; + float clc = 1.f; - float realstr = 1.f; - float realstrch = 1.f; - //prepare shape detection - float deltachro = fabs (rchro - chromaref); - float deltahue = fabs (rhue - hueref); + // if (lp.curvact == true) { + cli = (buflight[loy - begy - 1][lox - begx - 1]); + clc = (bufchro[loy - begy - 1][lox - begx - 1]); - if (deltahue > M_PI) { - deltahue = - (deltahue - 2.f * M_PI); - } + // } else { + // cli = lp.str; + // clc = params->locallab.chrrt; + // } - float deltaE = 20.f * deltahue + deltachro; //between 0 and 280 - float deltaL = fabs (lumaref - rL); //between 0 and 100 + float aplus = (1.f - cli) / delhu; + float bplus = 1.f - aplus * hueplus; + float amoins = (cli - 1.f) / delhu; + float bmoins = 1.f - amoins * huemoins; - float kch = 1.f; - float khu = 0.f; - float fach = 1.f; - float falu = 1.f; + float aplusch = (1.f - clc) / delhu; + float bplusch = 1.f - aplusch * hueplus; + float amoinsch = (clc - 1.f) / delhu; + float bmoinsch = 1.f - amoinsch * huemoins; - if (deltachro < 160.f * SQR (lp.sensh / 100.f)) { - kch = 1.f; - } else { - float ck = 160.f * SQR (lp.sensh / 100.f); - float ak = 1.f / (ck - 160.f); - float bk = -160.f * ak; - kch = ak * deltachro + bk; - } + float kab = original->a[y][x] / (original->b[y][x] + eps); - if (lp.sensh < 40.f ) { - kch = pow (kch, pa * lp.sensh + pb); //increase under 40 - } + float realstr = 1.f; + float realstrch = 1.f; + //prepare shape detection + float deltachro = fabs (rchro - chromaref); + float deltahue = fabs (rhue - hueref); - bool kzon = false; + if (deltahue > M_PI) { + deltahue = - (deltahue - 2.f * M_PI); + } - //transition = difficult to avoid artifact with scope on flat area (sky...) - //hue detection - if ((hueref + dhue) < M_PI && rhue < hueplus && rhue > huemoins) { //transition are good - if (rhue >= hueplus - delhu) { - realstr = aplus * rhue + bplus; - khu = apl * rhue + bpl; + float deltaE = 20.f * deltahue + deltachro; //between 0 and 280 + float deltaL = fabs (lumaref - rL); //between 0 and 100 - } else if (rhue < huemoins + delhu) { - realstr = amoins * rhue + bmoins; - khu = amo * rhue + bmo; + float kch = 1.f; + float khu = 0.f; + float fach = 1.f; + float falu = 1.f; + if (deltachro < 160.f * SQR (lp.sensh / 100.f)) { + kch = 1.f; } else { - realstr = strn; - khu = 1.f; - + float ck = 160.f * SQR (lp.sensh / 100.f); + float ak = 1.f / (ck - 160.f); + float bk = -160.f * ak; + kch = ak * deltachro + bk; } - kzon = true; - } else if ((hueref + dhue) >= M_PI && (rhue > huemoins || rhue < hueplus )) { - if (rhue >= hueplus - delhu && rhue < hueplus) { - realstr = aplus * rhue + bplus; - khu = apl * rhue + bpl; - - } else if (rhue >= huemoins && rhue < huemoins + delhu) { - realstr = amoins * rhue + bmoins; - khu = amo * rhue + bmo; - - } else { - realstr = strn; - khu = 1.f; - + if (lp.sensh < 40.f ) { + kch = pow (kch, pa * lp.sensh + pb); //increase under 40 } - kzon = true; - } + bool kzon = false; - if ((hueref - dhue) > -M_PI && rhue < hueplus && rhue > huemoins) { - if (rhue >= hueplus - delhu && rhue < hueplus) { - realstr = aplus * rhue + bplus; - khu = apl * rhue + bpl; + //transition = difficult to avoid artifact with scope on flat area (sky...) + //hue detection + if ((hueref + dhue) < M_PI && rhue < hueplus && rhue > huemoins) { //transition are good + if (rhue >= hueplus - delhu) { + realstr = aplus * rhue + bplus; + realstrch = aplusch * rhue + bplusch; + khu = apl * rhue + bpl; - } else if (rhue >= huemoins && rhue < huemoins + delhu) { - realstr = amoins * rhue + bmoins; - khu = amo * rhue + bmo; + } else if (rhue < huemoins + delhu) { + realstr = amoins * rhue + bmoins; + realstrch = amoinsch * rhue + bmoinsch; + khu = amo * rhue + bmo; - } else { - realstr = strn; - khu = 1.f; + } else { + realstr = cli; + khu = 1.f; + realstrch = clc; - } - - kzon = true; - } else if ((hueref - dhue) <= -M_PI && (rhue > huemoins || rhue < hueplus )) { - if (rhue >= hueplus - delhu && rhue < hueplus) { - realstr = aplus * rhue + bplus; - khu = apl * rhue + bpl; - - } else if (rhue >= huemoins && rhue < huemoins + delhu) { - realstr = amoins * rhue + bmoins; - khu = amo * rhue + bmo; - - } else { - realstr = strn; - khu = 1.f; - - } - - kzon = true; - } - - //shape detection for hue chroma and luma - if (lp.sensh <= 20.f) { //to try... - - if (deltaE < 2.8f * lp.sensh) { - fach = khu; - } else { - fach = khu * (ahu * deltaE + bhu); - } - - float kcr = 10.f; - - if (rchro < kcr) { - fach *= (1.f / (kcr * kcr)) * rchro * rchro; - } - - if (lp.qualmet >= 1) { - if (deltE[y][x] > 10.f * lp.thr) { - fach = 1.f; } - } else { - fach = 1.f; + + kzon = true; + } else if ((hueref + dhue) >= M_PI && (rhue > huemoins || rhue < hueplus )) { + if (rhue >= hueplus - delhu && rhue < hueplus) { + realstr = aplus * rhue + bplus; + realstrch = aplusch * rhue + bplusch; + khu = apl * rhue + bpl; + + } else if (rhue >= huemoins && rhue < huemoins + delhu) { + realstr = amoins * rhue + bmoins; + realstrch = amoinsch * rhue + bmoinsch; + khu = amo * rhue + bmo; + + } else { + realstr = cli; + khu = 1.f; + realstrch = clc; + + } + + kzon = true; } - if (deltaL < lp.sensh) { - falu = 1.f; - } else { - falu = alum * deltaL + blum; + if ((hueref - dhue) > -M_PI && rhue < hueplus && rhue > huemoins) { + if (rhue >= hueplus - delhu && rhue < hueplus) { + realstr = aplus * rhue + bplus; + realstrch = aplusch * rhue + bplusch; + khu = apl * rhue + bpl; + + } else if (rhue >= huemoins && rhue < huemoins + delhu) { + realstr = amoins * rhue + bmoins; + realstrch = amoinsch * rhue + bmoinsch; + khu = amo * rhue + bmo; + + } else { + realstr = cli; + khu = 1.f; + realstrch = clc; + + } + + kzon = true; + } else if ((hueref - dhue) <= -M_PI && (rhue > huemoins || rhue < hueplus )) { + if (rhue >= hueplus - delhu && rhue < hueplus) { + realstr = aplus * rhue + bplus; + realstrch = aplusch * rhue + bplusch; + khu = apl * rhue + bpl; + + } else if (rhue >= huemoins && rhue < huemoins + delhu) { + realstr = amoins * rhue + bmoins; + realstrch = amoinsch * rhue + bmoinsch; + khu = amo * rhue + bmo; + + } else { + realstr = cli; + khu = 1.f; + realstrch = clc; + + } + + kzon = true; } - } + //shape detection for hue chroma and luma + if (lp.sensh <= 20.f) { //to try... + if (deltaE < 2.8f * lp.sensh) { + fach = khu; + } else { + fach = khu * (ahu * deltaE + bhu); + } - // float kdiff = 0.f; - // I add these functions...perhaps not good - if (kzon) { - if (lp.sensh < 60.f) { //arbitrary value - if (hueref < -1.1f && hueref > -2.8f) { // detect blue sky - if (chromaref > 0.f && chromaref < 35.f * multchro) { // detect blue sky - if ( (rhue > -2.79f && rhue < -1.11f) && (rchro < 35.f * multchro)) { - realstr *= 0.9f; - } else { - realstr = 1.f; - } + float kcr = 10.f; + + if (rchro < kcr) { + fach *= (1.f / (kcr * kcr)) * rchro * rchro; + } + + if (lp.qualmet >= 1) { + if (deltE[y][x] > 10.f * lp.thr) { + fach = 1.f; } } else { - realstr = strn; + fach = 1.f; } - if (lp.sensh < 50.f) { //&& lp.chro > 0.f - if (hueref > -0.1f && hueref < 1.6f) { // detect skin - if (chromaref > 0.f && chromaref < 55.f * multchroskin) { // detect skin - if ( (rhue > -0.09f && rhue < 1.59f) && (rchro < 55.f * multchroskin)) { - realstr *= 0.7f; + if (deltaL < lp.sensh) { + falu = 1.f; + } else { + falu = alum * deltaL + blum; + } + + } + + + // float kdiff = 0.f; + // I add these functions...perhaps not good + if (kzon) { + if (lp.sensh < 60.f) { //arbitrary value + if (hueref < -1.1f && hueref > -2.8f) { // detect blue sky + if (chromaref > 0.f && chromaref < 35.f * multchro) { // detect blue sky + if ( (rhue > -2.79f && rhue < -1.11f) && (rchro < 35.f * multchro)) { + realstr *= 0.9f; } else { realstr = 1.f; } } } else { - realstr = strn; + realstr = cli; + } + + if (lp.sensh < 50.f) { //&& lp.chro > 0.f + if (hueref > -0.1f && hueref < 1.6f) { // detect skin + if (chromaref > 0.f && chromaref < 55.f * multchroskin) { // detect skin + if ( (rhue > -0.09f && rhue < 1.59f) && (rchro < 55.f * multchroskin)) { + realstr *= 0.7f; + } else { + realstr = 1.f; + } + } + } else { + realstr = cli; + } } } + } - } + float kcr = 100.f * lp.thr; + float falL = 1.f; - int zone; - float localFactor; - calcTransition (lox, loy, ach, lp, zone, localFactor); - int begx = int (lp.xc - lp.lxL); - int begy = int (lp.yc - lp.lyT); + if (rchro < kcr && chromaref > kcr) { // reduce artifacts in grey tones near hue spot and improve algorithm + falL *= pow (rchro / kcr, lp.iterat / 10.f); + } - if (rL > 0.1f) { //to avoid crash with very low gamut in rare cases ex : L=0.01 a=0.5 b=-0.9 - switch (zone) { - case 0: { // outside selection and outside transition zone => no effect, keep original values - if (chro == 0) { - transformed->L[y][x] = original->L[y][x]; + int zone; + float localFactor; + calcTransition (lox, loy, ach, lp, zone, localFactor); + + if (rL > 0.1f) { //to avoid crash with very low gamut in rare cases ex : L=0.01 a=0.5 b=-0.9 + switch (zone) { + case 0: { // outside selection and outside transition zone => no effect, keep original values + if (chro == 0) { + transformed->L[y][x] = original->L[y][x]; + } + + if (chro == 1) { + transformed->a[y][x] = original->a[y][x]; + transformed->b[y][x] = original->b[y][x]; + } + + break; } - if (chro == 1) { - transformed->a[y][x] = original->a[y][x]; - transformed->b[y][x] = original->b[y][x]; - } + case 1: { // inside transition zone + float factorx = localFactor; - break; - } + if (chro == 0) { + float difL; - case 1: { // inside transition zone - float factorx = localFactor; - - if (chro == 0) { - float difL; - - if (call <= 3) { - if (lox >= (lp.xc - lp.lxL) && lox < (lp.xc + lp.lx) && loy >= (lp.yc - lp.lyT) && loy < (lp.yc + lp.ly)) { + if (call <= 3) { difL = tmp1->L[loy - begy - 1][lox - begx - 1] - original->L[y][x]; - difL *= factorx * (100.f + realstr * (1.f - factorx)) / 100.f; + difL *= factorx * (100.f + realstr * falL) / 100.f; difL *= kch * fach; transformed->L[y][x] = original->L[y][x] + difL; } - } else { - difL = (tmp1->L[y][x]) - original->L[y][x]; - difL *= factorx * (100.f + realstr * (1.f - factorx)) / 100.f; - difL *= kch * fach; - transformed->L[y][x] = original->L[y][x] + difL; } - } - if (chro == 1) { - float difa, difb; + if (chro == 1) { + float difa, difb; - if (call <= 3) { - if (lox >= (lp.xc - lp.lxL) && lox < (lp.xc + lp.lx) && loy >= (lp.yc - lp.lyT) && loy < (lp.yc + lp.ly)) { + if (call <= 3) { difa = tmp1->a[loy - begy - 1][lox - begx - 1] - original->a[y][x]; difb = tmp1->b[loy - begy - 1][lox - begx - 1] - original->b[y][x]; - difa *= factorx * (100.f + realstr * falu * (1.f - factorx)) / 100.f; - difb *= factorx * (100.f + realstr * falu * (1.f - factorx)) / 100.f; + difa *= factorx * (100.f + realstrch * falu * falL) / 100.f; + difb *= factorx * (100.f + realstrch * falu * falL) / 100.f; transformed->a[y][x] = CLIPC (original->a[y][x] + difa); transformed->b[y][x] = CLIPC (original->b[y][x] + difb); - } - } else { - difa = tmp1->a[y][x] - original->a[y][x]; - difb = tmp1->b[y][x] - original->b[y][x]; - difa *= factorx * (100.f + realstr * falu * (1.f - factorx)) / 100.f; - difb *= factorx * (100.f + realstr * falu * (1.f - factorx)) / 100.f; - transformed->a[y][x] = CLIPC (original->a[y][x] + difa); - transformed->b[y][x] = CLIPC (original->b[y][x] + difb); + } } + + break; + } - break; + case 2: { // inside selection => full effect, no transition + if (chro == 0) { + float difL; - } - - case 2: { // inside selection => full effect, no transition - if (chro == 0) { - float difL; - - if (call <= 3) { - if (lox >= (lp.xc - lp.lxL) && lox < (lp.xc + lp.lx) && loy >= (lp.yc - lp.lyT) && loy < (lp.yc + lp.ly)) { + if (call <= 3) { difL = tmp1->L[loy - begy - 1][lox - begx - 1] - original->L[y][x]; - difL *= (100.f + realstr) / 100.f; + difL *= (100.f + realstr * falL) / 100.f; difL *= kch * fach; transformed->L[y][x] = original->L[y][x] + difL; + } - - } else { - difL = tmp1->L[y][x] - original->L[y][x]; - difL *= (100.f + realstr) / 100.f; - difL *= kch * fach; - transformed->L[y][x] = original->L[y][x] + difL; } - } - if (chro == 1) { - float difa, difb; + if (chro == 1) { + float difa, difb; - if (call <= 3) { - if (lox >= (lp.xc - lp.lxL) && lox < (lp.xc + lp.lx) && loy >= (lp.yc - lp.lyT) && loy < (lp.yc + lp.ly)) { + if (call <= 3) { difa = tmp1->a[loy - begy - 1][lox - begx - 1] - original->a[y][x]; difb = tmp1->b[loy - begy - 1][lox - begx - 1] - original->b[y][x]; - difa *= (100.f + realstr * falu) / 100.f; - difb *= (100.f + realstr * falu) / 100.f; + difa *= (100.f + realstrch * falu * falL) / 100.f; + difb *= (100.f + realstrch * falu * falL) / 100.f; transformed->a[y][x] = CLIPC (original->a[y][x] + difa); transformed->b[y][x] = CLIPC (original->b[y][x] + difb); } - } else { - difa = tmp1->a[y][x] - original->a[y][x]; - difb = tmp1->b[y][x] - original->b[y][x]; - difa *= (100.f + realstr * falu) / 100.f; - difb *= (100.f + realstr * falu) / 100.f; - transformed->a[y][x] = CLIPC (original->a[y][x] + difa); - transformed->b[y][x] = CLIPC (original->b[y][x] + difb); - } + } } } } @@ -4630,7 +4640,7 @@ void ImProcFunctions::Lab_Local (int call, int sp, float** shbuffer, LabImage * } } - printf ("min=%2.2f max=%f", minc, maxc); + printf ("min=%2.2f max=%2.2f", minc, maxc); } @@ -5028,7 +5038,10 @@ void ImProcFunctions::Lab_Local (int call, int sp, float** shbuffer, LabImage * int GH = transformed->H; LabImage *bufreti; - + float **buflight; + float **bufchro; + float clighL; + float clighc; float **loctemp; float **hbuffer; int bfh = int (lp.ly + lp.lyT) + 1; //bfw bfh real size of square zone @@ -5054,6 +5067,17 @@ void ImProcFunctions::Lab_Local (int call, int sp, float** shbuffer, LabImage * Hd = bfh; Wd = bfw; bufreti = new LabImage (bfw, bfh); + buflight = new float*[bfh];//for lightness reti + + for (int i = 0; i < bfh; i++) { + buflight[i] = new float[bfw]; + } + + bufchro = new float*[bfh];//for chroma reti + + for (int i = 0; i < bfh; i++) { + bufchro[i] = new float[bfw]; + } /* bufreti = new float*[bfh]; @@ -5148,17 +5172,41 @@ void ImProcFunctions::Lab_Local (int call, int sp, float** shbuffer, LabImage * float minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax; ImProcFunctions::MSRLocal (orig, tmpl->L, orig1, Wd, Hd, params->locallab, sk, locRETgainCcurve, 0, 4, 0.8f, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax); #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) + // #pragma omp parallel for schedule(dynamic,16) #endif + float maxc = -10000000.f; + float minc = +10000.f; for (int ir = 0; ir < Hd; ir += 1) for (int jr = 0; jr < Wd; jr += 1) { tmpl->L[ir][jr] = orig[ir][jr]; + clighL = 0.f; + float amplil = 1.f; + + if (!lp.invret) { + float rL; + rL = CLIPRET ((tmpl->L[ir][jr] - bufreti->L[ir][jr]) / 328.f); + /* + if (rL > maxc) { + maxc = rL; + } + + if (rL < minc) { + minc = rL; + } + */ + buflight[ir][jr] = rL; + } } +// printf ("min=%2.2f max=%2.2f", minc, maxc); + +//new shape detection + + if (!lp.invret) { - Reti_Local (call, hueplus, huemoins, hueref, dhueret, chromaref, lumaref, lp, deltE, original, transformed, tmpl, cx, cy, 0); + Reti_Local (call, buflight, bufchro, hueplus, huemoins, hueref, dhueret, chromaref, lumaref, lp, deltE, original, transformed, tmpl, cx, cy, 0); } else { InverseReti_Local (lp, original, transformed, tmpl, cx, cy, 0); } @@ -5196,9 +5244,12 @@ void ImProcFunctions::Lab_Local (int call, int sp, float** shbuffer, LabImage * if (!lp.invret && call <= 3) { #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) + // #pragma omp parallel for schedule(dynamic,16) #endif + float maxch = -10000000.f; + float minch = +10000.f; + for (int ir = 0; ir < Hd; ir += 1) for (int jr = 0; jr < Wd; jr += 1) { float Chprov = orig1[ir][jr]; @@ -5208,8 +5259,29 @@ void ImProcFunctions::Lab_Local (int call, int sp, float** shbuffer, LabImage * tmpl->a[ir][jr] = orig[ir][jr] * sincosval.y; tmpl->b[ir][jr] = orig[ir][jr] * sincosval.x; + clighc = 0.f; + float amplil = 1.f; + + if (!lp.invret) { + + float ra; + ra = CLIPRET ((sqrt (SQR (tmpl->a[ir][jr]) + SQR (tmpl->b[ir][jr])) - Chprov) / 300.f); + /* + if (ra > maxch) { + maxch = ra; + } + + if (ra < minch) { + minch = ra; + } + */ + bufchro[ir][jr] = ra; + } + } +// printf ("minch=%2.2f maxch=%2.2f", minch, maxch); + } else { #ifdef _OPENMP @@ -5230,7 +5302,7 @@ void ImProcFunctions::Lab_Local (int call, int sp, float** shbuffer, LabImage * if (!lp.invret) { - Reti_Local (call, hueplus, huemoins, hueref, dhueret, chromaref, lumaref, lp, deltE, original, transformed, tmpl, cx, cy, 1); + Reti_Local (call, buflight, bufchro, hueplus, huemoins, hueref, dhueret, chromaref, lumaref, lp, deltE, original, transformed, tmpl, cx, cy, 1); } else { InverseReti_Local (lp, original, transformed, tmpl, cx, cy, 1); } @@ -5244,6 +5316,19 @@ void ImProcFunctions::Lab_Local (int call, int sp, float** shbuffer, LabImage * if (!lp.invret && call <= 3) { delete bufreti; + + for (int i = 0; i < bfh; i++) { + delete [] buflight[i]; + } + + delete [] buflight; + + for (int i = 0; i < bfh; i++) { + delete [] bufchro[i]; + } + + delete [] bufchro; + } } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 6d0f67ff9..a9be96220 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -886,7 +886,7 @@ void LocallabParams::setDefaults() centerX = 0; centerY = 0; circrad = 18; - qualityMethod = "std"; + qualityMethod = "enhden"; qualitycurveMethod = "none"; proxi = 20; thres = 18; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 5ff4bd9c7..b1fe30813 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -428,12 +428,22 @@ Locallab::Locallab (): shapeVBox->pack_start (*centerX); shapeVBox->pack_start (*centerY); shapeVBox->pack_start (*circrad); - //shapeVBox->pack_start (*activlum); qualbox->pack_start (*labqual, Gtk::PACK_SHRINK, 4); qualbox->pack_start (*qualityMethod); shapeVBox->pack_start (*qualbox); -// shapeVBox->pack_start (*thres); -// shapeVBox->pack_start (*proxi); + shapeVBox->pack_start (*transit); + + artifFrame->set_border_width (0); + artifFrame->set_label_align (0.025, 0.5); + artifFrame->set_tooltip_text (M ("TP_LOCALLAB_ARTIF_TOOLTIP")); + + artifVBox->set_spacing (2); + artifVBox->set_border_width (4); + + artifVBox->pack_start (*thres); + artifVBox->pack_start (*proxi); + artifFrame->add (*artifVBox); + shapeVBox->pack_start (*artifFrame); shapeFrame->add (*shapeVBox); pack_start (*shapeFrame); @@ -549,7 +559,6 @@ Locallab::Locallab (): superVBox->pack_start (*lightness); -// colorVBox->pack_start (*curvactiv); superVBox->pack_start (*contrast); superFrame->add (*superVBox); colorVBox->pack_start (*superFrame); @@ -564,17 +573,6 @@ Locallab::Locallab (): colorVBox->pack_start (*llCurveEditorG, Gtk::PACK_SHRINK, 2); - artifFrame->set_border_width (0); - artifFrame->set_label_align (0.025, 0.5); - - artifVBox->set_spacing (2); - artifVBox->set_border_width (4); - - artifVBox->pack_start (*thres); - artifVBox->pack_start (*proxi); - artifFrame->add (*artifVBox); - - colorVBox->pack_start (*artifFrame); colorVBox->pack_start (*invers); expcolor->add (*colorVBox); @@ -627,7 +625,7 @@ Locallab::Locallab (): pack_start (*expdenoi); - pack_start (*transit); +// pack_start (*transit); pack_start (*avoid);//keep avoid clor shift in case of neutrHBox = Gtk::manage (new Gtk::HBox ());