From 134d548862773e29fe6f610b1b12568fba3419b9 Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 10 Oct 2019 16:15:57 +0200 Subject: [PATCH] Add Laplacian threshold to mask CBDL and fixed bug in CBDL --- rtdata/languages/default | 1 + rtengine/dirpyr_equalizer.cc | 25 ++++++------------------- rtengine/iplocallab.cc | 4 +++- rtengine/procevents.h | 1 + rtengine/procparams.cc | 6 +++++- rtengine/procparams.h | 1 + rtengine/refreshmap.cc | 3 ++- rtgui/locallab.cc | 20 +++++++++++++++++++- rtgui/locallab.h | 1 + rtgui/paramsedited.cc | 7 +++++++ rtgui/paramsedited.h | 1 + 11 files changed, 47 insertions(+), 23 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 73a30f2fc..c3127fe4a 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -999,6 +999,7 @@ HISTORY_MSG_758;Local - Reti Laplacian mask HISTORY_MSG_759;Local - Exp Laplacian mask HISTORY_MSG_760;Local - Color Laplacian mask HISTORY_MSG_761;Local - SH Laplacian mask +HISTORY_MSG_762;Local - cbdl Laplacian mask HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction diff --git a/rtengine/dirpyr_equalizer.cc b/rtengine/dirpyr_equalizer.cc index 86e8e7c83..666cf9b6e 100644 --- a/rtengine/dirpyr_equalizer.cc +++ b/rtengine/dirpyr_equalizer.cc @@ -571,25 +571,12 @@ void ImProcFunctions::cbdl_local_temp(float ** src, float ** loctemp, int srcwid float multi[6]; float scalefl[6]; - for (int lv = 0; lv < 6; lv++) { - scalefl[lv] = ((float) scalesloc[lv]) / (float) scaleprev; - - if (lv >= 1) { - if (scalefl[lv] < 1.f) { - if (mult[lv] > 1.f) { - multi[lv] = (atten123 * ((float) mult[lv] - 1.f) / 100.f) + 1.f; //modulate action if zoom < 100% - } - } else { - multi[lv] = (float) mult[lv]; - } - } else { - if (scalefl[lv] < 1.f) { - if (mult[lv] > 1.f) { - multi[lv] = (atten0 * ((float) mult[lv] - 1.f) / 100.f) + 1.f; //modulate action if zoom < 100% - } - } else { - multi[lv] = (float) mult[lv]; - } + for (int lv = 0; lv < 6; ++lv) { + if (scalesloc[lv] < scaleprev) { + const float factor = lv >= 1 ? atten123 : atten0; + multi[lv] = (factor * ((float) mult[lv] - 1.f) / 100.f) + 1.f; //modulate action if zoom < 100% + } else { + multi[lv] = mult[lv]; } } diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index a50b1429b..7aea87c2f 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -7326,9 +7326,11 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float gamma = lp.gammacb; float slope = lp.slomacb; float blendm = lp.blendmacb; + float lap = params->locallab.spots.at(sp).lapmaskcb; + maskcalccol(false, bfw, bfh, xstart, ystart, sk, cx, cy, loctemp.get(), bufmaskorigcb.get(), originalmaskcb.get(), original, inv, lp, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, 0.f, gamma, slope, blendm); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm); if (lp.showmaskcbmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, loctemp.get(), transformed, bufmaskorigcb.get(), 0); diff --git a/rtengine/procevents.h b/rtengine/procevents.h index bb2147dd1..3457244e4 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -788,6 +788,7 @@ enum ProcEventCode { Evlocallablapmaskexp = 758, Evlocallablapmaskcol = 759, EvlocallablapmaskSH = 760, + Evlocallablapmaskcb = 761, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 2775c9be7..eb2261bf0 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2657,10 +2657,11 @@ LocallabParams::LocallabSpot::LocallabSpot() : LLmaskcbcurve{(double)FCT_MinMaxCPoints, 0.0, 1.0, 0.35, 0.35, 0.50, 1.0, 0.35, 0.35, 1.0, 1.0, 0.35, 0.35}, HHmaskcbcurve{(double)FCT_MinMaxCPoints, 0.0, 1.0, 0.35, 0.35, 0.50, 1.0, 0.35, 0.35, 1.0, 1.0, 0.35, 0.35}, blendmaskcb(0), - radmaskcb(10.0), + radmaskcb(0.0), chromaskcb(0.0), gammaskcb(1.0), slomaskcb(0.0), + lapmaskcb(0.0), // Denoise expdenoi(false), noiselumf(0), @@ -2944,6 +2945,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && chromaskcb == other.chromaskcb && gammaskcb == other.gammaskcb && slomaskcb == other.slomaskcb + && lapmaskcb == other.lapmaskcb // Denoise && expdenoi == other.expdenoi && noiselumf == other.noiselumf @@ -4199,6 +4201,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).chromaskcb, "Locallab", "Chromaskcb_" + std::to_string(i), spot.chromaskcb, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).gammaskcb, "Locallab", "Gammaskcb_" + std::to_string(i), spot.gammaskcb, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).slomaskcb, "Locallab", "Slomaskcb_" + std::to_string(i), spot.slomaskcb, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).lapmaskcb, "Locallab", "Lapmaskcb_" + std::to_string(i), spot.lapmaskcb, keyFile); // Denoise saveToKeyfile(!pedited || pedited->locallab.spots.at(i).expdenoi, "Locallab", "Expdenoi_" + std::to_string(i), spot.expdenoi, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).noiselumf, "Locallab", "noiselumf_" + std::to_string(i), spot.noiselumf, keyFile); @@ -5586,6 +5589,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Chromaskcb_" + std::to_string(i), pedited, spot.chromaskcb, spotEdited.chromaskcb); assignFromKeyfile(keyFile, "Locallab", "Gammaskcb_" + std::to_string(i), pedited, spot.gammaskcb, spotEdited.gammaskcb); assignFromKeyfile(keyFile, "Locallab", "Slomaskcb_" + std::to_string(i), pedited, spot.slomaskcb, spotEdited.slomaskcb); + assignFromKeyfile(keyFile, "Locallab", "Lapmaskcb_" + std::to_string(i), pedited, spot.lapmaskcb, spotEdited.lapmaskcb); // Denoise assignFromKeyfile(keyFile, "Locallab", "Expdenoi_" + std::to_string(i), pedited, spot.expdenoi, spotEdited.expdenoi); assignFromKeyfile(keyFile, "Locallab", "noiselumf_" + std::to_string(i), pedited, spot.noiselumf, spotEdited.noiselumf); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index e47ee1a5c..22cabc383 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1210,6 +1210,7 @@ struct LocallabParams { double chromaskcb; double gammaskcb; double slomaskcb; + double lapmaskcb; // Denoise bool expdenoi; int noiselumf; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index ad4d4f68e..ad6b49274 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -787,7 +787,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //Evlocallablapmaskreti LUMINANCECURVE, //Evlocallablapmaskexp LUMINANCECURVE, //Evlocallablapmaskcol - LUMINANCECURVE //EvlocallablapmaskSH + LUMINANCECURVE, //EvlocallablapmaskSH + LUMINANCECURVE //Evlocallablapmaskcb }; namespace rtengine diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 066d3df40..a8b5eb5f0 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -319,10 +319,11 @@ Locallab::Locallab(): sensicb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSICB"), 0, 100, 1, 15))), softradiuscb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOFTRADIUSCOL"), 0.0, 100.0, 0.5, 0.))), blendmaskcb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKCOL"), -100, 100, 1, 0))), - radmaskcb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 10.))), + radmaskcb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 0.))), chromaskcb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), gammaskcb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMMASKCOL"), 0.25, 4.0, 0.01, 1.))), slomaskcb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOMASKCOL"), 0.0, 15.0, 0.1, 0.))), + lapmaskcb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPMASKCOL"), 0.0, 100.0, 0.1, 0.))), // Denoise noiselumf(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELUMFINE"), MINCHRO, MAXCHRO, 1, 0))), noiselumf0(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELUMFINEZERO"), MINCHRO, MAXCHRO, 1, 0))), @@ -1779,6 +1780,7 @@ Locallab::Locallab(): chromaskcb->setAdjusterListener(this); gammaskcb->setAdjusterListener(this); slomaskcb->setAdjusterListener(this); + lapmaskcb->setAdjusterListener(this); enacbMaskConn = enacbMask->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::enacbMaskChanged)); @@ -1854,6 +1856,7 @@ Locallab::Locallab(): maskcbBox->pack_start(*maskcbCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor maskcbBox->pack_start(*blendmaskcb, Gtk::PACK_SHRINK, 0); maskcbBox->pack_start(*radmaskcb, Gtk::PACK_SHRINK, 0); + maskcbBox->pack_start(*lapmaskcb, Gtk::PACK_SHRINK, 0); maskcbBox->pack_start(*chromaskcb, Gtk::PACK_SHRINK, 0); maskcbBox->pack_start(*gammaskcb, Gtk::PACK_SHRINK, 0); maskcbBox->pack_start(*slomaskcb, Gtk::PACK_SHRINK, 0); @@ -3312,6 +3315,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).chromaskcb = chromaskcb->getValue(); pp->locallab.spots.at(pp->locallab.selspot).gammaskcb = gammaskcb->getValue(); pp->locallab.spots.at(pp->locallab.selspot).slomaskcb = slomaskcb->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).lapmaskcb = lapmaskcb->getValue(); // Denoise pp->locallab.spots.at(pp->locallab.selspot).expdenoi = expdenoi->getEnabled(); @@ -3588,6 +3592,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pe->locallab.spots.at(pp->locallab.selspot).chromaskcb = pe->locallab.spots.at(pp->locallab.selspot).chromaskcb || chromaskcb->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).gammaskcb = pe->locallab.spots.at(pp->locallab.selspot).gammaskcb || gammaskcb->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).slomaskcb = pe->locallab.spots.at(pp->locallab.selspot).slomaskcb || slomaskcb->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).lapmaskcb = pe->locallab.spots.at(pp->locallab.selspot).lapmaskcb || lapmaskcb->getEditedState(); // Denoise pe->locallab.spots.at(pp->locallab.selspot).expdenoi = pe->locallab.spots.at(pp->locallab.selspot).expdenoi || !expdenoi->get_inconsistent(); @@ -3867,6 +3872,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).chromaskcb = pedited->locallab.spots.at(pp->locallab.selspot).chromaskcb || chromaskcb->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).gammaskcb = pedited->locallab.spots.at(pp->locallab.selspot).gammaskcb || gammaskcb->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).slomaskcb = pedited->locallab.spots.at(pp->locallab.selspot).slomaskcb || slomaskcb->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).lapmaskcb = pedited->locallab.spots.at(pp->locallab.selspot).lapmaskcb || lapmaskcb->getEditedState(); // Denoise pedited->locallab.spots.at(pp->locallab.selspot).expdenoi = pedited->locallab.spots.at(pp->locallab.selspot).expdenoi || !expdenoi->get_inconsistent(); @@ -5659,6 +5665,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chromaskcb->setDefault(defSpot->chromaskcb); gammaskcb->setDefault(defSpot->gammaskcb); slomaskcb->setDefault(defSpot->slomaskcb); + lapmaskcb->setDefault(defSpot->lapmaskcb); // Denoise noiselumf->setDefault((double)defSpot->noiselumf); @@ -5829,6 +5836,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chromaskcb->setDefaultEditedState(Irrelevant); gammaskcb->setDefaultEditedState(Irrelevant); slomaskcb->setDefaultEditedState(Irrelevant); + lapmaskcb->setDefaultEditedState(Irrelevant); // Denoise noiselumf->setDefaultEditedState(Irrelevant); @@ -6004,6 +6012,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chromaskcb->setDefaultEditedState(defSpotState->chromaskcb ? Edited : UnEdited); gammaskcb->setDefaultEditedState(defSpotState->gammaskcb ? Edited : UnEdited); slomaskcb->setDefaultEditedState(defSpotState->slomaskcb ? Edited : UnEdited); + lapmaskcb->setDefaultEditedState(defSpotState->lapmaskcb ? Edited : UnEdited); // Denoise noiselumf->setDefaultEditedState(defSpotState->noiselumf ? Edited : UnEdited); @@ -6970,6 +6979,12 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + if (a == lapmaskcb) { + if (listener) { + listener->panelChanged(Evlocallablapmaskcb, lapmaskcb->getTextValue()); + } + } + } // Denoise @@ -7227,6 +7242,7 @@ void Locallab::setBatchMode(bool batchMode) chromaskcb->showEditedCB(); gammaskcb->showEditedCB(); slomaskcb->showEditedCB(); + lapmaskcb->showEditedCB(); // Denoise noiselumf->showEditedCB(); @@ -7889,6 +7905,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con chromaskcb->setValue(pp->locallab.spots.at(index).chromaskcb); gammaskcb->setValue(pp->locallab.spots.at(index).gammaskcb); slomaskcb->setValue(pp->locallab.spots.at(index).slomaskcb); + lapmaskcb->setValue(pp->locallab.spots.at(index).lapmaskcb); enacbMask->set_active(pp->locallab.spots.at(index).enacbMask); CCmaskcbshape->setCurve(pp->locallab.spots.at(index).CCmaskcbcurve); LLmaskcbshape->setCurve(pp->locallab.spots.at(index).LLmaskcbcurve); @@ -8218,6 +8235,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con chromaskcb->setEditedState(spotState->chromaskcb ? Edited : UnEdited); gammaskcb->setEditedState(spotState->gammaskcb ? Edited : UnEdited); slomaskcb->setEditedState(spotState->slomaskcb ? Edited : UnEdited); + lapmaskcb->setEditedState(spotState->lapmaskcb ? Edited : UnEdited); enacbMask->set_inconsistent(multiImage && !spotState->enacbMask); CCmaskcbshape->setUnChanged(!spotState->CCmaskcbcurve); LLmaskcbshape->setUnChanged(!spotState->LLmaskcbcurve); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index fe6d8ad56..187ffd87e 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -275,6 +275,7 @@ private: Adjuster* const chromaskcb; Adjuster* const gammaskcb; Adjuster* const slomaskcb; + Adjuster* const lapmaskcb; // Denoise Adjuster* const noiselumf; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index c7794bdc0..94ed9b3f9 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1201,6 +1201,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).chromaskcb = locallab.spots.at(j).chromaskcb && pSpot.chromaskcb == otherSpot.chromaskcb; locallab.spots.at(j).gammaskcb = locallab.spots.at(j).gammaskcb && pSpot.gammaskcb == otherSpot.gammaskcb; locallab.spots.at(j).slomaskcb = locallab.spots.at(j).slomaskcb && pSpot.slomaskcb == otherSpot.slomaskcb; + locallab.spots.at(j).lapmaskcb = locallab.spots.at(j).lapmaskcb && pSpot.lapmaskcb == otherSpot.lapmaskcb; locallab.spots.at(j).softradiuscb = locallab.spots.at(j).softradiuscb && pSpot.softradiuscb == otherSpot.softradiuscb; locallab.spots.at(j).enacbMask = locallab.spots.at(j).enacbMask && pSpot.enacbMask == otherSpot.enacbMask; locallab.spots.at(j).CCmaskcbcurve = locallab.spots.at(j).CCmaskcbcurve && pSpot.CCmaskcbcurve == otherSpot.CCmaskcbcurve; @@ -3637,6 +3638,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).slomaskcb = mods.locallab.spots.at(i).slomaskcb; } + if (locallab.spots.at(i).lapmaskcb) { + toEdit.locallab.spots.at(i).lapmaskcb = mods.locallab.spots.at(i).lapmaskcb; + } + if (locallab.spots.at(i).enacbMask) { toEdit.locallab.spots.at(i).enacbMask = mods.locallab.spots.at(i).enacbMask; } @@ -4925,6 +4930,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : chromaskcb(v), gammaskcb(v), slomaskcb(v), + lapmaskcb(v), softradiuscb(v), enacbMask(v), CCmaskcbcurve(v), @@ -5200,6 +5206,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) chromaskcb = v; gammaskcb = v; slomaskcb = v; + lapmaskcb = v; softradiuscb = v; enacbMask = v; CCmaskcbcurve = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index deb626ee1..4828f0653 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -615,6 +615,7 @@ public: bool chromaskcb; bool gammaskcb; bool slomaskcb; + bool lapmaskcb; bool softradiuscb; bool enacbMask; bool CCmaskcbcurve;