Improve contrast levels with sigma

This commit is contained in:
Desmis
2019-12-15 08:21:41 +01:00
parent 44e01ffcb9
commit 025f444d7e
8 changed files with 55 additions and 8 deletions

View File

@@ -790,6 +790,7 @@ HISTORY_MSG_WAVCLARI;Clarity
HISTORY_MSG_WAVUSHAMET;Clarity method HISTORY_MSG_WAVUSHAMET;Clarity method
HISTORY_MSG_WAVMERGEL;Merge L HISTORY_MSG_WAVMERGEL;Merge L
HISTORY_MSG_WAVMERGEC;Merge C HISTORY_MSG_WAVMERGEC;Merge C
HISTORY_MSG_WAVSIGMA;Sigma
HISTORY_MSG_WAVSOFTRAD;Soft radius clarity HISTORY_MSG_WAVSOFTRAD;Soft radius clarity
HISTORY_MSG_WAVSOFTRADEND;Soft radius final HISTORY_MSG_WAVSOFTRADEND;Soft radius final
HISTORY_MSG_WAVSHOWMASK;Show wavelet mask HISTORY_MSG_WAVSHOWMASK;Show wavelet mask
@@ -2236,6 +2237,7 @@ TP_WAVELET_RESCONH;Highlights
TP_WAVELET_RESID;Residual Image TP_WAVELET_RESID;Residual Image
TP_WAVELET_SAT;Saturated chroma TP_WAVELET_SAT;Saturated chroma
TP_WAVELET_SETTINGS;Wavelet Settings TP_WAVELET_SETTINGS;Wavelet Settings
TP_WAVELET_SIGMA;Sigma
TP_WAVELET_SKIN;Skin targetting/protection TP_WAVELET_SKIN;Skin targetting/protection
TP_WAVELET_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected. TP_WAVELET_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected.
TP_WAVELET_SKY;Sky targetting/protection TP_WAVELET_SKY;Sky targetting/protection

View File

@@ -63,6 +63,7 @@ namespace rtengine
struct cont_params { struct cont_params {
float mul[10]; float mul[10];
float sigm;
int chrom; int chrom;
int chro; int chro;
int contrast; int contrast;
@@ -224,6 +225,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const
if (params->wavelet.BAmethod == "cur") { if (params->wavelet.BAmethod == "cur") {
cp.BAmet = 2; cp.BAmet = 2;
} }
cp.sigm = params->wavelet.sigma;
cp.tmstrength = params->wavelet.tmrs; cp.tmstrength = params->wavelet.tmrs;
//cp.tonemap = params->wavelet.tmr; //cp.tonemap = params->wavelet.tmr;
@@ -2997,15 +2999,29 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz
//for each pixel and each level //for each pixel and each level
float beta; float beta;
float mea[9]; float mea[9];
mea[0] = mean[level] / 6.f; float rap = mean[level] - 2.f * cp.sigm * sigma[level];
mea[1] = mean[level] / 2.f;
if (rap > 0.f) {
mea[0] = rap;
} else {
mea[0] = mean[level] / 6.f;
}
rap = mean[level] - cp.sigm * sigma[level];
if (rap > 0.f) {
mea[1] = rap;
} else {
mea[1] = mean[level] / 2.f;
}
mea[2] = mean[level]; // 50% data mea[2] = mean[level]; // 50% data
mea[3] = mean[level] + sigma[level] / 2.f; mea[3] = mean[level] + cp.sigm * sigma[level] / 2.f;
mea[4] = mean[level] + sigma[level]; //66% mea[4] = mean[level] + cp.sigm * sigma[level]; //66%
mea[5] = mean[level] + 1.2f * sigma[level]; mea[5] = mean[level] + cp.sigm * 1.2f * sigma[level];
mea[6] = mean[level] + 1.5f * sigma[level]; // mea[6] = mean[level] + cp.sigm * 1.5f * sigma[level]; //
mea[7] = mean[level] + 2.f * sigma[level]; //95% mea[7] = mean[level] + cp.sigm * 2.f * sigma[level]; //95%
mea[8] = mean[level] + 2.5f * sigma[level]; //99% mea[8] = mean[level] + cp.sigm * 2.5f * sigma[level]; //99%
bool useChromAndHue = (skinprot != 0.f || cp.HSmet); bool useChromAndHue = (skinprot != 0.f || cp.HSmet);
float modchro; float modchro;

View File

@@ -2263,6 +2263,7 @@ WaveletParams::WaveletParams() :
TMmethod("cont"), TMmethod("cont"),
Dirmethod("all"), Dirmethod("all"),
HSmethod("with"), HSmethod("with"),
sigma(1.0),
rescon(0), rescon(0),
resconH(0), resconH(0),
reschro(0), reschro(0),
@@ -2369,6 +2370,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const
&& TMmethod == other.TMmethod && TMmethod == other.TMmethod
&& Dirmethod == other.Dirmethod && Dirmethod == other.Dirmethod
&& HSmethod == other.HSmethod && HSmethod == other.HSmethod
&& sigma == other.sigma
&& rescon == other.rescon && rescon == other.rescon
&& resconH == other.resconH && resconH == other.resconH
&& reschro == other.reschro && reschro == other.reschro
@@ -3548,6 +3550,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
saveToKeyfile(!pedited || pedited->wavelet.avoid, "Wavelet", "AvoidColorShift", wavelet.avoid, keyFile); saveToKeyfile(!pedited || pedited->wavelet.avoid, "Wavelet", "AvoidColorShift", wavelet.avoid, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.showmask, "Wavelet", "Showmask", wavelet.showmask, keyFile); saveToKeyfile(!pedited || pedited->wavelet.showmask, "Wavelet", "Showmask", wavelet.showmask, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.tmr, "Wavelet", "TMr", wavelet.tmr, keyFile); saveToKeyfile(!pedited || pedited->wavelet.tmr, "Wavelet", "TMr", wavelet.tmr, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.sigma, "Wavelet", "Sigma", wavelet.sigma, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.rescon, "Wavelet", "ResidualcontShadow", wavelet.rescon, keyFile); saveToKeyfile(!pedited || pedited->wavelet.rescon, "Wavelet", "ResidualcontShadow", wavelet.rescon, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.resconH, "Wavelet", "ResidualcontHighlight", wavelet.resconH, keyFile); saveToKeyfile(!pedited || pedited->wavelet.resconH, "Wavelet", "ResidualcontHighlight", wavelet.resconH, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.thr, "Wavelet", "ThresholdResidShadow", wavelet.thr, keyFile); saveToKeyfile(!pedited || pedited->wavelet.thr, "Wavelet", "ThresholdResidShadow", wavelet.thr, keyFile);
@@ -4655,6 +4658,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
assignFromKeyfile(keyFile, "Wavelet", "TMMethod", pedited, wavelet.TMmethod, pedited->wavelet.TMmethod); assignFromKeyfile(keyFile, "Wavelet", "TMMethod", pedited, wavelet.TMmethod, pedited->wavelet.TMmethod);
assignFromKeyfile(keyFile, "Wavelet", "HSMethod", pedited, wavelet.HSmethod, pedited->wavelet.HSmethod); assignFromKeyfile(keyFile, "Wavelet", "HSMethod", pedited, wavelet.HSmethod, pedited->wavelet.HSmethod);
assignFromKeyfile(keyFile, "Wavelet", "DirMethod", pedited, wavelet.Dirmethod, pedited->wavelet.Dirmethod); assignFromKeyfile(keyFile, "Wavelet", "DirMethod", pedited, wavelet.Dirmethod, pedited->wavelet.Dirmethod);
assignFromKeyfile(keyFile, "Wavelet", "Sigma", pedited, wavelet.sigma, pedited->wavelet.sigma);
assignFromKeyfile(keyFile, "Wavelet", "ResidualcontShadow", pedited, wavelet.rescon, pedited->wavelet.rescon); assignFromKeyfile(keyFile, "Wavelet", "ResidualcontShadow", pedited, wavelet.rescon, pedited->wavelet.rescon);
assignFromKeyfile(keyFile, "Wavelet", "ResidualcontHighlight", pedited, wavelet.resconH, pedited->wavelet.resconH); assignFromKeyfile(keyFile, "Wavelet", "ResidualcontHighlight", pedited, wavelet.resconH, pedited->wavelet.resconH);
assignFromKeyfile(keyFile, "Wavelet", "Residualchroma", pedited, wavelet.reschro, pedited->wavelet.reschro); assignFromKeyfile(keyFile, "Wavelet", "Residualchroma", pedited, wavelet.reschro, pedited->wavelet.reschro);

View File

@@ -1237,6 +1237,7 @@ struct WaveletParams {
Glib::ustring TMmethod; Glib::ustring TMmethod;
Glib::ustring Dirmethod; Glib::ustring Dirmethod;
Glib::ustring HSmethod; Glib::ustring HSmethod;
double sigma;
int rescon; int rescon;
int resconH; int resconH;
int reschro; int reschro;

View File

@@ -504,6 +504,7 @@ void ParamsEdited::set(bool v)
wavelet.TMmethod = v; wavelet.TMmethod = v;
wavelet.HSmethod = v; wavelet.HSmethod = v;
wavelet.Dirmethod = v; wavelet.Dirmethod = v;
wavelet.sigma = v;
wavelet.rescon = v; wavelet.rescon = v;
wavelet.resconH = v; wavelet.resconH = v;
wavelet.reschro = v; wavelet.reschro = v;
@@ -1095,6 +1096,7 @@ void ParamsEdited::initFrom(const std::vector<rtengine::procparams::ProcParams>&
wavelet.TMmethod = wavelet.TMmethod && p.wavelet.TMmethod == other.wavelet.TMmethod; wavelet.TMmethod = wavelet.TMmethod && p.wavelet.TMmethod == other.wavelet.TMmethod;
wavelet.HSmethod = wavelet.HSmethod && p.wavelet.HSmethod == other.wavelet.HSmethod; wavelet.HSmethod = wavelet.HSmethod && p.wavelet.HSmethod == other.wavelet.HSmethod;
wavelet.Dirmethod = wavelet.Dirmethod && p.wavelet.Dirmethod == other.wavelet.Dirmethod; wavelet.Dirmethod = wavelet.Dirmethod && p.wavelet.Dirmethod == other.wavelet.Dirmethod;
wavelet.sigma = wavelet.sigma && p.wavelet.sigma == other.wavelet.sigma;
wavelet.rescon = wavelet.rescon && p.wavelet.rescon == other.wavelet.rescon; wavelet.rescon = wavelet.rescon && p.wavelet.rescon == other.wavelet.rescon;
wavelet.resconH = wavelet.resconH && p.wavelet.resconH == other.wavelet.resconH; wavelet.resconH = wavelet.resconH && p.wavelet.resconH == other.wavelet.resconH;
wavelet.reschro = wavelet.reschro && p.wavelet.reschro == other.wavelet.reschro; wavelet.reschro = wavelet.reschro && p.wavelet.reschro == other.wavelet.reschro;
@@ -3132,6 +3134,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng
toEdit.wavelet.edgeampli = mods.wavelet.edgeampli; toEdit.wavelet.edgeampli = mods.wavelet.edgeampli;
} }
if (wavelet.sigma) {
toEdit.wavelet.sigma = mods.wavelet.sigma;
}
if (wavelet.resconH) { if (wavelet.resconH) {
toEdit.wavelet.resconH = dontforceSet && options.baBehav[ADDSET_WA_RESCONH] ? toEdit.wavelet.resconH + mods.wavelet.resconH : mods.wavelet.resconH; toEdit.wavelet.resconH = dontforceSet && options.baBehav[ADDSET_WA_RESCONH] ? toEdit.wavelet.resconH + mods.wavelet.resconH : mods.wavelet.resconH;
} }

View File

@@ -520,6 +520,7 @@ struct WaveletParamsEdited {
bool Tilesmethod; bool Tilesmethod;
bool daubcoeffmethod; bool daubcoeffmethod;
bool Dirmethod; bool Dirmethod;
bool sigma;
bool rescon; bool rescon;
bool resconH; bool resconH;
bool reschro; bool reschro;

View File

@@ -80,6 +80,7 @@ Wavelet::Wavelet() :
tmr(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_BALCHRO")))), tmr(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_BALCHRO")))),
showmask(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_SHOWMASK")))), showmask(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_SHOWMASK")))),
neutralchButton(Gtk::manage(new Gtk::Button(M("TP_WAVELET_NEUTRAL")))), neutralchButton(Gtk::manage(new Gtk::Button(M("TP_WAVELET_NEUTRAL")))),
sigma(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMA"), 0.2, 2.5, 0.01, 1.))),
rescon(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCON"), 0, 100, 1, 0))), rescon(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCON"), 0, 100, 1, 0))),
resconH(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCONH"), 0, 100, 1, 0))), resconH(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCONH"), 0, 100, 1, 0))),
reschro(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCHRO"), -100, 100, 1, 0))), reschro(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCHRO"), -100, 100, 1, 0))),
@@ -173,6 +174,7 @@ Wavelet::Wavelet() :
EvWavedgs = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVEDGS"); EvWavedgs = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVEDGS");
EvWavscale = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSCALE"); EvWavscale = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSCALE");
EvWavradius = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVRADIUS"); EvWavradius = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVRADIUS");
EvWavsigma = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSIGMA");
expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings)); expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings));
@@ -325,6 +327,9 @@ Wavelet::Wavelet() :
levBox->pack_start(*correction[i]); levBox->pack_start(*correction[i]);
} }
sigma->setAdjusterListener(this);
levBox->pack_start(*sigma, Gtk::PACK_SHRINK);
levBox->pack_start(*sup); levBox->pack_start(*sup);
sup->setAdjusterListener(this); sup->setAdjusterListener(this);
wavLabels->show(); wavLabels->show();
@@ -1226,6 +1231,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited)
lastavoid = pp->wavelet.avoid; lastavoid = pp->wavelet.avoid;
lastshowmask = pp->wavelet.showmask; lastshowmask = pp->wavelet.showmask;
lasttmr = pp->wavelet.tmr; lasttmr = pp->wavelet.tmr;
sigma->setValue(pp->wavelet.sigma);
rescon->setValue(pp->wavelet.rescon); rescon->setValue(pp->wavelet.rescon);
resconH->setValue(pp->wavelet.resconH); resconH->setValue(pp->wavelet.resconH);
reschro->setValue(pp->wavelet.reschro); reschro->setValue(pp->wavelet.reschro);
@@ -1377,6 +1383,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited)
tmr->set_inconsistent(!pedited->wavelet.tmr); tmr->set_inconsistent(!pedited->wavelet.tmr);
edgthresh->setEditedState(pedited->wavelet.edgthresh ? Edited : UnEdited); edgthresh->setEditedState(pedited->wavelet.edgthresh ? Edited : UnEdited);
rescon->setEditedState(pedited->wavelet.rescon ? Edited : UnEdited); rescon->setEditedState(pedited->wavelet.rescon ? Edited : UnEdited);
sigma->setEditedState(pedited->wavelet.sigma ? Edited : UnEdited);
resconH->setEditedState(pedited->wavelet.resconH ? Edited : UnEdited); resconH->setEditedState(pedited->wavelet.resconH ? Edited : UnEdited);
reschro->setEditedState(pedited->wavelet.reschro ? Edited : UnEdited); reschro->setEditedState(pedited->wavelet.reschro ? Edited : UnEdited);
tmrs->setEditedState(pedited->wavelet.tmrs ? Edited : UnEdited); tmrs->setEditedState(pedited->wavelet.tmrs ? Edited : UnEdited);
@@ -1558,6 +1565,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited)
pp->wavelet.avoid = avoid->get_active(); pp->wavelet.avoid = avoid->get_active();
pp->wavelet.showmask = showmask->get_active(); pp->wavelet.showmask = showmask->get_active();
pp->wavelet.tmr = tmr->get_active(); pp->wavelet.tmr = tmr->get_active();
pp->wavelet.sigma = sigma->getValue();
pp->wavelet.rescon = rescon->getValue(); pp->wavelet.rescon = rescon->getValue();
pp->wavelet.resconH = resconH->getValue(); pp->wavelet.resconH = resconH->getValue();
pp->wavelet.reschro = reschro->getValue(); pp->wavelet.reschro = reschro->getValue();
@@ -1668,6 +1676,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited)
pedited->wavelet.HSmethod = HSmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.HSmethod = HSmethod->get_active_text() != M("GENERAL_UNCHANGED");
pedited->wavelet.Dirmethod = Dirmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.Dirmethod = Dirmethod->get_active_text() != M("GENERAL_UNCHANGED");
pedited->wavelet.edgthresh = edgthresh->getEditedState(); pedited->wavelet.edgthresh = edgthresh->getEditedState();
pedited->wavelet.sigma = sigma->getEditedState();
pedited->wavelet.rescon = rescon->getEditedState(); pedited->wavelet.rescon = rescon->getEditedState();
pedited->wavelet.resconH = resconH->getEditedState(); pedited->wavelet.resconH = resconH->getEditedState();
pedited->wavelet.reschro = reschro->getEditedState(); pedited->wavelet.reschro = reschro->getEditedState();
@@ -1902,6 +1911,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit
strength->setDefault(defParams->wavelet.strength); strength->setDefault(defParams->wavelet.strength);
balance->setDefault(defParams->wavelet.balance); balance->setDefault(defParams->wavelet.balance);
iter->setDefault(defParams->wavelet.iter); iter->setDefault(defParams->wavelet.iter);
sigma->setDefault(defParams->wavelet.sigma);
rescon->setDefault(defParams->wavelet.rescon); rescon->setDefault(defParams->wavelet.rescon);
resconH->setDefault(defParams->wavelet.resconH); resconH->setDefault(defParams->wavelet.resconH);
reschro->setDefault(defParams->wavelet.reschro); reschro->setDefault(defParams->wavelet.reschro);
@@ -1963,6 +1973,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit
softrad->setDefaultEditedState(pedited->wavelet.softrad ? Edited : UnEdited); softrad->setDefaultEditedState(pedited->wavelet.softrad ? Edited : UnEdited);
softradend->setDefaultEditedState(pedited->wavelet.softradend ? Edited : UnEdited); softradend->setDefaultEditedState(pedited->wavelet.softradend ? Edited : UnEdited);
sigma->setDefault(defParams->wavelet.sigma);
rescon->setDefault(defParams->wavelet.rescon); rescon->setDefault(defParams->wavelet.rescon);
resconH->setDefault(defParams->wavelet.resconH); resconH->setDefault(defParams->wavelet.resconH);
reschro->setDefault(defParams->wavelet.reschro); reschro->setDefault(defParams->wavelet.reschro);
@@ -2013,6 +2024,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit
correctionch[i]->setDefaultEditedState(pedited->wavelet.ch[i] ? Edited : UnEdited); correctionch[i]->setDefaultEditedState(pedited->wavelet.ch[i] ? Edited : UnEdited);
} }
} else { } else {
sigma->setDefaultEditedState(Irrelevant);
rescon->setDefaultEditedState(Irrelevant); rescon->setDefaultEditedState(Irrelevant);
resconH->setDefaultEditedState(Irrelevant); resconH->setDefaultEditedState(Irrelevant);
reschro->setDefaultEditedState(Irrelevant); reschro->setDefaultEditedState(Irrelevant);
@@ -2540,6 +2552,7 @@ void Wavelet::setBatchMode(bool batchMode)
opacityCurveEditorWL->setBatchMode(batchMode); opacityCurveEditorWL->setBatchMode(batchMode);
curveEditorRES->setBatchMode(batchMode); curveEditorRES->setBatchMode(batchMode);
curveEditorGAM->setBatchMode(batchMode); curveEditorGAM->setBatchMode(batchMode);
sigma->showEditedCB();
rescon->showEditedCB(); rescon->showEditedCB();
resconH->showEditedCB(); resconH->showEditedCB();
reschro->showEditedCB(); reschro->showEditedCB();
@@ -2621,6 +2634,8 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval)
listener->panelChanged(EvWavtiles, edgthresh->getTextValue()); listener->panelChanged(EvWavtiles, edgthresh->getTextValue());
} else if (a == rescon) { } else if (a == rescon) {
listener->panelChanged(EvWavrescon, rescon->getTextValue()); listener->panelChanged(EvWavrescon, rescon->getTextValue());
} else if (a == sigma) {
listener->panelChanged(EvWavsigma, sigma->getTextValue());
} else if (a == resconH) { } else if (a == resconH) {
listener->panelChanged(EvWavresconH, resconH->getTextValue()); listener->panelChanged(EvWavresconH, resconH->getTextValue());
} else if (a == reschro) { } else if (a == reschro) {

View File

@@ -76,6 +76,7 @@ private:
rtengine::ProcEvent EvWavedgs; rtengine::ProcEvent EvWavedgs;
rtengine::ProcEvent EvWavscale; rtengine::ProcEvent EvWavscale;
rtengine::ProcEvent EvWavradius; rtengine::ProcEvent EvWavradius;
rtengine::ProcEvent EvWavsigma;
void foldAllButMe (GdkEventButton* event, MyExpander *expander); void foldAllButMe (GdkEventButton* event, MyExpander *expander);
@@ -167,6 +168,7 @@ private:
Gtk::Button* const neutralchButton; Gtk::Button* const neutralchButton;
Adjuster* correction[9]; Adjuster* correction[9];
Adjuster* correctionch[9]; Adjuster* correctionch[9];
Adjuster* const sigma;
Adjuster* const rescon; Adjuster* const rescon;
Adjuster* const resconH; Adjuster* const resconH;
Adjuster* const reschro; Adjuster* const reschro;