From 266b219f0a0211c5ebef098e641118a373a47e90 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 21 Apr 2020 08:10:06 +0200 Subject: [PATCH] Added Damper to dynamic compression wavelet --- rtdata/languages/default | 2 +- rtengine/improcfun.h | 2 +- rtengine/iplocallab.cc | 80 ++++++++++++++++++++++++++++++++++------ 3 files changed, 71 insertions(+), 13 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 5f0d712e3..8e6a29af4 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2654,7 +2654,7 @@ TP_LOCALLAB_SHOWSTRUC;Show structure Spot TP_LOCALLAB_SHOWSTRUCEX;Show structure Spot - disabled in "normal" TP_LOCALLAB_SHOWT;4 - Mask and modifications TP_LOCALLAB_SHOWVI;3 - Mask and modifications -TP_LOCALLAB_SIGMAWAV;Sigma +TP_LOCALLAB_SIGMAWAV;Damper TP_LOCALLAB_SIM;Simple TP_LOCALLAB_SLOMASKCOL;Slope mask TP_LOCALLAB_SLOSH;Slope diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index d47a6f60e..c2182cf5a 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -338,7 +338,7 @@ public: const LocwavCurve & locedgwavCurve, bool & locedgwavutili, float sigm, float offs,int & maxlvl, float fatdet, float fatanch, float chromalev, float chromablu, bool blurlc, bool blurena, bool levelena, bool comprena, bool compreena, float compress, float thres); - void wavcont(wavelet_decomposition &wdspot, float ****templevel, int level_bl, int maxlvl, + void wavcont(struct local_params& lp, wavelet_decomposition &wdspot, float ****templevel, int level_bl, int maxlvl, const LocwavCurve & loclevwavCurve, bool & loclevwavutili, const LocwavCurve & loccompwavCurve, bool & loccompwavutili, const LocwavCurve & loccomprewavCurve, bool & loccomprewavutili, diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index f3d17d24a..5a2ce11e4 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -447,6 +447,7 @@ struct local_params { bool edgwena; bool lip3; int daubLen; + float sigmadr; }; @@ -814,10 +815,10 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall if (wavcurveden) { if (lp.denoiena) { - local_noiself0 = 150.f * locwavCurveden[0]; - local_noiself = 150.f * locwavCurveden[166]; - local_noiself2 = 150.f * locwavCurveden[323]; - local_noiselc = 100.f * locwavCurveden[500]; + local_noiself0 = 250.f * locwavCurveden[0]; + local_noiself = 250.f * locwavCurveden[166]; + local_noiself2 = 250.f * locwavCurveden[323]; + local_noiselc = 200.f * locwavCurveden[500]; } } @@ -1235,6 +1236,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.senshs = local_sensihs; lp.ftwlc = fftwlc; lp.ftwreti = fftwreti; + lp.sigmadr = locallab.spots.at(sp).sigmadr; } @@ -7436,13 +7438,21 @@ void ImProcFunctions::Compresslevels(float **Source, int W_L, int H_L, float com } -void ImProcFunctions::wavcont(wavelet_decomposition &wdspot, float ****templevel, int level_bl, int maxlvl, +void ImProcFunctions::wavcont(struct local_params& lp, wavelet_decomposition &wdspot, float ****templevel, int level_bl, int maxlvl, const LocwavCurve & loclevwavCurve, bool & loclevwavutili, const LocwavCurve & loccompwavCurve, bool & loccompwavutili, const LocwavCurve & loccomprewavCurve, bool & loccomprewavutili, float radlevblur, int process, FattalToneMappingParams &fatParams, float chromablu, float thres) { float madL[10][3]; + int W_L = wdspot.level_W(0); + int H_L = wdspot.level_H(0); + + float * beta = nullptr; + + if (process == 3) { + beta = new float[W_L * H_L]; + } #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) @@ -7514,6 +7524,44 @@ void ImProcFunctions::wavcont(wavelet_decomposition &wdspot, float ****templevel for (int level = level_bl; level < maxlvl; ++level) { int W_L = wdspot.level_W(level); int H_L = wdspot.level_H(level); + float effect = lp.sigmadr; + float offs = 1.f; + float mea[10]; + + for (int co = 0; co < H_L * W_L; co++) { + beta[co] = 1.f; + } + calceffect(level, mean, sigma, mea, effect, offs); + float **WavL = wdspot.level_coeffs(level); + + for (int co = 0; co < H_L * W_L; co++) { + float WavCL = std::fabs(WavL[dir][co]); + + if (WavCL < mea[0]) { + beta[co] = 0.05f; + } else if (WavCL < mea[1]) { + beta[co] = 0.2f; + } else if (WavCL < mea[2]) { + beta[co] = 0.7f; + } else if (WavCL < mea[3]) { + beta[co] = 1.f; //standard + } else if (WavCL < mea[4]) { + beta[co] = 1.f; + } else if (WavCL < mea[5]) { + beta[co] = 0.8f; //+sigma + } else if (WavCL < mea[6]) { + beta[co] = 0.65f; + } else if (WavCL < mea[7]) { + beta[co] = 0.5f; + } else if (WavCL < mea[8]) { + beta[co] = 0.4f; // + 2 sigma + } else if (WavCL < mea[9]) { + beta[co] = 0.25f; + } else { + beta[co] = 0.1f; + } + } + if (loccomprewavCurve && loccomprewavutili) { float klev = (loccomprewavCurve[level * 55.5f] - 0.75f); @@ -7554,12 +7602,22 @@ void ImProcFunctions::wavcont(wavelet_decomposition &wdspot, float ****templevel for (int y = 0; y < H_L; y++) { for (int x = 0; x < W_L; x++) { - wav_L[dir][y * W_L + x] = templevel[dir - 1][level][y][x]; + // wav_L[dir][y * W_L + x] = templevel[dir - 1][level][y][x]; + int j = y * W_L + x; + if (process == 3) { + wav_L[dir][j] = wav_L[dir][j] * (1.f - beta[j]) + beta[j] * templevel[dir - 1][level][y][x]; + } else { + wav_L[dir][j] = templevel[dir - 1][level][y][x]; + } } } } } + if (process == 3) { + delete[] beta; + } + } @@ -7875,15 +7933,15 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float } if (wavcurvelev && radlevblur > 0.f && blurena) { - wavcont(*wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 1, fatParams, 1.f, 0.f); + wavcont(lp, *wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 1, fatParams, 1.f, 0.f); } if (wavcurvecomp && comprena) { - wavcont(*wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 2, fatParams, 1.f, 0.f); + wavcont(lp, *wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 2, fatParams, 1.f, 0.f); } if (wavcurvecompre && compreena) { - wavcont(*wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 3, fatParams, 1.f, thres); + wavcont(lp, *wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 3, fatParams, 1.f, thres); } //free memory templevel @@ -8379,7 +8437,7 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float } if (wavcurvelev && radlevblur > 0.f) { - wavcont(*wdspota, templevela, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 1, fatParams, chromablu, 0.f); + wavcont(lp, *wdspota, templevela, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 1, fatParams, chromablu, 0.f); } wdspota->reconstruct(tmpa[0], 1.f); @@ -8434,7 +8492,7 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float } if (wavcurvelev && radlevblur > 0.f) { - wavcont(*wdspotb, templevelb, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 1, fatParams, chromablu, 0.f); + wavcont(lp, *wdspotb, templevelb, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 1, fatParams, chromablu, 0.f); } wdspotb->reconstruct(tmpb[0], 1.f);