From 7868cc160a5bf0b099de142318ecffcbd85e0a57 Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 5 Jun 2020 14:50:27 +0200 Subject: [PATCH] Improvments to sharp --- rtengine/improcfun.h | 2 +- rtengine/iplocallab.cc | 6 +++--- rtengine/ipsharpen.cc | 19 ++++++++++++------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 93fccb06b..be791569e 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -202,7 +202,7 @@ public: void Lanczos(const Imagefloat* src, Imagefloat* dst, float scale); void deconvsharpening(float** luminance, float** buffer, const float* const * blend, int W, int H, const procparams::SharpeningParams &sharpenParam, double Scale); - void deconvsharpeningloc(float** luminance, float** buffer, int W, int H, float** loctemp, int damp, double radi, int ite, int amo, int contrast, double blurrad); + void deconvsharpeningloc(float** luminance, float** buffer, int W, int H, float** loctemp, int damp, double radi, int ite, int amo, int contrast, double blurrad, int sk); void MLsharpen(LabImage* lab); // Manuel's clarity / sharpening void MLmicrocontrast(float** luminance, int W, int H); //Manuel's microcontrast diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 55756bc9d..6ade63757 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -12829,9 +12829,9 @@ void ImProcFunctions::Lab_Local( } //sharpen only square area instaed of all image - ImProcFunctions::deconvsharpeningloc(bufsh, hbuffer, bfw, bfh, loctemp, params->locallab.spots.at(sp).shardamping, (double)params->locallab.spots.at(sp).sharradius, params->locallab.spots.at(sp).shariter, params->locallab.spots.at(sp).sharamount, params->locallab.spots.at(sp).sharcontrast, (double)params->locallab.spots.at(sp).sharblur); + ImProcFunctions::deconvsharpeningloc(bufsh, hbuffer, bfw, bfh, loctemp, params->locallab.spots.at(sp).shardamping, (double)params->locallab.spots.at(sp).sharradius, params->locallab.spots.at(sp).shariter, params->locallab.spots.at(sp).sharamount, params->locallab.spots.at(sp).sharcontrast, (double)params->locallab.spots.at(sp).sharblur, 1); } else { //call from dcrop.cc - ImProcFunctions::deconvsharpeningloc(original->L, shbuffer, bfw, bfh, loctemp, params->locallab.spots.at(sp).shardamping, (double)params->locallab.spots.at(sp).sharradius, params->locallab.spots.at(sp).shariter, params->locallab.spots.at(sp).sharamount, params->locallab.spots.at(sp).sharcontrast, (double)params->locallab.spots.at(sp).sharblur); + ImProcFunctions::deconvsharpeningloc(original->L, shbuffer, bfw, bfh, loctemp, params->locallab.spots.at(sp).shardamping, (double)params->locallab.spots.at(sp).sharradius, params->locallab.spots.at(sp).shariter, params->locallab.spots.at(sp).sharamount, params->locallab.spots.at(sp).sharcontrast, (double)params->locallab.spots.at(sp).sharblur, sk); } //sharpen ellipse and transition @@ -12848,7 +12848,7 @@ void ImProcFunctions::Lab_Local( int GH = original->H; JaggedArray loctemp(GW, GH); - ImProcFunctions::deconvsharpeningloc(original->L, shbuffer, GW, GH, loctemp, params->locallab.spots.at(sp).shardamping, (double)params->locallab.spots.at(sp).sharradius, params->locallab.spots.at(sp).shariter, params->locallab.spots.at(sp).sharamount, params->locallab.spots.at(sp).sharcontrast, (double)params->locallab.spots.at(sp).sharblur); + ImProcFunctions::deconvsharpeningloc(original->L, shbuffer, GW, GH, loctemp, params->locallab.spots.at(sp).shardamping, (double)params->locallab.spots.at(sp).sharradius, params->locallab.spots.at(sp).shariter, params->locallab.spots.at(sp).sharamount, params->locallab.spots.at(sp).sharcontrast, (double)params->locallab.spots.at(sp).sharblur, sk); InverseSharp_Local(loctemp, hueref, lumaref, chromaref, lp, original, transformed, cx, cy, sk); diff --git a/rtengine/ipsharpen.cc b/rtengine/ipsharpen.cc index 214397d37..afe6f8aa3 100644 --- a/rtengine/ipsharpen.cc +++ b/rtengine/ipsharpen.cc @@ -244,27 +244,31 @@ BENCHFUN delete blurbuffer; } -void ImProcFunctions::deconvsharpeningloc (float** luminance, float** tmp, int W, int H, float** loctemp, int damp, double radi, int ite, int amo, int contrast, double blurrad) +void ImProcFunctions::deconvsharpeningloc (float** luminance, float** tmp, int W, int H, float** loctemp, int damp, double radi, int ite, int amo, int contrast, double blurrad, int sk) { // BENCHFUN if (amo < 1) { return; } + JaggedArray blend(W, H); + float contras = contrast / 100.f; + buildBlendMask(luminance, blend, W, H, contras, 1.f); + + JaggedArray tmpI(W, H); +#ifdef _OPENMP + #pragma omp parallel for +#endif for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { - tmpI[i][j] = luminance[i][j]; + tmpI[i][j] = max(luminance[i][j], 0.f); } } // calculate contrast based blend factors to reduce sharpening in regions with low contrast - JaggedArray blend(W, H); - float contras = contrast / 100.f; - buildBlendMask(luminance, blend, W, H, contras, 1.f); - JaggedArray blur(W, H); JaggedArray* blurbuffer = nullptr; @@ -289,7 +293,7 @@ void ImProcFunctions::deconvsharpeningloc (float** luminance, float** tmp, int W float damping = (float) damp / 5.0; bool needdamp = damp > 0; - double sigma = radi / scale; + double sigma = radi / sk; const float amount = (float) amo / 100.f; if (sigma < 0.26f) { @@ -327,6 +331,7 @@ void ImProcFunctions::deconvsharpeningloc (float** luminance, float** tmp, int W } if (blurrad >= 0.25) { + JaggedArray &blur = *blurbuffer; #ifdef _OPENMP #pragma omp for #endif