add Laplacian threshold to mask Blur

This commit is contained in:
Desmis 2019-10-10 17:58:31 +02:00
parent 7bafb53618
commit d0e32b5682
10 changed files with 82 additions and 3 deletions

View File

@ -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

View File

@ -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) {

View File

@ -789,6 +789,7 @@ enum ProcEventCode {
Evlocallablapmaskcol = 759,
EvlocallablapmaskSH = 760,
Evlocallablapmaskcb = 761,
Evlocallablapmaskbl = 762,
NUMOFEVENTS
};

View File

@ -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);

View File

@ -1107,6 +1107,7 @@ struct LocallabParams {
double chromaskbl;
double gammaskbl;
double slomaskbl;
double lapmaskbl;
// Tone Mapping
bool exptonemap;
double stren;

View File

@ -788,7 +788,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = {
LUMINANCECURVE, //Evlocallablapmaskexp
LUMINANCECURVE, //Evlocallablapmaskcol
LUMINANCECURVE, //EvlocallablapmaskSH
LUMINANCECURVE //Evlocallablapmaskcb
LUMINANCECURVE, //Evlocallablapmaskcb
LUMINANCECURVE //Evlocallablapmaskbl
};
namespace rtengine

View File

@ -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);

View File

@ -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;

View File

@ -1099,6 +1099,7 @@ void ParamsEdited::initFrom(const std::vector<rtengine::procparams::ProcParams>&
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;

View File

@ -517,6 +517,7 @@ public:
bool chromaskbl;
bool gammaskbl;
bool slomaskbl;
bool lapmaskbl;
// Tone Mapping
bool exptonemap;
bool stren;