From d0e32b568296919355fd7cce6bb0392c41abcbf5 Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 10 Oct 2019 17:58:31 +0200 Subject: [PATCH] add Laplacian threshold to mask Blur --- rtdata/languages/default | 1 + rtengine/iplocallab.cc | 35 +++++++++++++++++++++++++++++++++++ rtengine/procevents.h | 1 + rtengine/procparams.cc | 6 +++++- rtengine/procparams.h | 1 + rtengine/refreshmap.cc | 3 ++- rtgui/locallab.cc | 29 ++++++++++++++++++++++++++++- rtgui/locallab.h | 1 + rtgui/paramsedited.cc | 7 +++++++ rtgui/paramsedited.h | 1 + 10 files changed, 82 insertions(+), 3 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index c3127fe4a..760def313 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1000,6 +1000,7 @@ 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_763;Local - Blur 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/iplocallab.cc b/rtengine/iplocallab.cc index ce80b97b2..9e96a8037 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -6893,6 +6893,41 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o } + + float lap = params->locallab.spots.at(sp).lapmaskbl; + + if (lap > 0.f && (lp.enablMask || lp.showmaskblmet == 3)) { + float *datain = new float[GH * GW]; + float *data_tmp = new float[GH * GW]; + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int y = 0; y < GH; y++) { + for (int x = 0; x < GW; x++) { + datain[y * GW + x] = bufmaskblurbl->L[y][x]; + } + } + + (void) discrete_laplacian_threshold(data_tmp, datain, GW, GH, 200.f * lap); + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int y = 0; y < GH; y++) { + for (int x = 0; x < GW; x++) { + bufmaskblurbl->L[y][x] = data_tmp[y * GW + x]; + } + } + + delete [] datain; + delete [] data_tmp; + + } + + float radiusb = 1.f / sk; if (lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) { diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 3457244e4..ab0684f51 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -789,6 +789,7 @@ enum ProcEventCode { Evlocallablapmaskcol = 759, EvlocallablapmaskSH = 760, Evlocallablapmaskcb = 761, + Evlocallablapmaskbl = 762, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 6778e02a8..de2953450 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2554,10 +2554,11 @@ LocallabParams::LocallabSpot::LocallabSpot() : HHmaskblcurve{(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}, enablMask(false), blendmaskbl(0), - radmaskbl(10.0), + radmaskbl(0.0), chromaskbl(0.0), gammaskbl(1.0), slomaskbl(0.0), + lapmaskbl(0.0), // Tone Mapping exptonemap(false), stren(0.5), @@ -2833,6 +2834,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && chromaskbl == other.chromaskbl && gammaskbl == other.gammaskbl && slomaskbl == other.slomaskbl + && lapmaskbl == other.lapmaskbl // Tone Mapping && exptonemap == other.exptonemap && stren == other.stren @@ -4094,6 +4096,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).chromaskbl, "Locallab", "Chromaskbl_" + std::to_string(i), spot.chromaskbl, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).gammaskbl, "Locallab", "Gammaskbl_" + std::to_string(i), spot.gammaskbl, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).slomaskbl, "Locallab", "Slomaskbl_" + std::to_string(i), spot.slomaskbl, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).lapmaskbl, "Locallab", "Lapmaskbl_" + std::to_string(i), spot.lapmaskbl, keyFile); // Tone Mapping saveToKeyfile(!pedited || pedited->locallab.spots.at(i).exptonemap, "Locallab", "Exptonemap_" + std::to_string(i), spot.exptonemap, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).stren, "Locallab", "Stren_" + std::to_string(i), spot.stren, keyFile); @@ -5482,6 +5485,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Chromaskbl_" + std::to_string(i), pedited, spot.chromaskbl, spotEdited.chromaskbl); assignFromKeyfile(keyFile, "Locallab", "Gammaskbl_" + std::to_string(i), pedited, spot.gammaskbl, spotEdited.gammaskbl); assignFromKeyfile(keyFile, "Locallab", "Slomaskbl_" + std::to_string(i), pedited, spot.slomaskbl, spotEdited.slomaskbl); + assignFromKeyfile(keyFile, "Locallab", "Lapmaskbl_" + std::to_string(i), pedited, spot.lapmaskbl, spotEdited.lapmaskbl); // Tone Mapping assignFromKeyfile(keyFile, "Locallab", "Exptonemap_" + std::to_string(i), pedited, spot.exptonemap, spotEdited.exptonemap); assignFromKeyfile(keyFile, "Locallab", "Stren_" + std::to_string(i), pedited, spot.stren, spotEdited.stren); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 22cabc383..3c72be194 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1107,6 +1107,7 @@ struct LocallabParams { double chromaskbl; double gammaskbl; double slomaskbl; + double lapmaskbl; // Tone Mapping bool exptonemap; double stren; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index ad6b49274..df1b9fba8 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -788,7 +788,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //Evlocallablapmaskexp LUMINANCECURVE, //Evlocallablapmaskcol LUMINANCECURVE, //EvlocallablapmaskSH - LUMINANCECURVE //Evlocallablapmaskcb + LUMINANCECURVE, //Evlocallablapmaskcb + LUMINANCECURVE //Evlocallablapmaskbl }; namespace rtengine diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 4f17475e5..0686198bb 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -249,10 +249,11 @@ Locallab::Locallab(): epsbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_EPSBL"), 1, 500, 1, 10))), sensibn(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSIBN"), 0, 100, 1, 40))), blendmaskbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKCOL"), -100, 100, 1, 0))), - radmaskbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 10.))), + radmaskbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 0.))), chromaskbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), gammaskbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMMASKCOL"), 0.05, 5.0, 0.01, 1.))), slomaskbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOMASKCOL"), 0.0, 15.0, 0.1, 0.))), + lapmaskbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPMASKCOL"), 0.0, 100.0, 0.1, 0.))), // Tone Mapping stren(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STREN"), -0.5, 2.0, 0.01, 0.5))), gamma(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAM"), 0.4, 4.0, 0.11, 1.0))), @@ -1834,6 +1835,10 @@ Locallab::Locallab(): maskcbCurveEditorG->curveListComplete(); + if (showtooltip) { + radmaskcb->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + lapmaskcb->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + } ToolParamBlock* const cbdlBox = Gtk::manage(new ToolParamBlock()); @@ -1981,6 +1986,11 @@ Locallab::Locallab(): showmaskblMethodConn = showmaskblMethod->signal_changed().connect(sigc::mem_fun(*this, &Locallab::showmaskblMethodChanged)); + if (showtooltip) { + radmaskbl->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + lapmaskbl->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + } + medMethod->append(M("TP_DIRPYRDENOISE_TYPE_3X3")); medMethod->append(M("TP_DIRPYRDENOISE_TYPE_5X5")); medMethod->append(M("TP_DIRPYRDENOISE_TYPE_7X7")); @@ -2011,6 +2021,7 @@ Locallab::Locallab(): chromaskbl->setAdjusterListener(this); gammaskbl->setAdjusterListener(this); slomaskbl->setAdjusterListener(this); + lapmaskbl->setAdjusterListener(this); ToolParamBlock* const maskblBox = Gtk::manage(new ToolParamBlock()); maskblBox->pack_start(*showmaskblMethod, Gtk::PACK_SHRINK, 4); @@ -2018,6 +2029,7 @@ Locallab::Locallab(): maskblBox->pack_start(*maskblCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor maskblBox->pack_start(*blendmaskbl, Gtk::PACK_SHRINK, 0); maskblBox->pack_start(*radmaskbl, Gtk::PACK_SHRINK, 0); + maskblBox->pack_start(*lapmaskbl, Gtk::PACK_SHRINK, 0); maskblBox->pack_start(*chromaskbl, Gtk::PACK_SHRINK, 0); maskblBox->pack_start(*gammaskbl, Gtk::PACK_SHRINK, 0); maskblBox->pack_start(*slomaskbl, Gtk::PACK_SHRINK, 0); @@ -3191,6 +3203,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).chromaskbl = chromaskbl->getValue(); pp->locallab.spots.at(pp->locallab.selspot).gammaskbl = gammaskbl->getValue(); pp->locallab.spots.at(pp->locallab.selspot).slomaskbl = slomaskbl->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).lapmaskbl = lapmaskbl->getValue(); // Tone Mapping pp->locallab.spots.at(pp->locallab.selspot).exptonemap = exptonemap->getEnabled(); @@ -3483,6 +3496,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pe->locallab.spots.at(pp->locallab.selspot).chromaskbl = pe->locallab.spots.at(pp->locallab.selspot).chromaskbl || chromaskbl->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).gammaskbl = pe->locallab.spots.at(pp->locallab.selspot).gammaskbl || gammaskbl->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).slomaskbl = pe->locallab.spots.at(pp->locallab.selspot).slomaskbl || slomaskbl->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).lapmaskbl = pe->locallab.spots.at(pp->locallab.selspot).lapmaskbl || lapmaskbl->getEditedState(); // Tone Mapping pe->locallab.spots.at(pp->locallab.selspot).exptonemap = pe->locallab.spots.at(pp->locallab.selspot).activlum || !exptonemap->get_inconsistent(); pe->locallab.spots.at(pp->locallab.selspot).stren = pe->locallab.spots.at(pp->locallab.selspot).stren || stren->getEditedState(); @@ -3762,6 +3776,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).chromaskbl = pedited->locallab.spots.at(pp->locallab.selspot).chromaskbl || chromaskbl->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).gammaskbl = pedited->locallab.spots.at(pp->locallab.selspot).gammaskbl || gammaskbl->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).slomaskbl = pedited->locallab.spots.at(pp->locallab.selspot).slomaskbl || slomaskbl->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).lapmaskbl = pedited->locallab.spots.at(pp->locallab.selspot).lapmaskbl || lapmaskbl->getEditedState(); // Tone Mapping pedited->locallab.spots.at(pp->locallab.selspot).exptonemap = pedited->locallab.spots.at(pp->locallab.selspot).exptonemap || !exptonemap->get_inconsistent(); pedited->locallab.spots.at(pp->locallab.selspot).stren = pedited->locallab.spots.at(pp->locallab.selspot).stren || stren->getEditedState(); @@ -5590,6 +5605,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chromaskbl->setDefault(defSpot->chromaskbl); gammaskbl->setDefault(defSpot->gammaskbl); slomaskbl->setDefault(defSpot->slomaskbl); + lapmaskbl->setDefault(defSpot->lapmaskbl); // Tone Mapping stren->setDefault(defSpot->stren); gamma->setDefault(defSpot->gamma); @@ -5761,6 +5777,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chromaskbl->setDefaultEditedState(Irrelevant); gammaskbl->setDefaultEditedState(Irrelevant); slomaskbl->setDefaultEditedState(Irrelevant); + lapmaskbl->setDefaultEditedState(Irrelevant); // Tone Mapping stren->setDefaultEditedState(Irrelevant); gamma->setDefaultEditedState(Irrelevant); @@ -5936,6 +5953,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chromaskbl->setDefaultEditedState(defSpotState->chromaskbl ? Edited : UnEdited); gammaskbl->setDefaultEditedState(defSpotState->gammaskbl ? Edited : UnEdited); slomaskbl->setDefaultEditedState(defSpotState->slomaskbl ? Edited : UnEdited); + lapmaskbl->setDefaultEditedState(defSpotState->lapmaskbl ? Edited : UnEdited); // Tone Mapping stren->setDefaultEditedState(defSpotState->stren ? Edited : UnEdited); gamma->setDefaultEditedState(defSpotState->gamma ? Edited : UnEdited); @@ -6535,6 +6553,12 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + if (a == lapmaskbl) { + if (listener) { + listener->panelChanged(Evlocallablapmaskbl, lapmaskbl->getTextValue()); + } + } + } // Tone Mapping @@ -7169,6 +7193,7 @@ void Locallab::setBatchMode(bool batchMode) chromaskbl->showEditedCB(); gammaskbl->showEditedCB(); slomaskbl->showEditedCB(); + lapmaskbl->showEditedCB(); // Tone Mapping stren->showEditedCB(); gamma->showEditedCB(); @@ -7783,6 +7808,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con chromaskbl->setValue(pp->locallab.spots.at(index).chromaskbl); gammaskbl->setValue(pp->locallab.spots.at(index).gammaskbl); slomaskbl->setValue(pp->locallab.spots.at(index).slomaskbl); + lapmaskbl->setValue(pp->locallab.spots.at(index).lapmaskbl); // Tone Mapping exptonemap->setEnabled(pp->locallab.spots.at(index).exptonemap); @@ -8120,6 +8146,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con chromaskbl->setEditedState(spotState->chromaskbl ? Edited : UnEdited); gammaskbl->setEditedState(spotState->gammaskbl ? Edited : UnEdited); slomaskbl->setEditedState(spotState->slomaskbl ? Edited : UnEdited); + lapmaskbl->setEditedState(spotState->lapmaskbl ? Edited : UnEdited); // Tone Mapping exptonemap->set_inconsistent(!spotState->exptonemap); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 187ffd87e..9663e51c9 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -202,6 +202,7 @@ private: Adjuster* const chromaskbl; Adjuster* const gammaskbl; Adjuster* const slomaskbl; + Adjuster* const lapmaskbl; // Tone Mapping Adjuster* const stren; Adjuster* const gamma; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 94ed9b3f9..8017b55b0 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1099,6 +1099,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).chromaskbl = locallab.spots.at(j).chromaskbl && pSpot.chromaskbl == otherSpot.chromaskbl; locallab.spots.at(j).gammaskbl = locallab.spots.at(j).gammaskbl && pSpot.gammaskbl == otherSpot.gammaskbl; locallab.spots.at(j).slomaskbl = locallab.spots.at(j).slomaskbl && pSpot.slomaskbl == otherSpot.slomaskbl; + locallab.spots.at(j).lapmaskbl = locallab.spots.at(j).lapmaskbl && pSpot.lapmaskbl == otherSpot.lapmaskbl; // Tone Mapping locallab.spots.at(j).exptonemap = locallab.spots.at(j).exptonemap && pSpot.exptonemap == otherSpot.exptonemap; locallab.spots.at(j).stren = locallab.spots.at(j).stren && pSpot.stren == otherSpot.stren; @@ -3259,6 +3260,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).slomaskbl = mods.locallab.spots.at(i).slomaskbl; } + if (locallab.spots.at(i).lapmaskbl) { + toEdit.locallab.spots.at(i).lapmaskbl = mods.locallab.spots.at(i).lapmaskbl; + } + // Tone Mapping if (locallab.spots.at(i).exptonemap) { toEdit.locallab.spots.at(i).exptonemap = mods.locallab.spots.at(i).exptonemap; @@ -4832,6 +4837,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : chromaskbl(v), gammaskbl(v), slomaskbl(v), + lapmaskbl(v), // Tone Mapping exptonemap(v), stren(v), @@ -5104,6 +5110,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) chromaskbl = v; gammaskbl = v; slomaskbl = v; + lapmaskbl = v; // Tone Mapping exptonemap = v; stren = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 4828f0653..6b3a85007 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -517,6 +517,7 @@ public: bool chromaskbl; bool gammaskbl; bool slomaskbl; + bool lapmaskbl; // Tone Mapping bool exptonemap; bool stren;