Local adjustments - improvment Dehaze with black (#6860)
* Local Dehaze black * Enable black * Change threshold black - publish_pre_dev_labels ladehazeblack
This commit is contained in:
parent
dac3dcf664
commit
d276a56b10
2
.github/workflows/appimage.yml
vendored
2
.github/workflows/appimage.yml
vendored
@ -12,7 +12,7 @@ on:
|
||||
workflow_dispatch:
|
||||
|
||||
env:
|
||||
publish_pre_dev_labels: '[]'
|
||||
publish_pre_dev_labels: '["Beep6581:ladehazeblack"]'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
2
.github/workflows/windows.yml
vendored
2
.github/workflows/windows.yml
vendored
@ -12,7 +12,7 @@ on:
|
||||
workflow_dispatch:
|
||||
|
||||
env:
|
||||
publish_pre_dev_labels: '[]'
|
||||
publish_pre_dev_labels: '["Beep6581:ladehazeblack"]'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
@ -1447,6 +1447,7 @@ HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast
|
||||
HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness
|
||||
HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius
|
||||
HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot
|
||||
HISTORY_MSG_LOCAL_DEHAZE_BLACK;Local - Dehaze - black
|
||||
HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift
|
||||
HISTORY_MSG_METADATA_MODE;Metadata copy mode
|
||||
HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold
|
||||
@ -2876,6 +2877,7 @@ TP_LOCALLAB_DARKRETI;Darkness
|
||||
TP_LOCALLAB_DEHAFRA;Dehaze
|
||||
TP_LOCALLAB_DEHAZ;Strength
|
||||
TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Removes atmospheric haze. Increases overall saturation and detail.\nCan remove color casts, but may also introduce a blue cast which can be corrected with other tools.
|
||||
TP_LOCALLAB_DEHAZE_BLACK;Black
|
||||
TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values add haze.
|
||||
TP_LOCALLAB_DELTAD;Delta balance
|
||||
TP_LOCALLAB_DELTAEC;ΔE Image mask
|
||||
|
@ -365,6 +365,8 @@ enum class BlurType {
|
||||
float& meantm, float& stdtm, float& meanreti, float& stdreti, float &fab,
|
||||
float &highresi, float &nresi, float &highresi46, float &nresi46, float &Lhighresi, float &Lnresi, float &Lhighresi46, float &Lnresi46);
|
||||
|
||||
void tone_eqdehaz(ImProcFunctions *ipf, Imagefloat *rgb, int whits, int blacks, const Glib::ustring &workingProfile, double scale, bool multithread);
|
||||
|
||||
void addGaNoise(LabImage *lab, LabImage *dst, const float mean, const float variance, const int sk);
|
||||
void BlurNoise_Localold(int call, const struct local_params& lp, LabImage* original, LabImage* transformed, const LabImage* const tmp1, int cx, int cy);
|
||||
void InverseBlurNoise_Local(LabImage * originalmask, const struct local_params& lp, const float hueref, const float chromaref, const float lumaref, LabImage* original, LabImage* transformed, const LabImage* const tmp1, int cx, int cy, int sk);
|
||||
@ -489,7 +491,7 @@ enum class BlurType {
|
||||
void BadpixelsLab(LabImage * lab, double radius, int thresh, float chrom);
|
||||
|
||||
void dehaze(Imagefloat *rgb, const procparams::DehazeParams &dehazeParams);
|
||||
void dehazeloc(Imagefloat *rgb, const procparams::DehazeParams &dehazeParams);
|
||||
void dehazeloc(Imagefloat *rgb, const procparams::DehazeParams &dehazeParams, int sk, int sp);
|
||||
void ToneMapFattal02(Imagefloat *rgb, const procparams::FattalToneMappingParams &fatParams, int detail_level, int Lalone, float **Lum, int WW, int HH, int algo);
|
||||
void localContrast(LabImage *lab, float **destination, const procparams::LocalContrastParams &localContrastParams, bool fftwlc, double scale);
|
||||
void colorToningLabGrid(LabImage *lab, int xstart, int xend, int ystart, int yend, bool MultiThread);
|
||||
|
@ -454,7 +454,7 @@ void ImProcFunctions::dehaze(Imagefloat *img, const DehazeParams &dehazeParams)
|
||||
}
|
||||
}
|
||||
|
||||
void ImProcFunctions::dehazeloc(Imagefloat *img, const DehazeParams &dehazeParams)
|
||||
void ImProcFunctions::dehazeloc(Imagefloat *img, const DehazeParams &dehazeParams, int sk, int sp)
|
||||
{
|
||||
//J.Desmis 12 2019 - this version derived from ART, is slower than the main from maximum 10% - probably use of SSE
|
||||
//Probably Ingo could solved this problem in some times
|
||||
@ -476,6 +476,13 @@ void ImProcFunctions::dehazeloc(Imagefloat *img, const DehazeParams &dehazeParam
|
||||
float ambient[3];
|
||||
float maxDistance = 0.f;
|
||||
|
||||
int whit = 0;
|
||||
int blac = params->locallab.spots.at(sp).dehazeblack;
|
||||
|
||||
if(blac != 0) {
|
||||
ImProcFunctions::tone_eqdehaz(this, img, whit, blac, params->icm.workingProfile, sk, multiThread);
|
||||
}
|
||||
|
||||
{
|
||||
array2D<float>& R = dark; // R and dark can safely use the same buffer, which is faster and reduces memory allocations/deallocations
|
||||
array2D<float> G(W, H);
|
||||
|
@ -2303,6 +2303,34 @@ void ImProcFunctions::loccont(int bfw, int bfh, LabImage* tmp1, float rad, float
|
||||
}
|
||||
}
|
||||
|
||||
void ImProcFunctions::tone_eqdehaz(ImProcFunctions *ipf, Imagefloat *rgb, int whits, int blacks, const Glib::ustring &workingProfile, double scale, bool multithread)
|
||||
{
|
||||
ToneEqualizerParams params;
|
||||
params.enabled = true;
|
||||
params.regularization = 0.f;
|
||||
params.pivot = 0.f;
|
||||
double blred = 0.4;
|
||||
params.bands[0] = blred * blacks;
|
||||
int bla = abs(blacks);
|
||||
int threshblawhi = 50;
|
||||
int threshblawhi2 = 85;
|
||||
if(bla > threshblawhi) {
|
||||
params.bands[1] = blred * sign(blacks) * (bla - threshblawhi);
|
||||
}
|
||||
if(bla > threshblawhi2) {
|
||||
params.bands[2] = blred * sign(blacks) * (bla - threshblawhi2);
|
||||
}
|
||||
|
||||
params.bands[4] = whits;
|
||||
int whi = abs(whits);
|
||||
if(whi > threshblawhi) {
|
||||
params.bands[3] = sign(whits) * (whi - threshblawhi);
|
||||
}
|
||||
|
||||
ipf->toneEqualizer(rgb, params, workingProfile, scale, multithread);
|
||||
}
|
||||
|
||||
|
||||
void sigmoidla (float &valj, float thresj, float lambda)
|
||||
{
|
||||
//thres : shifts the action of sigmoid to darker tones or lights
|
||||
@ -14412,7 +14440,7 @@ void ImProcFunctions::Lab_Local(
|
||||
dehazeParams.saturation = lp.dehazeSaturation;
|
||||
dehazeParams.depth = lp.depth;
|
||||
lab2rgb(*bufexpfin, *tmpImage.get(), params->icm.workingProfile);
|
||||
dehazeloc(tmpImage.get(), dehazeParams);
|
||||
dehazeloc(tmpImage.get(), dehazeParams, sk, sp);
|
||||
rgb2lab(*tmpImage.get(), *bufexpfin, params->icm.workingProfile);
|
||||
|
||||
transit_shapedetect2(sp, 0.f, 0.f, call, 30, bufexporig.get(), bufexpfin.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk);
|
||||
|
@ -3828,6 +3828,7 @@ LocallabParams::LocallabSpot::LocallabSpot() :
|
||||
equilret(false),
|
||||
loglin(true),
|
||||
dehazeSaturation(50.0),
|
||||
dehazeblack(0.0),
|
||||
softradiusret(40.0),
|
||||
CCmaskreticurve{
|
||||
static_cast<double>(FCT_MinMaxCPoints),
|
||||
@ -5043,6 +5044,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const
|
||||
&& equilret == other.equilret
|
||||
&& loglin == other.loglin
|
||||
&& dehazeSaturation == other.dehazeSaturation
|
||||
&& dehazeblack == other.dehazeblack
|
||||
&& softradiusret == other.softradiusret
|
||||
&& CCmaskreticurve == other.CCmaskreticurve
|
||||
&& LLmaskreticurve == other.LLmaskreticurve
|
||||
@ -6927,6 +6929,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
|
||||
saveToKeyfile(!pedited || spot_edited->equilret, "Locallab", "Equilret_" + index_str, spot.equilret, keyFile);
|
||||
saveToKeyfile(!pedited || spot_edited->loglin, "Locallab", "Loglin_" + index_str, spot.loglin, keyFile);
|
||||
saveToKeyfile(!pedited || spot_edited->dehazeSaturation, "Locallab", "dehazeSaturation_" + index_str, spot.dehazeSaturation, keyFile);
|
||||
saveToKeyfile(!pedited || spot_edited->dehazeblack, "Locallab", "dehazeblack_" + index_str, spot.dehazeblack, keyFile);
|
||||
saveToKeyfile(!pedited || spot_edited->softradiusret, "Locallab", "Softradiusret_" + index_str, spot.softradiusret, keyFile);
|
||||
saveToKeyfile(!pedited || spot_edited->CCmaskreticurve, "Locallab", "CCmaskretiCurve_" + index_str, spot.CCmaskreticurve, keyFile);
|
||||
saveToKeyfile(!pedited || spot_edited->LLmaskreticurve, "Locallab", "LLmaskretiCurve_" + index_str, spot.LLmaskreticurve, keyFile);
|
||||
@ -9143,7 +9146,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
|
||||
assignFromKeyfile(keyFile, "Locallab", "Inversret_" + index_str, spot.inversret, spotEdited.inversret);
|
||||
assignFromKeyfile(keyFile, "Locallab", "Equilret_" + index_str, spot.equilret, spotEdited.equilret);
|
||||
assignFromKeyfile(keyFile, "Locallab", "Loglin_" + index_str, spot.loglin, spotEdited.loglin);
|
||||
assignFromKeyfile(keyFile, "Locallab", "dehazeSaturation" + index_str, spot.dehazeSaturation, spotEdited.dehazeSaturation);
|
||||
assignFromKeyfile(keyFile, "Locallab", "dehazeSaturation_" + index_str, spot.dehazeSaturation, spotEdited.dehazeSaturation);
|
||||
assignFromKeyfile(keyFile, "Locallab", "dehazeblack_" + index_str, spot.dehazeblack, spotEdited.dehazeblack);
|
||||
assignFromKeyfile(keyFile, "Locallab", "Softradiusret_" + index_str, spot.softradiusret, spotEdited.softradiusret);
|
||||
assignFromKeyfile(keyFile, "Locallab", "CCmaskretiCurve_" + index_str, spot.CCmaskreticurve, spotEdited.CCmaskreticurve);
|
||||
assignFromKeyfile(keyFile, "Locallab", "LLmaskretiCurve_" + index_str, spot.LLmaskreticurve, spotEdited.LLmaskreticurve);
|
||||
|
@ -1403,6 +1403,7 @@ struct LocallabParams {
|
||||
bool equilret;
|
||||
bool loglin;
|
||||
double dehazeSaturation;
|
||||
double dehazeblack;
|
||||
double softradiusret;
|
||||
std::vector<double> CCmaskreticurve;
|
||||
std::vector<double> LLmaskreticurve;
|
||||
|
@ -940,6 +940,7 @@ private:
|
||||
Adjuster* const dehaz;
|
||||
Adjuster* const depth;
|
||||
Adjuster* const dehazeSaturation;
|
||||
Adjuster* const dehazeblack;
|
||||
Gtk::Frame* const retiFrame;
|
||||
Adjuster* const str;
|
||||
Gtk::CheckButton* const loglin;
|
||||
@ -991,6 +992,8 @@ private:
|
||||
DiagonalCurveEditor* const Lmaskretishape;
|
||||
Gtk::CheckButton* const inversret;
|
||||
|
||||
rtengine::ProcEvent Evlocallabdehazeblack;
|
||||
|
||||
sigc::connection loglinConn, retinexMethodConn, fftwretiConn, equilretConn, showmaskretiMethodConn, enaretiMaskConn, enaretiMasktmapConn, inversretConn;
|
||||
|
||||
public:
|
||||
|
@ -796,6 +796,7 @@ LocallabRetinex::LocallabRetinex():
|
||||
dehaz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DEHAZ"), -100, 100, 1, 0))),
|
||||
depth(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DEPTH"), 0, 100, 1, 25))),
|
||||
dehazeSaturation(Gtk::manage(new Adjuster(M("TP_DEHAZE_SATURATION"), 0, 100, 1, 50))),
|
||||
dehazeblack(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DEHAZE_BLACK"), -65., 100., 1., 0.))),
|
||||
retiFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_RETIFRA")))),
|
||||
str(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STR"), 0., 100., 0.2, 0.))),
|
||||
loglin(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_LOGLIN")))),
|
||||
@ -848,6 +849,10 @@ LocallabRetinex::LocallabRetinex():
|
||||
Lmaskretishape(static_cast<DiagonalCurveEditor*>(mask2retiCurveEditorG->addCurve(CT_Diagonal, "L(L)"))),
|
||||
inversret(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVERS"))))
|
||||
{
|
||||
|
||||
auto m = ProcEventMapper::getInstance();
|
||||
Evlocallabdehazeblack = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_DEHAZE_BLACK");
|
||||
|
||||
set_orientation(Gtk::ORIENTATION_VERTICAL);
|
||||
|
||||
const LocallabParams::LocallabSpot defSpot;
|
||||
@ -857,6 +862,7 @@ LocallabRetinex::LocallabRetinex():
|
||||
|
||||
dehazeSaturation->setAdjusterListener(this);
|
||||
depth->setAdjusterListener(this);
|
||||
dehazeblack->setAdjusterListener(this);
|
||||
|
||||
retiFrame->set_label_align(0.025, 0.5);
|
||||
|
||||
@ -991,6 +997,7 @@ LocallabRetinex::LocallabRetinex():
|
||||
dehaBox->pack_start(*dehaz);
|
||||
dehaBox->pack_start(*depth);
|
||||
dehaBox->pack_start(*dehazeSaturation);
|
||||
dehaBox->pack_start(*dehazeblack);
|
||||
dehaFrame->add(*dehaBox);
|
||||
auxBox->add(*dehaFrame);
|
||||
ToolParamBlock* const deharetiBox = Gtk::manage(new ToolParamBlock());
|
||||
@ -1247,6 +1254,7 @@ void LocallabRetinex::read(const rtengine::procparams::ProcParams* pp, const Par
|
||||
dehaz->setValue((double)spot.dehaz);
|
||||
depth->setValue((double)spot.depth);
|
||||
dehazeSaturation->setValue((double)spot.dehazeSaturation);
|
||||
dehazeblack->setValue((double)spot.dehazeblack);
|
||||
str->setValue(spot.str);
|
||||
loglin->set_active(spot.loglin);
|
||||
sensih->setValue((double)spot.sensih);
|
||||
@ -1325,6 +1333,7 @@ void LocallabRetinex::write(rtengine::procparams::ProcParams* pp, ParamsEdited*
|
||||
spot.dehaz = dehaz->getIntValue();
|
||||
spot.depth = depth->getIntValue();
|
||||
spot.dehazeSaturation = dehazeSaturation->getIntValue();
|
||||
spot.dehazeblack = dehazeblack->getValue();
|
||||
spot.str = str->getValue();
|
||||
spot.loglin = loglin->get_active();
|
||||
spot.sensih = sensih->getIntValue();
|
||||
@ -1383,6 +1392,7 @@ void LocallabRetinex::setDefaults(const rtengine::procparams::ProcParams* defPar
|
||||
// Set default values for adjuster widgets
|
||||
dehaz->setDefault((double)defSpot.dehaz);
|
||||
dehazeSaturation->setDefault((double)defSpot.dehazeSaturation);
|
||||
dehazeblack->setDefault((double)defSpot.dehazeblack);
|
||||
depth->setDefault((double)defSpot.depth);
|
||||
str->setDefault(defSpot.str);
|
||||
sensih->setDefault((double)defSpot.sensih);
|
||||
@ -1438,6 +1448,13 @@ void LocallabRetinex::adjusterChanged(Adjuster* a, double newval)
|
||||
}
|
||||
}
|
||||
|
||||
if (a == dehazeblack) {
|
||||
if (listener) {
|
||||
listener->panelChanged(Evlocallabdehazeblack,
|
||||
dehazeblack->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")");
|
||||
}
|
||||
}
|
||||
|
||||
if (a == depth) {
|
||||
if (listener) {
|
||||
listener->panelChanged(Evlocallabdepth,
|
||||
|
@ -1478,6 +1478,7 @@ void ParamsEdited::initFrom(const std::vector<rtengine::procparams::ProcParams>&
|
||||
locallab.spots.at(j).equilret = locallab.spots.at(j).equilret && pSpot.equilret == otherSpot.equilret;
|
||||
locallab.spots.at(j).loglin = locallab.spots.at(j).loglin && pSpot.loglin == otherSpot.loglin;
|
||||
locallab.spots.at(j).dehazeSaturation = locallab.spots.at(j).dehazeSaturation && pSpot.dehazeSaturation == otherSpot.dehazeSaturation;
|
||||
locallab.spots.at(j).dehazeblack = locallab.spots.at(j).dehazeblack && pSpot.dehazeblack == otherSpot.dehazeblack;
|
||||
locallab.spots.at(j).softradiusret = locallab.spots.at(j).softradiusret && pSpot.softradiusret == otherSpot.softradiusret;
|
||||
locallab.spots.at(j).CCmaskreticurve = locallab.spots.at(j).CCmaskreticurve && pSpot.CCmaskreticurve == otherSpot.CCmaskreticurve;
|
||||
locallab.spots.at(j).LLmaskreticurve = locallab.spots.at(j).LLmaskreticurve && pSpot.LLmaskreticurve == otherSpot.LLmaskreticurve;
|
||||
@ -4933,6 +4934,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng
|
||||
toEdit.locallab.spots.at(i).dehazeSaturation = mods.locallab.spots.at(i).dehazeSaturation;
|
||||
}
|
||||
|
||||
if (locallab.spots.at(i).dehazeblack) {
|
||||
toEdit.locallab.spots.at(i).dehazeblack = mods.locallab.spots.at(i).dehazeblack;
|
||||
}
|
||||
|
||||
if (locallab.spots.at(i).softradiusret) {
|
||||
toEdit.locallab.spots.at(i).softradiusret = mods.locallab.spots.at(i).softradiusret;
|
||||
}
|
||||
@ -7864,6 +7869,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) :
|
||||
equilret(v),
|
||||
loglin(v),
|
||||
dehazeSaturation(v),
|
||||
dehazeblack(v),
|
||||
softradiusret(v),
|
||||
CCmaskreticurve(v),
|
||||
LLmaskreticurve(v),
|
||||
@ -8559,6 +8565,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v)
|
||||
equilret = v;
|
||||
loglin = v;
|
||||
dehazeSaturation = v;
|
||||
dehazeblack = v;
|
||||
softradiusret = v;
|
||||
CCmaskreticurve = v;
|
||||
LLmaskreticurve = v;
|
||||
|
@ -776,6 +776,7 @@ public:
|
||||
bool equilret;
|
||||
bool loglin;
|
||||
bool dehazeSaturation;
|
||||
bool dehazeblack;
|
||||
bool softradiusret;
|
||||
bool CCmaskreticurve;
|
||||
bool LLmaskreticurve;
|
||||
|
Loading…
x
Reference in New Issue
Block a user