From 7af94625b6bfedf387de26890982f8e3b873a911 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 28 Dec 2019 18:12:57 +0100 Subject: [PATCH] Improvment to wavelet pyramid and chnage some labels --- rtdata/languages/default | 1 + rtengine/iplocallab.cc | 25 +++++++++++++++---------- rtgui/locallab.cc | 18 +++++++++++++++++- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 85f7babc3..07779e638 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2307,6 +2307,7 @@ TP_LOCALLAB_EXPMETHOD_TOOLTIP;Standard : use an algorithm similar as main Exposu TP_LOCALLAB_EXPOSE;Exposure TP_LOCALLAB_EXPOSURE_TOOLTIP;In some cases (strong shadows ..) you can use the module "Shadows Highlights" TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools +TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39 TP_LOCALLAB_EXPTOOL;Tools exposure TP_LOCALLAB_EXPTRC;Tone Response Curve - TRC TP_LOCALLAB_FATAMOUNT;Amount diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 109b5100c..2ffc588c7 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -7116,7 +7116,7 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f const LocwavCurve & loccompwavCurve, bool & loccompwavutili, bool wavcurvecomp, float sigm, float offs, int & maxlvl, float fatdet, float fatanch, float chromalev, float chromablu, bool blurlc) { - wavelet_decomposition *wdspot = new wavelet_decomposition(tmp[0], bfw, bfh, level_br, 1, sk, numThreads, 6); + wavelet_decomposition *wdspot = new wavelet_decomposition(tmp[0], bfw, bfh, maxlvl, 1, sk, numThreads, 6); //first decomposition for compress dynamic range positive values and other process if (wdspot->memoryAllocationFailed) { @@ -7404,7 +7404,7 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f delete wdspot; if (wavcurvecon && (chromalev != 1.f)) { // a and b if need ) {//contrast by levels for chroma a and b - wdspota = new wavelet_decomposition(tmpa[0], bfw, bfh, level_br, 1, sk, numThreads, 6); + wdspota = new wavelet_decomposition(tmpa[0], bfw, bfh, maxlvl, 1, sk, numThreads, 6); if (wdspota->memoryAllocationFailed) { return; @@ -7414,7 +7414,7 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f wdspota->reconstruct(tmpa[0], 1.f); delete wdspota; - wdspotb = new wavelet_decomposition(tmpb[0], bfw, bfh, level_br, 1, sk, numThreads, 6); + wdspotb = new wavelet_decomposition(tmpb[0], bfw, bfh, maxlvl, 1, sk, numThreads, 6); if (wdspotb->memoryAllocationFailed) { return; @@ -7429,7 +7429,7 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f if (wavcurvelev && radlevblur > 0.f) {//chroma blur if need if (!blurlc) { // a - wdspota = new wavelet_decomposition(tmpa[0], bfw, bfh, level_br, 1, sk, numThreads, 6); + wdspota = new wavelet_decomposition(tmpa[0], bfw, bfh, maxlvl, 1, sk, numThreads, 6); if (wdspota->memoryAllocationFailed) { return; @@ -7483,7 +7483,7 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f //b - wdspotb = new wavelet_decomposition(tmpb[0], bfw, bfh, level_br, 1, sk, numThreads, 6); + wdspotb = new wavelet_decomposition(tmpb[0], bfw, bfh, maxlvl, 1, sk, numThreads, 6); if (wdspotb->memoryAllocationFailed) { return; @@ -11427,8 +11427,8 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o } } - } else if (lp.locmet == 1) { //wavelet - int wavelet_level = params->locallab.spots.at(sp).levelwav; + } else if (lp.locmet == 1) { //wavelet && sk ==1 + int wavelet_level = params->locallab.spots.at(sp).csthreshold.getBottomRight(); float mL = (float)(params->locallab.spots.at(sp).clarilres / 100.f); float mC = (float)(params->locallab.spots.at(sp).claricres / 100.f); float softr = (float)(params->locallab.spots.at(sp).clarisoft); @@ -11444,12 +11444,15 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o int minwin = min(bfw, bfh); int maxlevelspot = 9; + // adap maximum level wavelet to size of crop while ((1 << maxlevelspot) >= (minwin * sk) && maxlevelspot > 1) { --maxlevelspot ; } - wavelet_level = min(wavelet_level, maxlevelspot); + // printf("minwin=%i maxlevelavant=%i maxlespot=%i\n", minwin, wavelet_level, maxlevelspot); + wavelet_level = min(wavelet_level, maxlevelspot); + // printf("maxlevel=%i\n", wavelet_level); bool exec = false; bool origlc = params->locallab.spots.at(sp).origlc; @@ -11457,7 +11460,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o clarimerge(mL, mC, exec, tmpresid.get(), wavelet_level, sk, numThreads); } - int maxlvl; + int maxlvl = wavelet_level; const float contrast = params->locallab.spots.at(sp).residcont; int level_bl = params->locallab.spots.at(sp).csthreshold.getBottomLeft(); int level_hl = params->locallab.spots.at(sp).csthreshold.getTopLeft(); @@ -11673,10 +11676,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o if (call == 2) { //call from simpleprocess printf("bfw=%i bfh=%i\n", bfw, bfh); - if(bfw < mSPsharp || bfh < mSPsharp ) { + + if (bfw < mSPsharp || bfh < mSPsharp) { printf("too small RT-spot - minimum size 39 * 39\n"); return; } + JaggedArray bufsh(bfw, bfh, true); JaggedArray hbuffer(bfw, bfh); int begy = lp.yc - lp.lyT; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index d0363f91f..2564384c7 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -229,7 +229,8 @@ Locallab::Locallab(): expsharp(Gtk::manage(new MyExpander(true, Gtk::manage(new Gtk::HBox())))), // expcontrastpyr(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_LOC_CONTRASTPYR")))), expcontrastpyr(Gtk::manage(new MyExpander(false, Gtk::manage(new Gtk::HBox())))), - expcontrast(Gtk::manage(new MyExpander(true,M("TP_LOCALLAB_LOC_CONTRAST")))), + expcontrast(Gtk::manage(new MyExpander(true, Gtk::manage(new Gtk::HBox())))), +// expcontrast(Gtk::manage(new MyExpander(true,M("TP_LOCALLAB_LOC_CONTRAST")))), expcbdl(Gtk::manage(new MyExpander(true, Gtk::manage(new Gtk::HBox())))), expdenoi(Gtk::manage(new MyExpander(true, Gtk::manage(new Gtk::HBox())))), explog(Gtk::manage(new MyExpander(true, M("TP_LOCALLAB_LOG")))), @@ -2752,6 +2753,11 @@ pe(nullptr) sharpTitleHBox->pack_end(*sharpImage, Gtk::PACK_SHRINK, 0); expsharp->setLabel(sharpTitleHBox); expsharp->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Locallab::foldAllButMe), expsharp)); + + if (showtooltip) { + expsharp->set_tooltip_text(M("TP_LOCALLAB_EXPSHARP_TOOLTIP")); + } + enablesharpConn = expsharp->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Locallab::enableToggled), expsharp)); sharcontrast->setAdjusterListener(this); @@ -2799,6 +2805,16 @@ pe(nullptr) panel->pack_start(*expsharp, false, false); // Local Contrast + Gtk::HBox* const contTitleHBox = Gtk::manage(new Gtk::HBox()); + Gtk::Label* const contLabel = Gtk::manage(new Gtk::Label()); + contLabel->set_markup(Glib::ustring("") + escapeHtmlChars(M("TP_LOCALLAB_LOC_CONTRAST")) + Glib::ustring("")); + contLabel->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + contTitleHBox->pack_start(*contLabel, Gtk::PACK_EXPAND_WIDGET, 0); + RTImage* const contImage = Gtk::manage(new RTImage("one-to-one-small.png")); + + contTitleHBox->pack_end(*contImage, Gtk::PACK_SHRINK, 0); + expcontrast->setLabel(contTitleHBox); + expcontrast->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Locallab::foldAllButMe), expcontrast)); enablecontrastConn = expcontrast->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Locallab::enableToggled), expcontrast)); fftwlcConn = fftwlc->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::fftwlcChanged));