From 5714c018ac7e0b79d137f80e9fba263bd1859760 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 5 Apr 2019 23:02:16 +0200 Subject: [PATCH] newlocallab: speedup for exposure spots. Also further cleanups --- rtengine/improcfun.h | 2 +- rtengine/iplocallab.cc | 36 ++++++++++++++++-------------------- 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 7527f6c66..73d413d23 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -310,7 +310,7 @@ public: void blendstruc(int bfw, int bfh, LabImage* bufcolorig, float radius, float stru, array2D & blend2, int sk, bool multiThread); void transit_shapedetect_retinex(int senstype, LabImage * bufexporig, float **buflight, float **bufchro, float ** bufhh, bool HHutili, const float hueref, const float chromaref, const float lumaref, float sobelref, float meansobel, const struct local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk); - void transit_shapedetect(int senstype, LabImage * bufexporig, LabImage * originalmask, float **buflight, float **bufchro, float **buf_a_cat, float ** buf_b_cat, float ** bufhh, bool HHutili, const float hueref, const float chromaref, const float lumaref, float sobelref, float meansobel, float ** blend2, const struct local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk); + void transit_shapedetect(int senstype, const LabImage *bufexporig, LabImage * originalmask, float **buflight, float **bufchro, float **buf_a_cat, float ** buf_b_cat, float ** bufhh, bool HHutili, const float hueref, const float chromaref, const float lumaref, float sobelref, float meansobel, float ** blend2, const struct local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk); void exlabLocal(const local_params& lp, int bfh, int bfw, LabImage* bufexporig, LabImage* lab, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve); void Exclude_Local(float **deltaso, float hueref, float chromaref, float lumaref, float sobelref, float meansobel, const struct local_params & lp, const LabImage * original, LabImage * transformed, const LabImage * rsv, const LabImage * reserv, int cx, int cy, int sk); diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 89a760a6b..3d4ea4ab9 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -2677,7 +2677,7 @@ void ImProcFunctions::transit_shapedetect_retinex(int senstype, LabImage * bufex } -void ImProcFunctions::transit_shapedetect(int senstype, LabImage * bufexporig, LabImage * originalmask, float **buflight, float **bufchro, float **buf_a_cat, float ** buf_b_cat, float ** bufhh, bool HHutili, const float hueref, const float chromaref, const float lumaref, float sobelref, float meansobel, float ** blend2, const struct local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk) +void ImProcFunctions::transit_shapedetect(int senstype, const LabImage *bufexporig, LabImage * originalmask, float **buflight, float **bufchro, float **buf_a_cat, float ** buf_b_cat, float ** bufhh, bool HHutili, const float hueref, const float chromaref, const float lumaref, float sobelref, float meansobel, float ** blend2, const struct local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk) { BENCHFUN { @@ -2699,8 +2699,6 @@ void ImProcFunctions::transit_shapedetect(int senstype, LabImage * bufexporig, L varsens = lp.sensv; } else if (senstype == 3) { //soft light varsens = lp.senssf; - } else if (senstype == 4 || senstype == 5) { //retinex - varsens = lp.sensh; } else if (senstype == 6 || senstype == 7) { //cbdl varsens = lp.senscb; } else if (senstype == 8) { //TM @@ -2754,12 +2752,11 @@ void ImProcFunctions::transit_shapedetect(int senstype, LabImage * bufexporig, L const bool usemaskSH = (lp.showmaskSHmet == 2 || lp.enaSHMask || lp.showmaskSHmet == 4) && senstype == 9; const bool usemaskall = (usemaskSH || usemaskcol || usemaskexp); - if (usemaskall) - { + if (usemaskall) { origblurmask.reset(new LabImage(bfw, bfh)); #ifdef _OPENMP - #pragma omp parallel + #pragma omp parallel if (multiThread) #endif { gaussianBlur(originalmask->L, origblurmask->L, bfw, bfh, radius); @@ -2769,7 +2766,7 @@ void ImProcFunctions::transit_shapedetect(int senstype, LabImage * bufexporig, L } #ifdef _OPENMP - #pragma omp parallel + #pragma omp parallel if (multiThread) #endif { #ifdef _OPENMP @@ -2807,8 +2804,7 @@ void ImProcFunctions::transit_shapedetect(int senstype, LabImage * bufexporig, L #pragma omp for schedule(dynamic,16) #endif - for (int y = ystart; y < yend; y++) - { + for (int y = ystart; y < yend; y++) { const int loy = cy + y; #ifdef __SSE2__ @@ -2856,7 +2852,7 @@ void ImProcFunctions::transit_shapedetect(int senstype, LabImage * bufexporig, L const float rL = origblur->L[y - ystart][x - xstart] / 327.68f; float rsob = 0.f; - if (senstype <= 1 && blend2 && (lp.struexp > 0.f || lp.struco > 0.f)) { + if (blend2 && ((senstype == 1 && lp.struexp > 0.f) || (senstype == 0 && lp.struco > 0.f))) { const float csob = xlogf(1.f + std::min(blend2[y - ystart][x - xstart] / 100.f, 60.f) + 0.001f); float rs; @@ -2865,9 +2861,9 @@ void ImProcFunctions::transit_shapedetect(int senstype, LabImage * bufexporig, L } else { rs = csob / sobelref; } - if (lp.struexp > 0.f && rs > 0.f && senstype == 1) { + if (rs > 0.f && senstype == 1) { rsob = 1.1f * lp.struexp * rs; - } else if (lp.struco > 0.f && rs > 0.f && senstype == 0) { + } else if (rs > 0.f && senstype == 0) { rsob = 1.1f * lp.struco * rs; } } @@ -2910,7 +2906,7 @@ void ImProcFunctions::transit_shapedetect(int senstype, LabImage * bufexporig, L float diflc = 0.f; float newhr = 0.f; - if (senstype == 4 || senstype == 6 || senstype == 2 || senstype == 3 || senstype == 8) {//all except color and light (TODO) and exposure + if (senstype == 6 || senstype == 2 || senstype == 3 || senstype == 8) {//all except color and light (TODO) and exposure const float lightc = bufexporig->L[y - ystart][x - xstart]; const float fli = (100.f + realstrdE) / 100.f; transformed->L[y][x] = CLIP(original->L[y][x] + (lightc * fli - original->L[y][x]) * factorx); @@ -2948,7 +2944,7 @@ void ImProcFunctions::transit_shapedetect(int senstype, LabImage * bufexporig, L const float chra = bufexporig->a[y - ystart][x - xstart]; const float chrb = bufexporig->b[y - ystart][x - xstart]; - if (senstype == 4 || senstype == 6 || senstype == 2 || senstype == 3 || senstype == 8 || senstype == 9) { + if (senstype == 6 || senstype == 2 || senstype == 3 || senstype == 8 || senstype == 9) { flia = flib = ((100.f + realstrchdE) / 100.f); } else if (senstype == 1) { // printf("rdE=%f chdE=%f", realstradE, realstrchdE); @@ -3023,7 +3019,7 @@ void ImProcFunctions::transit_shapedetect(int senstype, LabImage * bufexporig, L float diflc = 0.f; float newhr = 0.f; - if (senstype == 4 || senstype == 6 || senstype == 2 || senstype == 3 || senstype == 8) { //retinex & cbdl + if (senstype == 6 || senstype == 2 || senstype == 3 || senstype == 8) { //retinex & cbdl float lightc = bufexporig->L[y - ystart][x - xstart]; float fli = ((100.f + realstrdE) / 100.f); transformed->L[y][x] = CLIP(original->L[y][x] + lightc * fli - original->L[y][x]); @@ -3061,7 +3057,7 @@ void ImProcFunctions::transit_shapedetect(int senstype, LabImage * bufexporig, L const float chra = bufexporig->a[y - ystart][x - xstart]; const float chrb = bufexporig->b[y - ystart][x - xstart]; - if (senstype == 4 || senstype == 6 || senstype == 2 || senstype == 3 || senstype == 8 || senstype == 9) { + if (senstype == 6 || senstype == 2 || senstype == 3 || senstype == 8 || senstype == 9) { flia = flib = (100.f + realstrchdE) / 100.f; } else if (senstype == 1) { flia = (100.f + realstradE + 100.f * realstrchdE) / 100.f; @@ -6186,9 +6182,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o } } - int spotSi = rtengine::max(1 + 2 * max(1, lp.cir / sk), 5); + const int spotSi = rtengine::max(1 + 2 * max(1, lp.cir / sk), 5); - if (bfw > 2 * spotSi && bfh > 2 * spotSi && lp.struexp >= 0.f) { + if (bfw > 2 * spotSi && bfh > 2 * spotSi && lp.struexp > 0.f) { blend2(bfw, bfh); ImProcFunctions::blendstruc(bfw, bfh, bufexporig.get(), 3.f / (sk * 1.4f), lp.struexp, blend2, sk, multiThread); @@ -6224,7 +6220,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o std::unique_ptr> ble; std::unique_ptr> guid; - if (lp.showmaskexpmet == 2 || lp.enaExpMask || lp.showmaskexpmet == 3 || lp.showmaskexpmet == 5) { + if (lp.showmaskexpmet == 2 || lp.enaExpMask || lp.showmaskexpmet == 3 || lp.showmaskexpmet == 5) { ble.reset(new array2D(bfw, bfh)); guid.reset(new array2D(bfw, bfh)); } @@ -6516,7 +6512,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o } const int spotSi = std::max(1 + 2 * max(1, lp.cir / sk), 5); - const bool blend = bfw > 2 * spotSi && bfh > 2 * spotSi && lp.struco >= 0.f; + const bool blend = bfw > 2 * spotSi && bfh > 2 * spotSi && lp.struco > 0.f; if (blend) { blend2(bfw, bfh);