diff --git a/rtdata/languages/default b/rtdata/languages/default index e5c850183..afdaefef1 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -933,6 +933,9 @@ HISTORY_MSG_686;Local - Retinex mask gamma HISTORY_MSG_687;Local - Retinex mask slope HISTORY_MSG_689;Local - Retinex mask transmission map HISTORY_MSG_690;Local - Retinex scale +HISTORY_MSG_691;Local - Retinex darkness +HISTORY_MSG_692;Local - Retinex lightness +HISTORY_MSG_693;Local - Retinex threshold HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2016,6 +2019,9 @@ TP_LOCALLAB_CURVENH;Super TP_LOCALLAB_CURVENHSU;Combined HueChroma (experimental) TP_LOCALLAB_CURVENCONTRAST;Super+Contrast threshold (experimental) TP_LOCALLAB_CURVENSOB2;Combined HueChroma + Contrast threshold (experimental) +TP_LOCALLAB_DARKRETI;Darkness +TP_LOCALLAB_LIGHTRETI;Lightness +TP_LOCALLAB_THRESRETI;Threshold TP_LOCALLAB_DENOIS;Denoise TP_LOCALLAB_DEHAZ;Dehaze TP_LOCALLAB_GRIDONE;Color Toning diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index f81bf01e2..a356a0287 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -858,11 +858,16 @@ void ImProcFunctions::MSRLocal(int sp, int lum, LabImage * bufreti, LabImage * b const int scal = (loc.spots.at(sp).scalereti); const float vart = loc.spots.at(sp).vart / 100.f;//variance const float strength = loc.spots.at(sp).str / 100.f; // Blend with original L channel data - float limD = 10.f;//(float) loc.limd; + const float dar = loc.spots.at(sp).darkness; + const float lig = loc.spots.at(sp).lightnessreti; + + float limD = loc.spots.at(sp).limd;//10.f limD = pow(limD, 1.7f); //about 2500 enough float ilimD = 1.f / limD; const float elogt = 2.71828f; - if(scal <= 3) useHslLin = true; + if(scal <= 3) { + useHslLin = true; + } //empirical skip evaluation : very difficult because quasi all parameters interfere //to test on several images @@ -928,7 +933,6 @@ void ImProcFunctions::MSRLocal(int sp, int lum, LabImage * bufreti, LabImage * b pond /= log(elogt); } - float *buffer = new float[W_L * H_L]; for (int scale = scal - 1; scale >= 0; scale--) { @@ -948,6 +952,21 @@ void ImProcFunctions::MSRLocal(int sp, int lum, LabImage * bufreti, LabImage * b } } + if(scale == 1) {//equalize last scale with darkness and lightness + if (dar != 1.f || lig != 1.f) { + +#ifdef _OPENMP + #pragma omp parallel +#endif + for (int y = 0; y < H_L; ++y) { + for (int x = 0; x < W_L; ++x) { + float buf = (src[y][x] - out[y][x]) * strength; + buf *= (buf > 0.f) ? lig : dar; + out[y][x] = LIM(out[y][x] + buf, 0.f, 100000.f); + } + } + } + } if(lum == 1 && (llretiMask == 3 || llretiMask == 0 || llretiMask == 2 || llretiMask == 4)) {//only mask with luminance array2D loctemp(W_L, H_L); @@ -1163,6 +1182,8 @@ void ImProcFunctions::MSRLocal(int sp, int lum, LabImage * bufreti, LabImage * b } } } + + //here add GuidFilter for transmission map array2D ble(W_L, H_L); array2D guid(W_L, H_L); @@ -1295,6 +1316,8 @@ void ImProcFunctions::MSRLocal(int sp, int lum, LabImage * bufreti, LabImage * b cdmin = cd < cdmin ? cd : cdmin; luminance[i][j] = LIM(cd, 0.f, maxclip) * str + (1.f - str) * originalLuminance[i][j]; } + + #ifdef _OPENMP #pragma omp critical diff --git a/rtengine/procevents.h b/rtengine/procevents.h index ce0a901b6..f433c1361 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -717,6 +717,9 @@ enum ProcEventCode { EvlocallabshowmaskretiMethod = 687, EvLocallabEnaretiMasktmap = 688, Evlocallabscalereti = 689, + Evlocallabdarkness = 690, + Evlocallablightnessreti = 691, + Evlocallablimd = 692, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index b53e34504..fc3fe0059 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2489,6 +2489,9 @@ LocallabParams::LocallabSpot::LocallabSpot() : gammaskreti(1.0), slomaskreti(0.0), scalereti(4.0), + darkness(1.0), + lightnessreti(1.0), + limd(8.0), // Sharpening expsharp(false), sharcontrast(20), @@ -2699,6 +2702,9 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && gammaskreti == other.gammaskreti && slomaskreti == other.slomaskreti && scalereti == other.scalereti + && darkness == other.darkness + && lightnessreti == other.lightnessreti + && limd == other.limd // Sharpening && expsharp == other.expsharp && sharcontrast == other.sharcontrast @@ -3865,6 +3871,9 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).gammaskreti, "Locallab", "Gammaskreti_" + std::to_string(i), spot.gammaskreti, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).slomaskreti, "Locallab", "Slomaskreti_" + std::to_string(i), spot.slomaskreti, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).scalereti, "Locallab", "Scalereti_" + std::to_string(i), spot.scalereti, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).darkness, "Locallab", "Darkness_" + std::to_string(i), spot.darkness, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).lightnessreti, "Locallab", "Lightnessreti_" + std::to_string(i), spot.lightnessreti, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).limd, "Locallab", "Limd_" + std::to_string(i), spot.limd, keyFile); // Sharpening saveToKeyfile(!pedited || pedited->locallab.spots.at(i).expsharp, "Locallab", "Expsharp_" + std::to_string(i), spot.expsharp, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).sharcontrast, "Locallab", "Sharcontrast_" + std::to_string(i), spot.sharcontrast, keyFile); @@ -5172,6 +5181,9 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Gammaskreti_" + std::to_string(i), pedited, spot.gammaskreti, spotEdited.gammaskreti); assignFromKeyfile(keyFile, "Locallab", "Slomaskreti_" + std::to_string(i), pedited, spot.slomaskreti, spotEdited.slomaskreti); assignFromKeyfile(keyFile, "Locallab", "Scalereti_" + std::to_string(i), pedited, spot.scalereti, spotEdited.scalereti); + assignFromKeyfile(keyFile, "Locallab", "Darkness_" + std::to_string(i), pedited, spot.darkness, spotEdited.darkness); + assignFromKeyfile(keyFile, "Locallab", "Lightnessreti_" + std::to_string(i), pedited, spot.lightnessreti, spotEdited.lightnessreti); + assignFromKeyfile(keyFile, "Locallab", "Limd_" + std::to_string(i), pedited, spot.limd, spotEdited.limd); // Sharpening assignFromKeyfile(keyFile, "Locallab", "Expsharp_" + std::to_string(i), pedited, spot.expsharp, spotEdited.expsharp); assignFromKeyfile(keyFile, "Locallab", "Sharcontrast_" + std::to_string(i), pedited, spot.sharcontrast, spotEdited.sharcontrast); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 7733b4ea5..7405b536b 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1090,6 +1090,9 @@ struct LocallabParams { double gammaskreti; double slomaskreti; double scalereti; + double darkness; + double lightnessreti; + double limd; // Sharpening bool expsharp; int sharcontrast; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 930ad2a15..412c4522a 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -716,7 +716,10 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //Evlocallabslomaskreti LUMINANCECURVE, //EvlocallabshowmaskretiMethod LUMINANCECURVE, //EvLocallabEnaretiMasktmap - LUMINANCECURVE //Evlocallabscalereti + LUMINANCECURVE, //Evlocallabscalereti + LUMINANCECURVE, //Evlocallabdarkness + LUMINANCECURVE, //Evlocallablightnessreti + LUMINANCECURVE //Evlocallablimd }; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 93bf04990..1089163cc 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -161,7 +161,10 @@ Locallab::Locallab(): chromaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), gammaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMMASKCOL"), 0.05, 5.0, 0.01, 1.))), slomaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOMASKCOL"), 0.0, 15.0, 0.1, 0.))), - scalereti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SCALERETI"), 1.0, 10.0, 1., 4.))), + scalereti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SCALERETI"), 1.0, 8.0, 1., 4.))), + darkness(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DARKRETI"), 0.01, 3.0, 0.01, 1.))), + lightnessreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LIGHTRETI"), 0.01, 3.0, 0.01, 1.))), + limd(Gtk::manage(new Adjuster(M("TP_LOCALLAB_THRESRETI"), 1.2, 100.0, 0.1, 8.))), // Sharpening sharcontrast(Gtk::manage(new Adjuster(M("TP_SHARPENING_CONTRAST"), 0, 200, 1, 20))), sharradius(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHARRADIUS"), 0.4, 2.5, 0.01, 0.75))), @@ -910,6 +913,9 @@ Locallab::Locallab(): gammaskreti->setAdjusterListener(this); slomaskreti->setAdjusterListener(this); scalereti->setAdjusterListener(this); + darkness->setAdjusterListener(this); + lightnessreti->setAdjusterListener(this); + limd->setAdjusterListener(this); ToolParamBlock* const maskretiBox = Gtk::manage(new ToolParamBlock()); maskretiBox->pack_start(*showmaskretiMethod, Gtk::PACK_SHRINK, 4); @@ -930,6 +936,9 @@ Locallab::Locallab(): retiBox->pack_start(*neigh); retiBox->pack_start(*vart); retiBox->pack_start(*scalereti); + retiBox->pack_start(*limd); + retiBox->pack_start(*darkness); + retiBox->pack_start(*lightnessreti); retiBox->pack_start(*dehaz); retiBox->pack_start(*softradiusret); retiBox->pack_start(*sensih); @@ -2142,6 +2151,9 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).gammaskreti = gammaskreti->getValue(); pp->locallab.spots.at(pp->locallab.selspot).slomaskreti = slomaskreti->getValue(); pp->locallab.spots.at(pp->locallab.selspot).scalereti = scalereti->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).darkness = darkness->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).lightnessreti = lightnessreti->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).limd = limd->getValue(); // Sharpening pp->locallab.spots.at(pp->locallab.selspot).expsharp = expsharp->getEnabled(); pp->locallab.spots.at(pp->locallab.selspot).sharcontrast = sharcontrast->getIntValue(); @@ -2354,6 +2366,9 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pe->locallab.spots.at(pp->locallab.selspot).gammaskreti = pe->locallab.spots.at(pp->locallab.selspot).gammaskreti || gammaskreti->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).slomaskreti = pe->locallab.spots.at(pp->locallab.selspot).slomaskreti || slomaskreti->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).scalereti = pe->locallab.spots.at(pp->locallab.selspot).scalereti || scalereti->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).darkness = pe->locallab.spots.at(pp->locallab.selspot).darkness || darkness->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).lightnessreti = pe->locallab.spots.at(pp->locallab.selspot).lightnessreti || lightnessreti->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).limd = pe->locallab.spots.at(pp->locallab.selspot).limd || limd->getEditedState(); // Sharpening pe->locallab.spots.at(pp->locallab.selspot).expsharp = pe->locallab.spots.at(pp->locallab.selspot).expsharp || !expsharp->get_inconsistent(); pe->locallab.spots.at(pp->locallab.selspot).sharcontrast = pe->locallab.spots.at(pp->locallab.selspot).sharcontrast || sharcontrast->getEditedState(); @@ -2570,6 +2585,9 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).gammaskreti = pedited->locallab.spots.at(pp->locallab.selspot).gammaskreti || gammaskreti->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).slomaskreti = pedited->locallab.spots.at(pp->locallab.selspot).slomaskreti || slomaskreti->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).scalereti = pedited->locallab.spots.at(pp->locallab.selspot).scalereti || scalereti->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).darkness = pedited->locallab.spots.at(pp->locallab.selspot).darkness || darkness->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).lightnessreti = pedited->locallab.spots.at(pp->locallab.selspot).lightnessreti || lightnessreti->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).limd = pedited->locallab.spots.at(pp->locallab.selspot).limd || limd->getEditedState(); // Sharpening pedited->locallab.spots.at(pp->locallab.selspot).expsharp = pedited->locallab.spots.at(pp->locallab.selspot).expsharp || !expsharp->get_inconsistent(); pedited->locallab.spots.at(pp->locallab.selspot).sharcontrast = pedited->locallab.spots.at(pp->locallab.selspot).sharcontrast || sharcontrast->getEditedState(); @@ -3623,6 +3641,9 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe gammaskreti->setDefault(defSpot->gammaskreti); slomaskreti->setDefault(defSpot->slomaskreti); scalereti->setDefault(defSpot->scalereti); + darkness->setDefault(defSpot->darkness); + lightnessreti->setDefault(defSpot->lightnessreti); + limd->setDefault(defSpot->limd); // Sharpening sharcontrast->setDefault((double)defSpot->sharcontrast); sharradius->setDefault(defSpot->sharradius); @@ -3752,6 +3773,9 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe gammaskreti->setDefaultEditedState(Irrelevant); slomaskreti->setDefaultEditedState(Irrelevant); scalereti->setDefaultEditedState(Irrelevant); + darkness->setDefaultEditedState(Irrelevant); + lightnessreti->setDefaultEditedState(Irrelevant); + limd->setDefaultEditedState(Irrelevant); // Sharpening sharcontrast->setDefaultEditedState(Irrelevant); sharradius->setDefaultEditedState(Irrelevant); @@ -3885,6 +3909,9 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe gammaskreti->setDefaultEditedState(defSpotState->gammaskreti ? Edited : UnEdited); slomaskreti->setDefaultEditedState(defSpotState->slomaskreti ? Edited : UnEdited); scalereti->setDefaultEditedState(defSpotState->scalereti ? Edited : UnEdited); + darkness->setDefaultEditedState(defSpotState->darkness ? Edited : UnEdited); + lightnessreti->setDefaultEditedState(defSpotState->lightnessreti ? Edited : UnEdited); + limd->setDefaultEditedState(defSpotState->limd ? Edited : UnEdited); // Sharpening sharcontrast->setDefaultEditedState(defSpotState->sharcontrast ? Edited : UnEdited); sharradius->setDefaultEditedState(defSpotState->sharradius ? Edited : UnEdited); @@ -4440,6 +4467,24 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + if (a == darkness) { + if (listener) { + listener->panelChanged(Evlocallabdarkness, darkness->getTextValue()); + } + } + + if (a == lightnessreti) { + if (listener) { + listener->panelChanged(Evlocallablightnessreti, lightnessreti->getTextValue()); + } + } + + if (a == limd) { + if (listener) { + listener->panelChanged(Evlocallablimd, limd->getTextValue()); + } + } + } // Sharpening @@ -4798,6 +4843,9 @@ void Locallab::setBatchMode(bool batchMode) gammaskreti->showEditedCB(); slomaskreti->showEditedCB(); scalereti->showEditedCB(); + darkness->showEditedCB(); + lightnessreti->showEditedCB(); + limd->showEditedCB(); // Sharpening sharradius->showEditedCB(); sharamount->showEditedCB(); @@ -5262,6 +5310,9 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con gammaskreti->setValue(pp->locallab.spots.at(index).gammaskreti); slomaskreti->setValue(pp->locallab.spots.at(index).slomaskreti); scalereti->setValue(pp->locallab.spots.at(index).scalereti); + darkness->setValue(pp->locallab.spots.at(index).darkness); + lightnessreti->setValue(pp->locallab.spots.at(index).lightnessreti); + limd->setValue(pp->locallab.spots.at(index).limd); // Sharpening expsharp->setEnabled(pp->locallab.spots.at(index).expsharp); @@ -5508,6 +5559,9 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con gammaskreti->setEditedState(spotState->gammaskreti ? Edited : UnEdited); slomaskreti->setEditedState(spotState->slomaskreti ? Edited : UnEdited); scalereti->setEditedState(spotState->scalereti ? Edited : UnEdited); + darkness->setEditedState(spotState->darkness ? Edited : UnEdited); + lightnessreti->setEditedState(spotState->lightnessreti ? Edited : UnEdited); + limd->setEditedState(spotState->limd ? Edited : UnEdited); // Sharpening expsharp->set_inconsistent(!spotState->expsharp); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 8c218affe..3a293606a 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -188,6 +188,9 @@ private: Adjuster* const gammaskreti; Adjuster* const slomaskreti; Adjuster* const scalereti; + Adjuster* const darkness; + Adjuster* const lightnessreti; + Adjuster* const limd; // Sharpening Adjuster* const sharcontrast; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index ec5df37af..f81152ec7 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1079,6 +1079,9 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).gammaskreti = locallab.spots.at(j).gammaskreti && pSpot.gammaskreti == otherSpot.gammaskreti; locallab.spots.at(j).slomaskreti = locallab.spots.at(j).slomaskreti && pSpot.slomaskreti == otherSpot.slomaskreti; locallab.spots.at(j).scalereti = locallab.spots.at(j).scalereti && pSpot.scalereti == otherSpot.scalereti; + locallab.spots.at(j).darkness = locallab.spots.at(j).darkness && pSpot.darkness == otherSpot.darkness; + locallab.spots.at(j).lightnessreti = locallab.spots.at(j).lightnessreti && pSpot.lightnessreti == otherSpot.lightnessreti; + locallab.spots.at(j).limd = locallab.spots.at(j).limd && pSpot.limd == otherSpot.limd; // Sharpening locallab.spots.at(j).expsharp = locallab.spots.at(j).expsharp && pSpot.expsharp == otherSpot.expsharp; locallab.spots.at(j).sharcontrast = locallab.spots.at(j).sharcontrast && pSpot.sharcontrast == otherSpot.sharcontrast; @@ -3139,6 +3142,18 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).scalereti = mods.locallab.spots.at(i).scalereti; } + if (locallab.spots.at(i).darkness) { + toEdit.locallab.spots.at(i).darkness = mods.locallab.spots.at(i).darkness; + } + + if (locallab.spots.at(i).lightnessreti) { + toEdit.locallab.spots.at(i).lightnessreti = mods.locallab.spots.at(i).lightnessreti; + } + + if (locallab.spots.at(i).limd) { + toEdit.locallab.spots.at(i).limd = mods.locallab.spots.at(i).limd; + } + // Sharpening if (locallab.spots.at(i).expsharp) { toEdit.locallab.spots.at(i).expsharp = mods.locallab.spots.at(i).expsharp; @@ -4422,6 +4437,9 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : gammaskreti(v), slomaskreti(v), scalereti(v), + darkness(v), + lightnessreti(v), + limd(v), // Sharpening expsharp(v), sharcontrast(v), @@ -4629,6 +4647,9 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) gammaskreti = v; slomaskreti = v; scalereti = v; + darkness = v; + lightnessreti = v; + limd = v; // Sharpening expsharp = v; sharcontrast = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 4f110a321..3aa9c03e6 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -506,6 +506,9 @@ public: bool gammaskreti; bool slomaskreti; bool scalereti; + bool darkness; + bool lightnessreti; + bool limd; // Sharpening bool expsharp; bool sharcontrast;