Tone mapping mask after

This commit is contained in:
Desmis 2019-10-03 08:34:18 +02:00
parent 43228efea6
commit b0f35cfa21
10 changed files with 92 additions and 23 deletions

View File

@ -992,6 +992,7 @@ HISTORY_MSG_751;Local - Reti Dehaze luminance
HISTORY_MSG_752;Local - Reti Offset
HISTORY_MSG_753;Local - Reti Transmission map
HISTORY_MSG_754;Local - Reti Clip
HISTORY_MSG_755;Local - TM use tm 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
@ -2233,6 +2234,7 @@ TP_LOCALLAB_SHOWDCT;Show process Fourier
TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Show process Fourier:\nShows the different stages of the process.\nLaplace - builds the second derivative according to the threshold (first step).\nFourier -shows the transformed Laplacian with DCT.\nPoisson - show solution of Poisson DCE.\nNormalize - show result whithout normalization luminance.
TP_LOCALLAB_SHOWNORMAL;Normalize luminance (no)
TP_LOCALLAB_TM;Tone Mapping
TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping
TP_LOCALLAB_STR;Strength
TP_LOCALLAB_LOGLIN;Logarithm mode
TP_LOCALLAB_STRRETI_TOOLTIP;if Strength Retinex < 0.2 only Dehaze is enabled.\nif Strength Retinex >= 0.1 Dehaze is in luminance mode.

View File

@ -7468,14 +7468,19 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
JaggedArray<float> bufchro(bfw, bfh);
std::unique_ptr<LabImage> bufgb(new LabImage(bfw, bfh));
std::unique_ptr<LabImage> tmp1(new LabImage(bfw, bfh));
std::unique_ptr<LabImage> bufgbm(new LabImage(bfw, bfh));
std::unique_ptr<LabImage> tmp1m(new LabImage(bfw, bfh));
std::unique_ptr<LabImage> bufmaskorigtm;
std::unique_ptr<LabImage> bufmaskblurtm;
std::unique_ptr<LabImage> originalmasktm;
LabImage *orimask = nullptr;
orimask = new LabImage(original->W, original->H);
if (lp.showmasktmmet == 2 || lp.enatmMask || lp.showmasktmmet == 3 || lp.showmasktmmet == 4) {
if (lp.showmasktmmet == 0 || lp.showmasktmmet == 2 || lp.enatmMask || lp.showmasktmmet == 3 || lp.showmasktmmet == 4) {
bufmaskorigtm.reset(new LabImage(bfw, bfh));
bufmaskblurtm.reset(new LabImage(bfw, bfh));
originalmasktm.reset(new LabImage(bfw, bfh));
orimask->CopyFrom(original);
}
int itera = 0;
@ -7493,6 +7498,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
bufgb->L[y - ystart][x - xstart] = original->L[y][x];
bufgb->a[y - ystart][x - xstart] = original->a[y][x];
bufgb->b[y - ystart][x - xstart] = original->b[y][x];
bufgbm->L[y - ystart][x - xstart] = original->L[y][x];
bufgbm->a[y - ystart][x - xstart] = original->a[y][x];
bufgbm->b[y - ystart][x - xstart] = original->b[y][x];
}
}
@ -7533,36 +7541,43 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
float gamma = lp.gammatm;
float slope = lp.slomatm;
float blendm = lp.blendmatm;
maskcalccol(bfw, bfh, xstart, ystart, sk, cx, cy, bufgb.get(), bufmaskorigtm.get(), originalmasktm.get(), original, transformed, inv, lp,
if (!params->locallab.spots.at(sp).enatmMaskaft) {
maskcalccol(bfw, bfh, xstart, ystart, sk, cx, cy, bufgbm.get(), bufmaskorigtm.get(), originalmasktm.get(), original, transformed, inv, lp,
locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, multiThread,
enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, gamma, slope, blendm);
if (lp.showmasktmmet == 3) {
showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufgb.get(), transformed, bufmaskorigtm.get(), 0);
showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufgbm.get(), transformed, bufmaskorigtm.get(), 0);
return;
}
if (lp.showmasktmmet == 0 || lp.showmasktmmet == 1 || lp.showmasktmmet == 2 || lp.showmasktmmet == 4 || lp.enatmMask) {
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
for (int y = 0; y < bfh ; y++) {
for (int x = 0; x < bfw; x++) {
bufgb->L[y][x] = original->L[y + ystart][x + xstart];
bufgb->a[y][x] = original->a[y + ystart][x + xstart];
bufgb->b[y][x] = original->b[y + ystart][x + xstart];
}
}
if (lp.showmasktmmet == 0 || lp.showmasktmmet == 1 || lp.showmasktmmet == 2 || lp.showmasktmmet == 4 || lp.showmasktmmet == 3 || lp.enatmMask) {
ImProcFunctions::EPDToneMaplocal(sp, bufgb.get(), tmp1.get(), itera, sk);//iterate to 0 calculate with edgstopping, improve result, call=1 dcrop we can put iterate to 5
tmp1m->CopyFrom(tmp1.get());
if (params->locallab.spots.at(sp).enatmMaskaft) {
maskcalccol(bfw, bfh, xstart, ystart, sk, cx, cy, tmp1m.get(), bufmaskorigtm.get(), originalmasktm.get(), orimask, transformed, inv, lp,
locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, multiThread,
enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, gamma, slope, blendm);
if (lp.showmasktmmet == 3) {
showmask(lp, xstart, ystart, cx, cy, bfw, bfh, tmp1m.get(), transformed, bufmaskorigtm.get(), 0);
return;
}
original->CopyFrom(orimask);
}
delete orimask;
float minL = tmp1->L[0][0] - bufgb->L[0][0];
float maxL = minL;
float minC = sqrt(SQR(tmp1->a[0][0]) + SQR(tmp1->b[0][0])) - sqrt(SQR(bufgb->a[0][0]) + SQR(bufgb->b[0][0]));

View File

@ -781,6 +781,7 @@ enum ProcEventCode {
Evlocallaboffs = 751,
EvlocallabCTtransCurve = 752,
Evlocallabcliptm = 753,
EvLocallabEnatmMaskaft = 754,
NUMOFEVENTS
};

View File

@ -2570,6 +2570,7 @@ LocallabParams::LocallabSpot::LocallabSpot() :
LLmasktmcurve{(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},
HHmasktmcurve{(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},
enatmMask(false),
enatmMaskaft(false),
blendmasktm(0),
radmasktm(10.0),
chromasktm(0.0),
@ -2837,6 +2838,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const
&& LLmasktmcurve == other.LLmasktmcurve
&& HHmasktmcurve == other.HHmasktmcurve
&& enatmMask == other.enatmMask
&& enatmMaskaft == other.enatmMaskaft
&& blendmasktm == other.blendmasktm
&& radmasktm == other.radmasktm
&& chromasktm == other.chromasktm
@ -4090,6 +4092,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
saveToKeyfile(!pedited || pedited->locallab.spots.at(i).LLmasktmcurve, "Locallab", "LLmasktmCurve_" + std::to_string(i), spot.LLmasktmcurve, keyFile);
saveToKeyfile(!pedited || pedited->locallab.spots.at(i).HHmasktmcurve, "Locallab", "HHmasktmCurve_" + std::to_string(i), spot.HHmasktmcurve, keyFile);
saveToKeyfile(!pedited || pedited->locallab.spots.at(i).enatmMask, "Locallab", "EnatmMask_" + std::to_string(i), spot.enatmMask, keyFile);
saveToKeyfile(!pedited || pedited->locallab.spots.at(i).enatmMaskaft, "Locallab", "EnatmMaskaft_" + std::to_string(i), spot.enatmMaskaft, keyFile);
saveToKeyfile(!pedited || pedited->locallab.spots.at(i).blendmasktm, "Locallab", "Blendmasktm_" + std::to_string(i), spot.blendmasktm, keyFile);
saveToKeyfile(!pedited || pedited->locallab.spots.at(i).radmasktm, "Locallab", "Radmasktm_" + std::to_string(i), spot.radmasktm, keyFile);
saveToKeyfile(!pedited || pedited->locallab.spots.at(i).chromasktm, "Locallab", "Chromasktm_" + std::to_string(i), spot.chromasktm, keyFile);
@ -5470,6 +5473,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
assignFromKeyfile(keyFile, "Locallab", "LLmasktmCurve_" + std::to_string(i), pedited, spot.LLmasktmcurve, spotEdited.LLmasktmcurve);
assignFromKeyfile(keyFile, "Locallab", "HHmasktmCurve_" + std::to_string(i), pedited, spot.HHmasktmcurve, spotEdited.HHmasktmcurve);
assignFromKeyfile(keyFile, "Locallab", "EnatmMask_" + std::to_string(i), pedited, spot.enatmMask, spotEdited.enatmMask);
assignFromKeyfile(keyFile, "Locallab", "EnatmMaskaft_" + std::to_string(i), pedited, spot.enatmMaskaft, spotEdited.enatmMaskaft);
assignFromKeyfile(keyFile, "Locallab", "Blendmasktm_" + std::to_string(i), pedited, spot.blendmasktm, spotEdited.blendmasktm);
assignFromKeyfile(keyFile, "Locallab", "Radmasktm_" + std::to_string(i), pedited, spot.radmasktm, spotEdited.radmasktm);
assignFromKeyfile(keyFile, "Locallab", "Chromasktm_" + std::to_string(i), pedited, spot.chromasktm, spotEdited.chromasktm);

View File

@ -1119,6 +1119,7 @@ struct LocallabParams {
std::vector<double> LLmasktmcurve;
std::vector<double> HHmasktmcurve;
bool enatmMask;
bool enatmMaskaft;
int blendmasktm;
double radmasktm;
double chromasktm;

View File

@ -780,7 +780,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = {
LUMINANCECURVE, // Evlocallablumonly
LUMINANCECURVE, // Evlocallaboffs
LUMINANCECURVE, //EvlocallabCTtransCurve
LUMINANCECURVE //Evlocallabcliptm
LUMINANCECURVE, //Evlocallabcliptm
LUMINANCECURVE //Evlocallabenatmmaskaft
};

View File

@ -353,6 +353,7 @@ Locallab::Locallab():
//TM
equiltm(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_EQUIL")))),
enatmMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))),
enatmMaskaft(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_AFTER_MASK")))),
// Retinex
equilret(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_EQUIL")))),
inversret(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVERS")))),
@ -1242,6 +1243,7 @@ Locallab::Locallab():
masktmCurveEditorG->curveListComplete();
enatmMaskConn = enatmMask->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::enatmMaskChanged));
enatmMaskaftConn = enatmMaskaft->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::enatmMaskaftChanged));
showmasktmMethod->append(M("TP_LOCALLAB_SHOWMNONE"));
showmasktmMethod->append(M("TP_LOCALLAB_SHOWMODIF"));
@ -1269,6 +1271,7 @@ Locallab::Locallab():
ToolParamBlock* const masktmBox = Gtk::manage(new ToolParamBlock());
masktmBox->pack_start(*showmasktmMethod, Gtk::PACK_SHRINK, 4);
masktmBox->pack_start(*enatmMask, Gtk::PACK_SHRINK, 0);
masktmBox->pack_start(*enatmMaskaft, Gtk::PACK_SHRINK, 0);
masktmBox->pack_start(*masktmCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor
masktmBox->pack_start(*blendmasktm, Gtk::PACK_SHRINK, 0);
masktmBox->pack_start(*radmasktm, Gtk::PACK_SHRINK, 0);
@ -3160,6 +3163,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited)
pp->locallab.spots.at(pp->locallab.selspot).CCmasktmcurve = CCmasktmshape->getCurve();
pp->locallab.spots.at(pp->locallab.selspot).HHmasktmcurve = HHmasktmshape->getCurve();
pp->locallab.spots.at(pp->locallab.selspot).enatmMask = enatmMask->get_active();
pp->locallab.spots.at(pp->locallab.selspot).enatmMaskaft = enatmMaskaft->get_active();
pp->locallab.spots.at(pp->locallab.selspot).blendmasktm = blendmasktm->getIntValue();
pp->locallab.spots.at(pp->locallab.selspot).radmasktm = radmasktm->getValue();
pp->locallab.spots.at(pp->locallab.selspot).chromasktm = chromasktm->getValue();
@ -3443,6 +3447,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited)
pe->locallab.spots.at(pp->locallab.selspot).LLmasktmcurve = pe->locallab.spots.at(pp->locallab.selspot).LLmasktmcurve || !LLmasktmshape->isUnChanged();
pe->locallab.spots.at(pp->locallab.selspot).HHmasktmcurve = pe->locallab.spots.at(pp->locallab.selspot).HHmasktmcurve || !HHmasktmshape->isUnChanged();
pe->locallab.spots.at(pp->locallab.selspot).enatmMask = pe->locallab.spots.at(pp->locallab.selspot).enatmMask || !enatmMask->get_inconsistent();
pe->locallab.spots.at(pp->locallab.selspot).enatmMaskaft = pe->locallab.spots.at(pp->locallab.selspot).enatmMaskaft || !enatmMask->get_inconsistent();
pe->locallab.spots.at(pp->locallab.selspot).blendmasktm = pe->locallab.spots.at(pp->locallab.selspot).blendmasktm || blendmasktm->getEditedState();
pe->locallab.spots.at(pp->locallab.selspot).radmasktm = pe->locallab.spots.at(pp->locallab.selspot).radmasktm || radmasktm->getEditedState();
pe->locallab.spots.at(pp->locallab.selspot).chromasktm = pe->locallab.spots.at(pp->locallab.selspot).chromasktm || chromasktm->getEditedState();
@ -3716,6 +3721,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited)
pedited->locallab.spots.at(pp->locallab.selspot).LLmasktmcurve = pedited->locallab.spots.at(pp->locallab.selspot).LLmasktmcurve || !LLmasktmshape->isUnChanged();
pedited->locallab.spots.at(pp->locallab.selspot).HHmasktmcurve = pedited->locallab.spots.at(pp->locallab.selspot).HHmasktmcurve || !HHmasktmshape->isUnChanged();
pedited->locallab.spots.at(pp->locallab.selspot).enatmMask = pedited->locallab.spots.at(pp->locallab.selspot).enatmMask || !enatmMask->get_inconsistent();
pedited->locallab.spots.at(pp->locallab.selspot).enatmMaskaft = pedited->locallab.spots.at(pp->locallab.selspot).enatmMaskaft || !enatmMaskaft->get_inconsistent();
pedited->locallab.spots.at(pp->locallab.selspot).blendmasktm = pedited->locallab.spots.at(pp->locallab.selspot).blendmasktm || blendmasktm->getEditedState();
pedited->locallab.spots.at(pp->locallab.selspot).radmasktm = pedited->locallab.spots.at(pp->locallab.selspot).radmasktm || radmasktm->getEditedState();
pedited->locallab.spots.at(pp->locallab.selspot).chromasktm = pedited->locallab.spots.at(pp->locallab.selspot).chromasktm || chromasktm->getEditedState();
@ -4753,6 +4759,30 @@ void Locallab::enatmMaskChanged()
}
}
void Locallab::enatmMaskaftChanged()
{
printf("enatmmaskaftChanged\n");
if (multiImage) {
if (enatmMaskaft->get_inconsistent()) {
enatmMaskaft->set_inconsistent(false);
enatmMaskaftConn.block(true);
enatmMaskaft->set_active(false);
enatmMaskaftConn.block(false);
}
}
if (getEnabled() && exptonemap->getEnabled()) {
if (listener) {
if (enatmMaskaft->get_active()) {
listener->panelChanged(EvLocallabEnatmMaskaft, M("GENERAL_ENABLED"));
} else {
listener->panelChanged(EvLocallabEnatmMaskaft, M("GENERAL_DISABLED"));
}
}
}
}
void Locallab::enaretiMaskChanged()
{
@ -7290,6 +7320,7 @@ void Locallab::enableListener()
enabletonemapConn.block(false);
equiltmConn.block(false);
enatmMaskConn.block(false);
enatmMaskaftConn.block(false);
showmasktmMethodConn.block(false);
// Retinex
enableretiConn.block(false);
@ -7366,6 +7397,7 @@ void Locallab::disableListener()
enabletonemapConn.block(true);
equiltmConn.block(true);
enatmMaskConn.block(true);
enatmMaskaftConn.block(true);
showmasktmMethodConn.block(true);
// Retinex
enableretiConn.block(true);
@ -7613,6 +7645,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con
amount->setValue(pp->locallab.spots.at(index).amount);
equiltm->set_active(pp->locallab.spots.at(index).equiltm);
enatmMask->set_active(pp->locallab.spots.at(index).enatmMask);
enatmMaskaft->set_active(pp->locallab.spots.at(index).enatmMaskaft);
blendmasktm->setValue(pp->locallab.spots.at(index).blendmasktm);
radmasktm->setValue(pp->locallab.spots.at(index).radmasktm);
chromasktm->setValue(pp->locallab.spots.at(index).chromasktm);
@ -7945,6 +7978,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con
LLmasktmshape->setUnChanged(!spotState->LLmasktmcurve);
HHmasktmshape->setUnChanged(!spotState->HHmasktmcurve);
enatmMask->set_inconsistent(multiImage && !spotState->enatmMask);
enatmMaskaft->set_inconsistent(multiImage && !spotState->enatmMaskaft);
blendmasktm->setEditedState(spotState->blendmasktm ? Edited : UnEdited);
radmasktm->setEditedState(spotState->radmasktm ? Edited : UnEdited);
chromasktm->setEditedState(spotState->chromasktm ? Edited : UnEdited);

View File

@ -316,6 +316,8 @@ private:
sigc::connection equiltmConn;
Gtk::CheckButton* const enatmMask;
sigc::connection enatmMaskConn;
Gtk::CheckButton* const enatmMaskaft;
sigc::connection enatmMaskaftConn;
// Retinex
Gtk::CheckButton* const equilret;
sigc::connection equilretConn;
@ -471,6 +473,7 @@ private:
//TM
void equiltmChanged();
void enatmMaskChanged();
void enatmMaskaftChanged();
// Retinex
void equilretChanged();
void loglinChanged();

View File

@ -1111,6 +1111,7 @@ void ParamsEdited::initFrom(const std::vector<rtengine::procparams::ProcParams>&
locallab.spots.at(j).LLmasktmcurve = locallab.spots.at(j).LLmasktmcurve && pSpot.LLmasktmcurve == otherSpot.LLmasktmcurve;
locallab.spots.at(j).HHmasktmcurve = locallab.spots.at(j).HHmasktmcurve && pSpot.HHmasktmcurve == otherSpot.HHmasktmcurve;
locallab.spots.at(j).enatmMask = locallab.spots.at(j).enatmMask && pSpot.enatmMask == otherSpot.enatmMask;
locallab.spots.at(j).enatmMaskaft = locallab.spots.at(j).enatmMaskaft && pSpot.enatmMaskaft == otherSpot.enatmMaskaft;
locallab.spots.at(j).blendmasktm = locallab.spots.at(j).blendmasktm && pSpot.blendmasktm == otherSpot.blendmasktm;
locallab.spots.at(j).radmasktm = locallab.spots.at(j).radmasktm && pSpot.radmasktm == otherSpot.radmasktm;
locallab.spots.at(j).chromasktm = locallab.spots.at(j).chromasktm && pSpot.chromasktm == otherSpot.chromasktm;
@ -3296,6 +3297,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng
toEdit.locallab.spots.at(i).enatmMask = mods.locallab.spots.at(i).enatmMask;
}
if (locallab.spots.at(i).enatmMaskaft) {
toEdit.locallab.spots.at(i).enatmMaskaft = mods.locallab.spots.at(i).enatmMaskaft;
}
if (locallab.spots.at(i).blendmasktm) {
toEdit.locallab.spots.at(i).blendmasktm = mods.locallab.spots.at(i).blendmasktm;
}
@ -4804,6 +4809,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) :
LLmasktmcurve(v),
HHmasktmcurve(v),
enatmMask(v),
enatmMaskaft(v),
blendmasktm(v),
radmasktm(v),
chromasktm(v),
@ -5068,6 +5074,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v)
LLmasktmcurve = v;
HHmasktmcurve = v;
enatmMask = v;
enatmMaskaft = v;
blendmasktm = v;
radmasktm = v;
chromasktm = v;

View File

@ -529,6 +529,7 @@ public:
bool LLmasktmcurve;
bool HHmasktmcurve;
bool enatmMask;
bool enatmMaskaft;
bool blendmasktm;
bool radmasktm;
bool chromasktm;