From 60160025f973d323c787ea9b81e5017d28a75f6f Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 3 Mar 2020 08:07:36 +0100 Subject: [PATCH 001/109] Ciecam02 chnage default settings cat02preset --- rtengine/improccoordinator.cc | 3 ++- rtgui/colorappearance.cc | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 15d477fdc..3cc58b01c 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1158,7 +1158,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } if (params->colorappearance.enabled && params->colorappearance.presetcat02 && params->colorappearance.autotempout) { - acListener->wbCamChanged(params->wb.temperature, params->wb.green); //real temp and tint + // acListener->wbCamChanged(params->wb.temperature, params->wb.green); //real temp and tint + acListener->wbCamChanged(params->wb.temperature, 1.f); //real temp and tint = 1. } } else { diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index ace7affd6..394298566 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -824,7 +824,7 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) presetcat02->set_active(pp->colorappearance.presetcat02); nexttemp = pp->wb.temperature; - nextgreen = pp->wb.green; + nextgreen = 1.; //pp->wb.green; if (pedited) { degree->setEditedState (pedited->colorappearance.degree ? Edited : UnEdited); @@ -1368,6 +1368,7 @@ void ColorAppearance::presetcat02pressed () gamut->set_active (true); gamutconn.block (false); degree->setAutoValue (true); + degree->setValue(80); degree->resetValue (false); adapscen->resetValue (false); adapscen->setAutoValue (true); @@ -1383,7 +1384,7 @@ void ColorAppearance::presetcat02pressed () ybscen->setValue(18); surround->set_active (0); adaplum->setValue(400.); - degreeout->setValue(70); + degreeout->setValue(80); ybout->setValue(18); tempout->setValue (nexttemp); greenout->setValue (nextgreen); From 0d921d366a6f37f7b04d678b2cdb2782e9251ba8 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 3 Mar 2020 08:16:47 +0100 Subject: [PATCH 002/109] another small change to cat02preset --- rtgui/colorappearance.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index 394298566..159cd8260 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -1368,8 +1368,8 @@ void ColorAppearance::presetcat02pressed () gamut->set_active (true); gamutconn.block (false); degree->setAutoValue (true); - degree->setValue(80); degree->resetValue (false); + degree->setValue(80); adapscen->resetValue (false); adapscen->setAutoValue (true); degreeout->resetValue (false); From 6e4f91ebb9b80f89937d45ef335c625c2b3d1706 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 3 Mar 2020 13:59:48 +0100 Subject: [PATCH 003/109] raw crop for Canon PowerShot SX70 HS --- rtengine/camconst.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index f58167478..9b1b99d1b 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1240,6 +1240,11 @@ Camera constants: "ranges": { "white": 4050 } // nominal 4080-4093 }, + { // Quality C, only raw crop + "make_model": "Canon PowerShot SX70 HS", + "raw_crop": [ 96, 17, 5248, 3932 ] + }, + { // Quality C "make_model": "Canon PowerShot SX150 IS", "dcraw_matrix": [ 13481, -4867, -1063, -2074, 9960, 2472, -170, 1474, 3894 ], // Adobe DNG Converter 11.1 ColorMatrix1 (there is only one matrix and illuminant, and it's for daylight) From cc4de2e804f668bc8f625d1c7bf4374261c092f6 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 3 Mar 2020 15:06:49 +0100 Subject: [PATCH 004/109] Fixed some typos in comments --- rtengine/rawimagesource.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 49334d1dc..ff9472f1a 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -3897,9 +3897,9 @@ void RawImageSource::getRowStartEnd (int x, int &start, int &end) static void histoxyY(int bfhitc, int bfwitc, const array2D & xc, const array2D & yc, const array2D & Yc, LUTf &xxx, LUTf &yyy, LUTf &YYY, LUTu &histxy) { - //calculate histogram x y in a rane of 158 colors + //calculate histogram x y in a range of 158 colors //this "choice" are guided by generally colors who are in nature skin, sky, etc. in those cases "steps" are small - // of course we can chnage to be more precise + // of course we can change to be more precise #ifdef _OPENMP #pragma omp parallel #endif @@ -5047,7 +5047,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } } - if (extra) {//always used because I amde this choice, brings better results + if (extra) {//always used because I made this choice, brings better results struct Tempgreen { float student; int tempref; From a356306728aa5c8e8142dbff419dc8fef9835135 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 3 Mar 2020 19:51:43 +0100 Subject: [PATCH 005/109] Silence some warnings --- rtengine/dcraw.cc | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 0858bdaaa..7f6e2ee31 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -1,7 +1,6 @@ #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wsign-compare" -#pragma GCC diagnostic ignored "-Wunused-macros" #if (__GNUC__ >= 6) #pragma GCC diagnostic ignored "-Wmisleading-indentation" #endif @@ -63,12 +62,8 @@ $Date: 2018/06/01 20:36:25 $ */ -#define DCRAW_VERSION "9.28" +//#define DCRAW_VERSION "9.28" -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif -#define _USE_MATH_DEFINES #include #include #include @@ -95,8 +90,12 @@ #ifdef WIN32 #include #include +#ifndef strcasecmp #define strcasecmp stricmp +#endif +#ifndef strncasecmp #define strncasecmp strnicmp +#endif typedef __int64 INT64; typedef unsigned __int64 UINT64; #else From 05f365c0d6f83425c7eff82b4d10945bf957bd07 Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 4 Mar 2020 16:31:49 +0100 Subject: [PATCH 006/109] Added method Illuminant to make choices easier in free mode --- rtdata/languages/default | 10 ++++ rtengine/procparams.cc | 6 ++- rtengine/procparams.h | 1 + rtgui/colorappearance.cc | 106 +++++++++++++++++++++++++++++++++++++++ rtgui/colorappearance.h | 4 ++ rtgui/paramsedited.cc | 6 +++ rtgui/paramsedited.h | 1 + 7 files changed, 133 insertions(+), 1 deletion(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 265266a7c..543542feb 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -760,6 +760,7 @@ HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method +HISTORY_MSG_ILLUM;Illuminant HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast @@ -1438,6 +1439,15 @@ TP_COLORAPP_GAMUT;Gamut control (L*a*b*) TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. TP_COLORAPP_HUE;Hue (h) TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0° and 360°. +TP_COLORAPP_ILLUM;Illuminant +TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and lattitude. +TP_COLORAPP_ILA;Incandescent A +TP_COLORAPP_IL50;D50 +TP_COLORAPP_IL55;D55 +TP_COLORAPP_IL60;D60 +TP_COLORAPP_IL65;D65 +TP_COLORAPP_IL75;D75 +TP_COLORAPP_ILFREE;Free TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 TP_COLORAPP_LABEL_CAM02;Image Adjustments TP_COLORAPP_LABEL_SCENE;Scene Conditions diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index a6707fb86..e795d9bd9 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1374,6 +1374,7 @@ ColorAppearanceParams::ColorAppearanceParams() : adaplum(16), badpixsl(0), wbmodel("RawT"), + illum("i50"), algo("No"), contrast(0.0), qcontrast(0.0), @@ -1392,7 +1393,7 @@ ColorAppearanceParams::ColorAppearanceParams() : autotempout(true), ybout(18), greenout(1.0), - tempsc(5000), + tempsc(5003), greensc(1.0), presetcat02(false) { @@ -1421,6 +1422,7 @@ bool ColorAppearanceParams::operator ==(const ColorAppearanceParams& other) cons && adaplum == other.adaplum && badpixsl == other.badpixsl && wbmodel == other.wbmodel + && illum == other.illum && algo == other.algo && contrast == other.contrast && qcontrast == other.qcontrast @@ -3214,6 +3216,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->colorappearance.adaplum, "Color appearance", "AdaptLum", colorappearance.adaplum, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.badpixsl, "Color appearance", "Badpixsl", colorappearance.badpixsl, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.wbmodel, "Color appearance", "Model", colorappearance.wbmodel, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.illum, "Color appearance", "Illum", colorappearance.illum, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.algo, "Color appearance", "Algorithm", colorappearance.algo, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.jlight, "Color appearance", "J-Light", colorappearance.jlight, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.qbright, "Color appearance", "Q-Bright", colorappearance.qbright, keyFile); @@ -4208,6 +4211,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Color appearance", "AdaptLum", pedited, colorappearance.adaplum, pedited->colorappearance.adaplum); assignFromKeyfile(keyFile, "Color appearance", "Badpixsl", pedited, colorappearance.badpixsl, pedited->colorappearance.badpixsl); assignFromKeyfile(keyFile, "Color appearance", "Model", pedited, colorappearance.wbmodel, pedited->colorappearance.wbmodel); + assignFromKeyfile(keyFile, "Color appearance", "Illum", pedited, colorappearance.illum, pedited->colorappearance.illum); assignFromKeyfile(keyFile, "Color appearance", "Algorithm", pedited, colorappearance.algo, pedited->colorappearance.algo); assignFromKeyfile(keyFile, "Color appearance", "J-Light", pedited, colorappearance.jlight, pedited->colorappearance.jlight); assignFromKeyfile(keyFile, "Color appearance", "Q-Bright", pedited, colorappearance.qbright, pedited->colorappearance.qbright); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 17cf64a69..aabe1e7ae 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -661,6 +661,7 @@ struct ColorAppearanceParams { double adaplum; int badpixsl; Glib::ustring wbmodel; + Glib::ustring illum; Glib::ustring algo; double contrast; double qcontrast; diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index 159cd8260..4d3db4081 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -221,6 +221,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" auto m = ProcEventMapper::getInstance(); Evcatpreset = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_CAT02PRESET"); EvCATAutotempout = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_TEMPOUT"); + EvCATillum = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ILLUM"); //preset button cat02 presetcat02 = Gtk::manage (new Gtk::CheckButton (M ("TP_COLORAPP_PRESETCAT02"))); presetcat02->set_tooltip_markup (M("TP_COLORAPP_PRESETCAT02_TIP")); @@ -285,6 +286,25 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" wbmHBox->pack_start (*wbmodel); p1VBox->pack_start (*wbmHBox); + + Gtk::HBox* illumHBox = Gtk::manage (new Gtk::HBox ()); + illumHBox->set_spacing (2); + illumHBox->set_tooltip_markup (M ("TP_COLORAPP_ILLUM_TOOLTIP")); + Gtk::Label* illumLab = Gtk::manage (new Gtk::Label (M ("TP_COLORAPP_ILLUM") + ":")); + illumHBox->pack_start (*illumLab, Gtk::PACK_SHRINK); + illum = Gtk::manage (new MyComboBoxText ()); + illum->append (M ("TP_COLORAPP_ILA")); + illum->append (M ("TP_COLORAPP_IL50")); + illum->append (M ("TP_COLORAPP_IL55")); + illum->append (M ("TP_COLORAPP_IL60")); + illum->append (M ("TP_COLORAPP_IL65")); + illum->append (M ("TP_COLORAPP_IL75")); + illum->append (M ("TP_COLORAPP_ILFREE")); + + illum->set_active (0); + illumHBox->pack_start (*illum); + p1VBox->pack_start (*illumHBox); + Gtk::Image* itempL = Gtk::manage (new RTImage ("circle-blue-small.png")); Gtk::Image* itempR = Gtk::manage (new RTImage ("circle-yellow-small.png")); Gtk::Image* igreenL = Gtk::manage (new RTImage ("circle-magenta-small.png")); @@ -701,6 +721,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" // surrconn = surrsource->signal_toggled().connect ( sigc::mem_fun (*this, &ColorAppearance::surrsource_toggled) ); wbmodelconn = wbmodel->signal_changed().connect ( sigc::mem_fun (*this, &ColorAppearance::wbmodelChanged) ); + illumconn = illum->signal_changed().connect ( sigc::mem_fun (*this, &ColorAppearance::illumChanged) ); algoconn = algo->signal_changed().connect ( sigc::mem_fun (*this, &ColorAppearance::algoChanged) ); surroundconn = surround->signal_changed().connect ( sigc::mem_fun (*this, &ColorAppearance::surroundChanged) ); surrsrcconn = surrsrc->signal_changed().connect ( sigc::mem_fun (*this, &ColorAppearance::surrsrcChanged) ); @@ -777,6 +798,7 @@ void ColorAppearance::neutral_pressed () greensc->resetValue (false); badpixsl->resetValue (false); wbmodel->set_active (0); + illum->set_active (1); toneCurveMode->set_active (0); toneCurveMode2->set_active (0); toneCurveMode3->set_active (0); @@ -938,6 +960,30 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) // Have to be manually called to handle initial state update wbmodelChanged(); + illumconn.block (true); + + if (pedited && !pedited->colorappearance.illum) { + illum->set_active (7); + } else if (pp->colorappearance.illum == "iA") { + illum->set_active (0); + } else if (pp->colorappearance.illum == "i50") { + illum->set_active (1); + } else if (pp->colorappearance.illum == "i55") { + illum->set_active (2); + } else if (pp->colorappearance.illum == "i60") { + illum->set_active (3); + } else if (pp->colorappearance.illum == "i65") { + illum->set_active (4); + } else if (pp->colorappearance.illum == "i75") { + illum->set_active (5); + } else if (pp->colorappearance.illum == "ifree") { + illum->set_active (6); + } + + illumconn.block (false); + // Have to be manually called to handle initial state update + illumChanged(); + algoconn.block (true); if (pedited && !pedited->colorappearance.algo) { @@ -1123,6 +1169,7 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) pedited->colorappearance.surround = surround->get_active_text() != M ("GENERAL_UNCHANGED"); pedited->colorappearance.surrsrc = surrsrc->get_active_text() != M ("GENERAL_UNCHANGED"); pedited->colorappearance.wbmodel = wbmodel->get_active_text() != M ("GENERAL_UNCHANGED"); + pedited->colorappearance.illum = illum->get_active_text() != M ("GENERAL_UNCHANGED"); pedited->colorappearance.algo = algo->get_active_text() != M ("GENERAL_UNCHANGED"); // pedited->colorappearance.surrsource = !surrsource->get_inconsistent(); pedited->colorappearance.gamut = !gamut->get_inconsistent(); @@ -1173,7 +1220,22 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) pp->colorappearance.wbmodel = "RawTCAT02"; } else if (wbmodel->get_active_row_number() == 2) { pp->colorappearance.wbmodel = "free"; + } + if (illum->get_active_row_number() == 0) { + pp->colorappearance.illum = "iA"; + } else if (illum->get_active_row_number() == 1) { + pp->colorappearance.illum = "i50"; + } else if (illum->get_active_row_number() == 2) { + pp->colorappearance.illum = "i55"; + } else if (illum->get_active_row_number() == 3) { + pp->colorappearance.illum = "i60"; + } else if (illum->get_active_row_number() == 4) { + pp->colorappearance.illum = "i65"; + } else if (illum->get_active_row_number() == 5) { + pp->colorappearance.illum = "i75"; + } else if (illum->get_active_row_number() == 6) { + pp->colorappearance.illum = "ifree"; } if (algo->get_active_row_number() == 0) { @@ -1358,6 +1420,7 @@ void ColorAppearance::presetcat02pressed () greensc->resetValue (false); badpixsl->resetValue (false); wbmodel->set_active (0); + illum->set_active (1); toneCurveMode->set_active (0); toneCurveMode2->set_active (0); toneCurveMode3->set_active (0); @@ -1427,6 +1490,7 @@ void ColorAppearance::presetcat02pressed () ybscen->setAutoValue (true); surrsrc->set_active (0); wbmodel->set_active (0); + illum->set_active (1); tempsc->resetValue (false); greensc->resetValue (false); adapscen->resetValue (false); @@ -1884,13 +1948,17 @@ void ColorAppearance::surroundChanged () void ColorAppearance::wbmodelChanged () { if (wbmodel->get_active_row_number() == 0 || wbmodel->get_active_row_number() == 1) { + illum->hide(); tempsc->hide(); greensc->hide(); + tempsc->setValue (5003); + greensc->setValue (1); } if (wbmodel->get_active_row_number() == 2) { tempsc->show(); greensc->show(); + illum->show(); } if (listener && (multiImage || getEnabled()) ) { @@ -1898,6 +1966,43 @@ void ColorAppearance::wbmodelChanged () } } +void ColorAppearance::illumChanged () +{ + if (illum->get_active_row_number() == 0) { + tempsc->setValue (2856); + tempsc->set_sensitive(false); + greensc->set_sensitive(false); + } else if (illum->get_active_row_number() == 1) { + tempsc->setValue (5003); + tempsc->set_sensitive(false); + greensc->set_sensitive(false); + } else if (illum->get_active_row_number() == 2) { + tempsc->setValue (5503); + tempsc->set_sensitive(false); + greensc->set_sensitive(false); + } else if (illum->get_active_row_number() == 3) { + tempsc->setValue (6000); + tempsc->set_sensitive(false); + greensc->set_sensitive(false); + } else if (illum->get_active_row_number() == 4) { + tempsc->setValue (6504); + tempsc->set_sensitive(false); + greensc->set_sensitive(false); + } else if (illum->get_active_row_number() == 5) { + tempsc->setValue (7504); + tempsc->set_sensitive(false); + greensc->set_sensitive(false); + } else if (illum->get_active_row_number() == 6) { + tempsc->set_sensitive(true); + greensc->set_sensitive(true); + } + + if (listener && (multiImage || getEnabled()) ) { + listener->panelChanged (EvCATillum, illum->get_active_text ()); + } +} + + void ColorAppearance::algoChanged () { @@ -2000,6 +2105,7 @@ void ColorAppearance::setBatchMode (bool batchMode) surround->append (M ("GENERAL_UNCHANGED")); surrsrc->append (M ("GENERAL_UNCHANGED")); wbmodel->append (M ("GENERAL_UNCHANGED")); + illum->append (M ("GENERAL_UNCHANGED")); algo->append (M ("GENERAL_UNCHANGED")); toneCurveMode->append (M ("GENERAL_UNCHANGED")); toneCurveMode2->append (M ("GENERAL_UNCHANGED")); diff --git a/rtgui/colorappearance.h b/rtgui/colorappearance.h index 863787118..c326b06f9 100644 --- a/rtgui/colorappearance.h +++ b/rtgui/colorappearance.h @@ -53,6 +53,7 @@ public: void surroundChanged (); void surrsrcChanged (); void wbmodelChanged (); + void illumChanged (); void algoChanged (); void surrsource_toggled (); void gamut_toggled (); @@ -102,6 +103,7 @@ public: private: rtengine::ProcEvent Evcatpreset; rtengine::ProcEvent EvCATAutotempout; + rtengine::ProcEvent EvCATillum; bool bgTTipQuery (int x, int y, bool keyboard_tooltip, const Glib::RefPtr& tooltip); bool srTTipQuery (int x, int y, bool keyboard_tooltip, const Glib::RefPtr& tooltip); void foldAllButMe (GdkEventButton* event, MyExpander *expander); @@ -156,6 +158,8 @@ private: sigc::connection surroundconn; MyComboBoxText* wbmodel; sigc::connection wbmodelconn; + MyComboBoxText* illum; + sigc::connection illumconn; MyComboBoxText* algo; sigc::connection algoconn; sigc::connection surrconn; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 52eb7dbe6..48ba4c341 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -219,6 +219,7 @@ void ParamsEdited::set(bool v) colorappearance.adaplum = v; colorappearance.badpixsl = v; colorappearance.wbmodel = v; + colorappearance.illum = v; colorappearance.algo = v; colorappearance.jlight = v; @@ -812,6 +813,7 @@ void ParamsEdited::initFrom(const std::vector& colorappearance.adaplum = colorappearance.adaplum && p.colorappearance.adaplum == other.colorappearance.adaplum; colorappearance.badpixsl = colorappearance.badpixsl && p.colorappearance.badpixsl == other.colorappearance.badpixsl; colorappearance.wbmodel = colorappearance.wbmodel && p.colorappearance.wbmodel == other.colorappearance.wbmodel; + colorappearance.illum = colorappearance.illum && p.colorappearance.illum == other.colorappearance.illum; colorappearance.algo = colorappearance.algo && p.colorappearance.algo == other.colorappearance.algo; colorappearance.jlight = colorappearance.jlight && p.colorappearance.jlight == other.colorappearance.jlight; colorappearance.qbright = colorappearance.qbright && p.colorappearance.qbright == other.colorappearance.qbright; @@ -2010,6 +2012,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.colorappearance.wbmodel = mods.colorappearance.wbmodel; } + if (colorappearance.illum) { + toEdit.colorappearance.illum = mods.colorappearance.illum; + } + if (colorappearance.algo) { toEdit.colorappearance.algo = mods.colorappearance.algo; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 938f1bf97..d2707ec11 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -275,6 +275,7 @@ struct ColorAppearanceParamsEdited { bool ybscen; bool badpixsl; bool wbmodel; + bool illum; bool algo; bool jlight; bool qbright; From bb54a97436585cd7adfb8f63ab5cdfcc747b1089 Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 4 Mar 2020 18:12:06 +0100 Subject: [PATCH 007/109] Ciecam02 change label and tooltip --- rtdata/languages/default | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 543542feb..517b68cbd 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1441,7 +1441,7 @@ TP_COLORAPP_HUE;Hue (h) TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0° and 360°. TP_COLORAPP_ILLUM;Illuminant TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and lattitude. -TP_COLORAPP_ILA;Incandescent A +TP_COLORAPP_ILA;Incandescent StdA 2856K TP_COLORAPP_IL50;D50 TP_COLORAPP_IL55;D55 TP_COLORAPP_IL60;D60 @@ -1460,7 +1460,7 @@ TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's TP_COLORAPP_NEUTRAL;Reset TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values TP_COLORAPP_PRESETCAT02;Preset cat02 automatic -TP_COLORAPP_PRESETCAT02_TIP;Set combobox, sliders, temp, green so that Cat02 automatic is preset.\nYou must change Cat02 adaptation Viewing conditions if need.\nYou can change Temperature and Tint Viewing conditions if need, and other settings if need. +TP_COLORAPP_PRESETCAT02_TIP;Set combobox, sliders, temp, green so that Cat02 automatic is preset.\nYou can change illuminant shooting conditions.\nYou must change Cat02 adaptation Viewing conditions if need.\nYou can change Temperature and Tint Viewing conditions if need, and other settings if need. TP_COLORAPP_RSTPRO;Red & skin-tones protection TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. TP_COLORAPP_SURROUND;Surround From 6c96e5a0a4d052f840852dcda481ed96046357ea Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 5 Mar 2020 08:10:47 +0100 Subject: [PATCH 008/109] Added D41 to Ciecam02 illuminant --- rtdata/languages/default | 4 ++- rtgui/colorappearance.cc | 61 +++++++++++++++++++++++----------------- 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 517b68cbd..fe6ddaa7c 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1442,6 +1442,7 @@ TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0° and 360°. TP_COLORAPP_ILLUM;Illuminant TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and lattitude. TP_COLORAPP_ILA;Incandescent StdA 2856K +TP_COLORAPP_IL41;D41 TP_COLORAPP_IL50;D50 TP_COLORAPP_IL55;D55 TP_COLORAPP_IL60;D60 @@ -1477,7 +1478,8 @@ TP_COLORAPP_TCMODE_LABEL2;Curve mode 2 TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode TP_COLORAPP_TCMODE_LIGHTNESS;Lightness TP_COLORAPP_TCMODE_SATUR;Saturation -TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +TP_COLORAPP_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 TP_COLORAPP_TEMPOUT_TOOLTIP;Disable to chnage temperature and tint TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index 4d3db4081..bdbe3de3a 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -33,7 +33,7 @@ #define MINTEMP0 2000 //1200 #define MAXTEMP0 12000 //12000 -#define CENTERTEMP0 5000 +#define CENTERTEMP0 5003 #define MINGREEN0 0.8 #define MAXGREEN0 1.2 @@ -242,7 +242,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" p1VBox = Gtk::manage ( new Gtk::VBox()); p1VBox->set_spacing (2); - degree = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CIECAT_DEGREE"), 0., 100., 1., 100.)); + degree = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CIECAT_DEGREE"), 0., 100., 1., 90.)); if (degree->delay < options.adjusterMaxDelay) { degree->delay = options.adjusterMaxDelay; @@ -294,6 +294,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" illumHBox->pack_start (*illumLab, Gtk::PACK_SHRINK); illum = Gtk::manage (new MyComboBoxText ()); illum->append (M ("TP_COLORAPP_ILA")); + illum->append (M ("TP_COLORAPP_IL41")); illum->append (M ("TP_COLORAPP_IL50")); illum->append (M ("TP_COLORAPP_IL55")); illum->append (M ("TP_COLORAPP_IL60")); @@ -628,7 +629,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" // Gtk::Image* iblueredL = Gtk::manage (new RTImage ("circle-blue-small.png")); // Gtk::Image* iblueredR = Gtk::manage (new RTImage ("circle-red-small.png")); - degreeout = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CIECAT_DEGREE"), 0., 100., 1., 100.)); + degreeout = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CIECAT_DEGREE"), 0., 100., 1., 90.)); if (degreeout->delay < options.adjusterMaxDelay) { degreeout->delay = options.adjusterMaxDelay; @@ -646,7 +647,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" tempout = Gtk::manage (new Adjuster (M ("TP_WBALANCE_TEMPERATURE"), MINTEMP0, MAXTEMP0, 5, CENTERTEMP0, itempR1, itempL1, &wbSlider2Temp, &wbTemp2Slider)); greenout = Gtk::manage (new Adjuster (M ("TP_WBALANCE_GREEN"), MINGREEN0, MAXGREEN0, 0.001, 1.0, igreenR1, igreenL1)); ybout = Gtk::manage (new Adjuster (M ("TP_COLORAPP_MEANLUMINANCE"), 5, 90, 1, 18)); - tempout->set_tooltip_markup (M ("TP_COLORAPP_TEMP_TOOLTIP")); + tempout->set_tooltip_markup (M ("TP_COLORAPP_TEMP2_TOOLTIP")); tempout->throwOnButtonRelease(); tempout->addAutoButton (M ("TP_COLORAPP_TEMPOUT_TOOLTIP")); @@ -798,7 +799,7 @@ void ColorAppearance::neutral_pressed () greensc->resetValue (false); badpixsl->resetValue (false); wbmodel->set_active (0); - illum->set_active (1); + illum->set_active (2); toneCurveMode->set_active (0); toneCurveMode2->set_active (0); toneCurveMode3->set_active (0); @@ -963,21 +964,23 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) illumconn.block (true); if (pedited && !pedited->colorappearance.illum) { - illum->set_active (7); + illum->set_active (8); } else if (pp->colorappearance.illum == "iA") { illum->set_active (0); - } else if (pp->colorappearance.illum == "i50") { + } else if (pp->colorappearance.illum == "i41") { illum->set_active (1); - } else if (pp->colorappearance.illum == "i55") { + } else if (pp->colorappearance.illum == "i50") { illum->set_active (2); - } else if (pp->colorappearance.illum == "i60") { + } else if (pp->colorappearance.illum == "i55") { illum->set_active (3); - } else if (pp->colorappearance.illum == "i65") { + } else if (pp->colorappearance.illum == "i60") { illum->set_active (4); - } else if (pp->colorappearance.illum == "i75") { + } else if (pp->colorappearance.illum == "i65") { illum->set_active (5); - } else if (pp->colorappearance.illum == "ifree") { + } else if (pp->colorappearance.illum == "i75") { illum->set_active (6); + } else if (pp->colorappearance.illum == "ifree") { + illum->set_active (7); } illumconn.block (false); @@ -1225,16 +1228,18 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) if (illum->get_active_row_number() == 0) { pp->colorappearance.illum = "iA"; } else if (illum->get_active_row_number() == 1) { - pp->colorappearance.illum = "i50"; + pp->colorappearance.illum = "i41"; } else if (illum->get_active_row_number() == 2) { - pp->colorappearance.illum = "i55"; + pp->colorappearance.illum = "i50"; } else if (illum->get_active_row_number() == 3) { - pp->colorappearance.illum = "i60"; + pp->colorappearance.illum = "i55"; } else if (illum->get_active_row_number() == 4) { - pp->colorappearance.illum = "i65"; + pp->colorappearance.illum = "i60"; } else if (illum->get_active_row_number() == 5) { - pp->colorappearance.illum = "i75"; + pp->colorappearance.illum = "i65"; } else if (illum->get_active_row_number() == 6) { + pp->colorappearance.illum = "i75"; + } else if (illum->get_active_row_number() == 7) { pp->colorappearance.illum = "ifree"; } @@ -1420,7 +1425,7 @@ void ColorAppearance::presetcat02pressed () greensc->resetValue (false); badpixsl->resetValue (false); wbmodel->set_active (0); - illum->set_active (1); + illum->set_active (2); toneCurveMode->set_active (0); toneCurveMode2->set_active (0); toneCurveMode3->set_active (0); @@ -1432,7 +1437,7 @@ void ColorAppearance::presetcat02pressed () gamutconn.block (false); degree->setAutoValue (true); degree->resetValue (false); - degree->setValue(80); + degree->setValue(90); adapscen->resetValue (false); adapscen->setAutoValue (true); degreeout->resetValue (false); @@ -1447,7 +1452,7 @@ void ColorAppearance::presetcat02pressed () ybscen->setValue(18); surround->set_active (0); adaplum->setValue(400.); - degreeout->setValue(80); + degreeout->setValue(90); ybout->setValue(18); tempout->setValue (nexttemp); greenout->setValue (nextgreen); @@ -1490,7 +1495,7 @@ void ColorAppearance::presetcat02pressed () ybscen->setAutoValue (true); surrsrc->set_active (0); wbmodel->set_active (0); - illum->set_active (1); + illum->set_active (2); tempsc->resetValue (false); greensc->resetValue (false); adapscen->resetValue (false); @@ -1973,26 +1978,30 @@ void ColorAppearance::illumChanged () tempsc->set_sensitive(false); greensc->set_sensitive(false); } else if (illum->get_active_row_number() == 1) { - tempsc->setValue (5003); + tempsc->setValue (4100); tempsc->set_sensitive(false); greensc->set_sensitive(false); } else if (illum->get_active_row_number() == 2) { - tempsc->setValue (5503); + tempsc->setValue (5003); tempsc->set_sensitive(false); greensc->set_sensitive(false); } else if (illum->get_active_row_number() == 3) { - tempsc->setValue (6000); + tempsc->setValue (5503); tempsc->set_sensitive(false); greensc->set_sensitive(false); } else if (illum->get_active_row_number() == 4) { - tempsc->setValue (6504); + tempsc->setValue (6000); tempsc->set_sensitive(false); greensc->set_sensitive(false); } else if (illum->get_active_row_number() == 5) { - tempsc->setValue (7504); + tempsc->setValue (6504); tempsc->set_sensitive(false); greensc->set_sensitive(false); } else if (illum->get_active_row_number() == 6) { + tempsc->setValue (7504); + tempsc->set_sensitive(false); + greensc->set_sensitive(false); + } else if (illum->get_active_row_number() == 7) { tempsc->set_sensitive(true); greensc->set_sensitive(true); } From e3b5a5974884baca831d39ff80750256596b3be8 Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 5 Mar 2020 10:41:22 +0100 Subject: [PATCH 009/109] First improvment to histxyY 158 to 192 --- rtengine/rawimagesource.cc | 424 +++++++++++++++++++++---------------- 1 file changed, 245 insertions(+), 179 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index ff9472f1a..53c4aaff0 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -3897,7 +3897,7 @@ void RawImageSource::getRowStartEnd (int x, int &start, int &end) static void histoxyY(int bfhitc, int bfwitc, const array2D & xc, const array2D & yc, const array2D & Yc, LUTf &xxx, LUTf &yyy, LUTf &YYY, LUTu &histxy) { - //calculate histogram x y in a range of 158 colors + //calculate histogram x y in a range of 190 colors //this "choice" are guided by generally colors who are in nature skin, sky, etc. in those cases "steps" are small // of course we can change to be more precise #ifdef _OPENMP @@ -4000,279 +4000,345 @@ static void histoxyY(int bfhitc, int bfwitc, const array2D & xc, const ar nh = 32; } else if (yc[y][x] < 0.32f) { nh = 33; - } else if (yc[y][x] < 0.34f) { + } else if (yc[y][x] < 0.33f) { nh = 34; - } else if (yc[y][x] < 0.37f) { + } else if (yc[y][x] < 0.335f) { nh = 35; - } else if (yc[y][x] < 0.4f) { + } else if (yc[y][x] < 0.34f) { nh = 36; - } else if (yc[y][x] < 0.45f) { + } else if (yc[y][x] < 0.35f) { nh = 37; - } else if (yc[y][x] < 0.5f) { + } else if (yc[y][x] < 0.37f) { nh = 38; - } else if (yc[y][x] < 0.55f) { + } else if (yc[y][x] < 0.4f) { nh = 39; - } else if (yc[y][x] < 0.7f) { + } else if (yc[y][x] < 0.45f) { nh = 40; + } else if (yc[y][x] < 0.5f) { + nh = 41; + } else if (yc[y][x] < 0.55f) { + nh = 42; + } else if (yc[y][x] < 0.7f) { + nh = 43; } } else if (xc[y][x] < 0.335f && yc[y][x] > 0.1f) {//neutral if (yc[y][x] < 0.2f) { - nh = 41; - } else if (yc[y][x] < 0.24f) { - nh = 42; - } else if (yc[y][x] < 0.29f) { - nh = 43; - } else if (yc[y][x] < 0.32f) { nh = 44; - } else if (yc[y][x] < 0.33f) { + } else if (yc[y][x] < 0.24f) { nh = 45; - } else if (yc[y][x] < 0.34f) { + } else if (yc[y][x] < 0.29f) { nh = 46; - } else if (yc[y][x] < 0.35f) { + } else if (yc[y][x] < 0.32f) { nh = 47; - } else if (yc[y][x] < 0.36f) { + } else if (yc[y][x] < 0.33f) { nh = 48; - } else if (yc[y][x] < 0.37f) { - nh = 47; - } else if (yc[y][x] < 0.38f) { - nh = 48; - } else if (yc[y][x] < 0.4f) { + } else if (yc[y][x] < 0.335f) { nh = 49; - } else if (yc[y][x] < 0.45f) { + } else if (yc[y][x] < 0.34f) { nh = 50; - } else if (yc[y][x] < 0.5f) { + } else if (yc[y][x] < 0.345f) { nh = 51; - } else if (yc[y][x] < 0.55f) { + } else if (yc[y][x] < 0.35f) { nh = 52; - } else if (yc[y][x] < 0.7f) { + } else if (yc[y][x] < 0.355f) { nh = 53; + } else if (yc[y][x] < 0.36f) { + nh = 54; + } else if (yc[y][x] < 0.37f) { + nh = 55; + } else if (yc[y][x] < 0.38f) { + nh = 56; + } else if (yc[y][x] < 0.4f) { + nh = 57; + } else if (yc[y][x] < 0.45f) { + nh = 58; + } else if (yc[y][x] < 0.5f) { + nh = 59; + } else if (yc[y][x] < 0.55f) { + nh = 60; + } else if (yc[y][x] < 0.7f) { + nh = 61; + } + } else if (xc[y][x] < 0.340f && yc[y][x] > 0.1f) {//neutral + if (yc[y][x] < 0.2f) { + nh = 62; + } else if (yc[y][x] < 0.24f) { + nh = 63; + } else if (yc[y][x] < 0.29f) { + nh = 64; + } else if (yc[y][x] < 0.32f) { + nh = 65; + } else if (yc[y][x] < 0.325f) { + nh = 66; + } else if (yc[y][x] < 0.33f) { + nh = 67; + } else if (yc[y][x] < 0.335f) { + nh = 68; + } else if (yc[y][x] < 0.34f) { + nh = 69; + } else if (yc[y][x] < 0.345f) { + nh = 70; + } else if (yc[y][x] < 0.35f) { + nh = 71; + } else if (yc[y][x] < 0.355f) { + nh = 72; + } else if (yc[y][x] < 0.36f) { + nh = 73; + } else if (yc[y][x] < 0.37f) { + nh = 74; + } else if (yc[y][x] < 0.38f) { + nh = 75; + } else if (yc[y][x] < 0.4f) { + nh = 76; + } else if (yc[y][x] < 0.45f) { + nh = 77; + } else if (yc[y][x] < 0.5f) { + nh = 78; + } else if (yc[y][x] < 0.55f) { + nh = 79; + } else if (yc[y][x] < 0.7f) { + nh = 80; } } else if (xc[y][x] < 0.345f && yc[y][x] > 0.1f) {//neutral 37 if (yc[y][x] < 0.2f) { - nh = 54; + nh = 81; } else if (yc[y][x] < 0.24f) { - nh = 55; + nh = 82; } else if (yc[y][x] < 0.29f) { - nh = 56; + nh = 83; } else if (yc[y][x] < 0.32f) { - nh = 57; - } else if (yc[y][x] < 0.33f) {//34 - nh = 58; + nh = 84; + } else if (yc[y][x] < 0.33f) { + nh = 85; + } else if (yc[y][x] < 0.335f) { + nh = 86; } else if (yc[y][x] < 0.34f) { - nh = 59; - } else if (yc[y][x] < 0.35f) {//34 - nh = 60; - } else if (yc[y][x] < 0.36f) {//34 - nh = 61; + nh = 87; + } else if (yc[y][x] < 0.345f) { + nh = 88; + } else if (yc[y][x] < 0.35f) { + nh = 89; + } else if (yc[y][x] < 0.355f) { + nh = 90; + } else if (yc[y][x] < 0.36f) { + nh = 91; } else if (yc[y][x] < 0.37f) { - nh = 62; + nh = 92; } else if (yc[y][x] < 0.38f) { - nh = 63; + nh = 93; } else if (yc[y][x] < 0.39f) { - nh = 64; + nh = 94; } else if (yc[y][x] < 0.4f) { - nh = 65; + nh = 95; } else if (yc[y][x] < 0.42f) { - nh = 66; + nh = 96; } else if (yc[y][x] < 0.45f) { - nh = 67; + nh = 97; } else if (yc[y][x] < 0.48f) { - nh = 68; + nh = 98; } else if (yc[y][x] < 0.5f) { - nh = 69; + nh = 99; } else if (yc[y][x] < 0.55f) { - nh = 70; + nh = 100; } else if (yc[y][x] < 0.65f) { - nh = 71; + nh = 101; } } else if (xc[y][x] < 0.355f && yc[y][x] > 0.1f) {//neutral 37 if (yc[y][x] < 0.2f) { - nh = 72; + nh = 102; } else if (yc[y][x] < 0.24f) { - nh = 73; + nh = 103; } else if (yc[y][x] < 0.29f) { - nh = 74; + nh = 104; } else if (yc[y][x] < 0.32f) { - nh = 75; - } else if (yc[y][x] < 0.33f) {//34 - nh = 76; + nh = 105; + } else if (yc[y][x] < 0.33f) { + nh = 106; + } else if (yc[y][x] < 0.335f) { + nh = 107; } else if (yc[y][x] < 0.34f) { - nh = 77; - } else if (yc[y][x] < 0.35f) {//34 - nh = 78; - } else if (yc[y][x] < 0.36f) {//34 - nh = 79; + nh = 108; + } else if (yc[y][x] < 0.345f) { + nh = 109; + } else if (yc[y][x] < 0.35f) { + nh = 110; + } else if (yc[y][x] < 0.355f) { + nh = 111; + } else if (yc[y][x] < 0.36f) { + nh = 112; } else if (yc[y][x] < 0.37f) { - nh = 80; + nh = 113; } else if (yc[y][x] < 0.38f) { - nh = 81; + nh = 114; } else if (yc[y][x] < 0.39f) { - nh = 82; + nh = 115; } else if (yc[y][x] < 0.4f) { - nh = 83; + nh = 116; } else if (yc[y][x] < 0.42f) { - nh = 84; + nh = 117; } else if (yc[y][x] < 0.45f) { - nh = 85; + nh = 118; } else if (yc[y][x] < 0.48f) { - nh = 86; + nh = 119; } else if (yc[y][x] < 0.5f) { - nh = 87; + nh = 120; } else if (yc[y][x] < 0.55f) { - nh = 88; + nh = 121; } else if (yc[y][x] < 0.65f) { - nh = 89; + nh = 122; } } else if (xc[y][x] < 0.365f && yc[y][x] > 0.15f) { //0.4 if (yc[y][x] < 0.2f) { - nh = 90; - } else if (yc[y][x] < 0.24f) { - nh = 91; - } else if (yc[y][x] < 0.29f) { - nh = 92; - } else if (yc[y][x] < 0.32f) { - nh = 93; - } else if (yc[y][x] < 0.33f) { - nh = 94; - } else if (yc[y][x] < 0.34f) { - nh = 95; - } else if (yc[y][x] < 0.36f) { - nh = 96; - } else if (yc[y][x] < 0.37f) { - nh = 97; - } else if (yc[y][x] < 0.38f) { - nh = 98; - } else if (yc[y][x] < 0.39f) { - nh = 99; - } else if (yc[y][x] < 0.4f) { - nh = 100; - } else if (yc[y][x] < 0.42f) { - nh = 101; - } else if (yc[y][x] < 0.45f) { - nh = 102; - } else if (yc[y][x] < 0.5f) { - nh = 103; - } else if (yc[y][x] < 0.55f) { - nh = 104; - } else if (yc[y][x] < 0.63f) { - nh = 105; - } - } else if (xc[y][x] < 0.405f && yc[y][x] > 0.15f) {//45 - if (yc[y][x] < 0.2f) { - nh = 106; - } else if (yc[y][x] < 0.24f) { - nh = 107; - } else if (yc[y][x] < 0.29f) { - nh = 108; - } else if (yc[y][x] < 0.32f) { - nh = 109; - } else if (yc[y][x] < 0.34f) { - nh = 110; - } else if (yc[y][x] < 0.37f) { - nh = 111; - } else if (yc[y][x] < 0.4f) { - nh = 112; - } else if (yc[y][x] < 0.45f) { - nh = 113; - } else if (yc[y][x] < 0.5f) { - nh = 114; - } else if (yc[y][x] < 0.55f) { - nh = 115; - } else if (yc[y][x] < 0.6f) { - nh = 116; - } - } else if (xc[y][x] < 0.445f && yc[y][x] > 0.15f) {//45 - if (yc[y][x] < 0.2f) { - nh = 117; - } else if (yc[y][x] < 0.24f) { - nh = 118; - } else if (yc[y][x] < 0.29f) { - nh = 119; - } else if (yc[y][x] < 0.32f) { - nh = 120; - } else if (yc[y][x] < 0.34f) { - nh = 121; - } else if (yc[y][x] < 0.37f) { - nh = 122; - } else if (yc[y][x] < 0.4f) { nh = 123; - } else if (yc[y][x] < 0.45f) { - nh = 124; - } else if (yc[y][x] < 0.5f) { - nh = 125; - } else if (yc[y][x] < 0.55f) { - nh = 126; - } else if (yc[y][x] < 0.58f) { - nh = 127; - } - } else if (xc[y][x] < 0.495f && yc[y][x] > 0.15f) { - if (yc[y][x] < 0.2f) { - nh = 128; } else if (yc[y][x] < 0.24f) { - nh = 129; + nh = 124; } else if (yc[y][x] < 0.29f) { - nh = 130; + nh = 125; } else if (yc[y][x] < 0.32f) { - nh = 131; + nh = 126; + } else if (yc[y][x] < 0.33f) { + nh = 127; } else if (yc[y][x] < 0.34f) { - nh = 132; + nh = 128; + } else if (yc[y][x] < 0.35f) { + nh = 129; + } else if (yc[y][x] < 0.36f) { + nh = 130; } else if (yc[y][x] < 0.37f) { + nh = 131; + } else if (yc[y][x] < 0.38f) { + nh = 132; + } else if (yc[y][x] < 0.39f) { nh = 133; } else if (yc[y][x] < 0.4f) { nh = 134; - } else if (yc[y][x] < 0.45f) { + } else if (yc[y][x] < 0.42f) { nh = 135; - } else if (yc[y][x] < 0.5f) { + } else if (yc[y][x] < 0.45f) { nh = 136; - } else if (yc[y][x] < 0.55f) { + } else if (yc[y][x] < 0.5f) { nh = 137; + } else if (yc[y][x] < 0.55f) { + nh = 138; + } else if (yc[y][x] < 0.63f) { + nh = 139; + } + } else if (xc[y][x] < 0.405f && yc[y][x] > 0.15f) {//45 + if (yc[y][x] < 0.2f) { + nh = 140; + } else if (yc[y][x] < 0.24f) { + nh = 141; + } else if (yc[y][x] < 0.29f) { + nh = 142; + } else if (yc[y][x] < 0.32f) { + nh = 143; + } else if (yc[y][x] < 0.34f) { + nh = 144; + } else if (yc[y][x] < 0.37f) { + nh = 145; + } else if (yc[y][x] < 0.4f) { + nh = 146; + } else if (yc[y][x] < 0.45f) { + nh = 147; + } else if (yc[y][x] < 0.5f) { + nh = 148; + } else if (yc[y][x] < 0.55f) { + nh = 149; + } else if (yc[y][x] < 0.6f) { + nh = 150; + } + } else if (xc[y][x] < 0.445f && yc[y][x] > 0.15f) {//45 + if (yc[y][x] < 0.2f) { + nh = 151; + } else if (yc[y][x] < 0.24f) { + nh = 152; + } else if (yc[y][x] < 0.29f) { + nh = 153; + } else if (yc[y][x] < 0.32f) { + nh = 154; + } else if (yc[y][x] < 0.34f) { + nh = 155; + } else if (yc[y][x] < 0.37f) { + nh = 156; + } else if (yc[y][x] < 0.4f) { + nh = 157; + } else if (yc[y][x] < 0.45f) { + nh = 158; + } else if (yc[y][x] < 0.5f) { + nh = 159; + } else if (yc[y][x] < 0.55f) { + nh = 160; + } else if (yc[y][x] < 0.58f) { + nh = 161; + } + } else if (xc[y][x] < 0.495f && yc[y][x] > 0.15f) { + if (yc[y][x] < 0.2f) { + nh = 162; + } else if (yc[y][x] < 0.24f) { + nh = 163; + } else if (yc[y][x] < 0.29f) { + nh = 164; + } else if (yc[y][x] < 0.32f) { + nh = 165; + } else if (yc[y][x] < 0.34f) { + nh = 166; + } else if (yc[y][x] < 0.37f) { + nh = 167; + } else if (yc[y][x] < 0.4f) { + nh = 168; + } else if (yc[y][x] < 0.45f) { + nh = 169; + } else if (yc[y][x] < 0.5f) { + nh = 170; + } else if (yc[y][x] < 0.55f) { + nh = 171; } } else if (xc[y][x] < 0.545f && yc[y][x] > 0.15f) { if (yc[y][x] < 0.2f) { - nh = 138; + nh = 172; } else if (yc[y][x] < 0.24f) { - nh = 139; + nh = 173; } else if (yc[y][x] < 0.29f) { - nh = 140; + nh = 174; } else if (yc[y][x] < 0.32f) { - nh = 141; + nh = 175; } else if (yc[y][x] < 0.34f) { - nh = 142; + nh = 176; } else if (yc[y][x] < 0.37f) { - nh = 143; + nh = 177; } else if (yc[y][x] < 0.4f) { - nh = 144; + nh = 178; } else if (yc[y][x] < 0.45f) { - nh = 145; + nh = 179; } else if (yc[y][x] < 0.5f) { - nh = 146; + nh = 180; } } else if (xc[y][x] < 0.595f && yc[y][x] > 0.15f) { if (yc[y][x] < 0.22f) { - nh = 147; + nh = 181; } else if (yc[y][x] < 0.25f) { - nh = 148; + nh = 182; } else if (yc[y][x] < 0.3f) { - nh = 149; + nh = 183; } else if (yc[y][x] < 0.35f) { - nh = 150; + nh = 184; } else if (yc[y][x] < 0.4f) { - nh = 151; + nh = 185; } else if (yc[y][x] < 0.45f) { - nh = 152; + nh = 186; } } else if (xc[y][x] < 0.65f && yc[y][x] > 0.12f) { if (yc[y][x] < 0.25f) { - nh = 153; + nh = 187; } else if (yc[y][x] < 0.3f) { - nh = 154; + nh = 188; } else if (yc[y][x] < 0.35f) { - nh = 155; + nh = 189; } else if (yc[y][x] < 0.45f) { - nh = 156; + nh = 190; } } else if (xc[y][x] < 0.75f && yc[y][x] > 0.1f) { - nh = 157; + nh = 191; } if (nh >= 0) { histxythr[nh]++; @@ -4714,7 +4780,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double float gmm[N_t]; float bmm[N_t]; - constexpr int siza = 158;//size of histogram + constexpr int siza = 192;//size of histogram //tempref and greenref are camera wb values. // I used them by default to select good spectral values !! From e63320eec9c11c55e3d6726de829d7027b6f9197 Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 5 Mar 2020 13:36:37 +0100 Subject: [PATCH 010/109] Added new spectral datas near neutral --- rtengine/colortemp.cc | 38 +++++++++++++++++++++++++++++++++++++- rtengine/colortemp.h | 3 +++ rtengine/rawimagesource.cc | 16 ++++++++-------- 3 files changed, 48 insertions(+), 9 deletions(-) diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index ec8641fc0..8ef1be27d 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -2408,6 +2408,41 @@ const double ColorTemp::Colorlab_n80_26_spect[97] = { -0.2047, -0.205, -0.2069, -0.208, -0.2099, -0.21, -0.2115, -0.21, -0.2106, -0.209, -0.2086, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; +//0,1767000 0,2207000 0,3142000 0,5269000 0,7018000 0,7605000 0,7580000 0,7366000 0,7182000 0,6929000 0,6661000 0,6542000 +//0,6420000 0,6085000 0,5752000 0,5728000 0,5723000 0,5318000 0,4982000 0,5226000 0,5670000 0,5929000 0,5977000 0,5975000 +//0,6002000 0,6065000 0,6177000 0,6352000 0,6526000 0,6623000 0,6633000 0,6593000 0,6517000 0,6479000 0,6607000 0,6908000 + +const double ColorTemp::JDC468_greyc14_66_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1767, 0.19, 0.2207, 0.25, 0.3142, 0.40, 0.5269, 0.63, 0.7018, 0.73, 0.7605, 0.76, 0.7580, 0.74, 0.7366, 0.725, 0.7182, 0.705, 0.6929, 0.68, 0.6661, 0.66, 0.6542, 0.65, + 0.642, 0.62, 0.6085, 0.585, 0.5752, 0.573, 0.5728, 0.573, 0.5723, 0.555, 0.5318, 0.51, 0.4982, 0.51, 0.5226, 0.54, 0.5670, 0.58, 0.5929, 0.594, 0.5977, 0.597, 0.5975, 0.6, + 0.6002, 0.602, 0.6065, 0.61, 0.6177, 0.62, 0.6352, 0.64, 0.6526, 0.66, 0.6623, 0.662, 0.6633, 0.66, 0.6593, 0.653, 0.6517, 0.65, 0.6479, 0.65, 0.6607, 0.69, 0.6908, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//0,1325000 0,1637000 0,2222000 0,3492000 0,4523000 0,4897000 0,4918000 0,4840000 0,4761000 0,4638000 0,4538000 0,4582000 +// 0,4588000 0,4360000 0,4091000 0,4101000 0,4128000 0,3785000 0,3494000 0,3720000 0,4122000 0,4339000 0,4362000 0,4355000 +// 0,4395000 0,4475000 0,4606000 0,4807000 0,5006000 0,5125000 0,5145000 0,5112000 0,5029000 0,4992000 0,5150000 0,5526000 + +const double ColorTemp::JDC468_greym13_325_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1325, 0.15, 0.1637, 0.2, 0.2222, 0.28, 0.3492, 0.40, 0.4523, 0.47, 0.4897, 0.49, 0.4918, 0.49, 0.4840, 0.48, 0.4761, 0.47, 0.4638, 0.46, 0.4538, 0.455, 0.4582, 0.458, + 0.4588, 0.45, 0.4360, 0.42, 0.4091, 0.41, 0.4101, 0.411, 0.4128, 0.405, 0.3785, 0.36, 0.3494, 0.36, 0.3720, 0.41, 0.4122, 0.425, 0.4339, 0.435, 0.4362, 0.597, 0.4355, 0.437, + 0.4395, 0.44, 0.4475, 0.45, 0.4606, 0.47, 0.4807, 0.49, 0.5006, 0.51, 0.5125, 0.513, 0.5145, 0.512, 0.5112, 0.51, 0.5029, 0.5, 0.4992, 0.51, 0.5150, 0.53, 0.5526, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//0,0823000 0,1036000 0,1337000 0,1966000 0,2468000 0,2679000 0,2728000 0,2726000 0,2724000 0,2698000 0,2705000 0,2810000 +// 0,2879000 0,2756000 0,2586000 0,2601000 0,2617000 0,2357000 0,2124000 0,2241000 0,2471000 0,2581000 0,2569000 0,2548000 +// 0,2579000 0,2653000 0,2765000 0,2941000 0,3126000 0,3230000 0,3238000 0,3189000 0,3091000 0,3043000 0,3200000 0,3579000 + +const double ColorTemp::JDC468_greyf26_156_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0823, 0.1, 0.1036, 0.11, 0.1337, 0.16, 0.1966, 0.22, 0.2468, 0.255, 0.2679, 0.27, 0.2728, 0.273, 0.2726, 0.273, 0.2724, 0.271, 0.2698, 0.27, 0.2705, 0.275, 0.2810, 0.285, + 0.2879, 0.28, 0.2756, 0.26, 0.2586, 0.26, 0.2601, 0.261, 0.2617, 0.25, 0.2357, 0.22, 0.2124, 0.22, 0.2241, 0.23, 0.2471, 0.25, 0.2581, 0.278, 0.2569, 0.255, 0.2548, 0.255, + 0.2579, 0.26, 0.2653, 0.27, 0.2765, 0.28, 0.2941, 0.30, 0.3126, 0.32, 0.3230, 0.323, 0.3238, 0.32, 0.3189, 0.31, 0.3091, 0.302, 0.3043, 0.31, 0.3200, 0.34, 0.3579, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + /* * Name: XYZtoCorColorTemp.c @@ -3449,7 +3484,8 @@ void ColorTemp::tempxy(bool separated, int repref, float **Tx, float **Ty, float J570_NeuQ1_spect, J570_NeuS7_spect, J570_NeuV10_spect, J570_NeuW18_spect, J570_NeuZ14_spect, //189 J570_NeuC18_spect, J570_NeuD17_spect, J570_NeuJ11_spect, J570_NeuL4_spect, Colorlab_n72_n2_spect, - Colorlab_10_n70_spect, Colorlab_n33_n70_spect, Colorlab_n8_n74_spect, Colorlab_19_n69_spect, Colorlab_n80_10_spect, Colorlab_n80_26_spect + Colorlab_10_n70_spect, Colorlab_n33_n70_spect, Colorlab_n8_n74_spect, Colorlab_19_n69_spect, Colorlab_n80_10_spect, Colorlab_n80_26_spect, + JDC468_greyc14_66_spect, JDC468_greym13_325_spect, JDC468_greyf26_156_spect }; diff --git a/rtengine/colortemp.h b/rtengine/colortemp.h index 5feed9d26..e96bf8563 100644 --- a/rtengine/colortemp.h +++ b/rtengine/colortemp.h @@ -367,6 +367,9 @@ public: static const double Colorlab_19_n69_spect[97]; static const double Colorlab_n80_10_spect[97]; static const double Colorlab_n80_26_spect[97]; + static const double JDC468_greyc14_66_spect[97]; + static const double JDC468_greym13_325_spect[97]; + static const double JDC468_greyf26_156_spect[97]; static void spectrum_to_xyz_daylight (double _m1, double _m2, double &x, double &y, double &z); static void spectrum_to_xyz_blackbody (double _temp, double &x, double &y, double &z); diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 53c4aaff0..f876b8902 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -4412,19 +4412,19 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double Copyright (c) Jacques Desmis 6 - 2018 jdesmis@gmail.com Copyright (c) Ingo Weyrich 3 - 2020 (heckflosse67@gmx.de) - This algorithm try to find temperature correlation between 20 to 200 color between 200 spectral color and about 20 to 55 color found in the image, I just found the idea in the web "correlate with chroma" instead of RGB grey point,but I don't use any algo found on the web. + This algorithm try to find temperature correlation between 20 to 203 color between 200 spectral color and about 20 to 55 color found in the image, I just found the idea in the web "correlate with chroma" instead of RGB grey point,but I don't use any algo found on the web. I have test many many algorithms to find the first one that work :) Probably (sure) there are improvement to do... I have create a table temperature with temp and white point with 100 values between 2000K and 12000K we can obviously change these values, more...with different steps - I have create or recuparate and transformed 200 spectral colors from Colorchecker24, others color and my 468 colors target, or from web flowers, etc. with a step of 5nm, I think it is large enough. - I think this value of 200 is now complete: I tested correlation with 60, 90, 100, 120, 155...better student increase with number of color, but now it seems stabilized + I have create or recuparate and transformed 203 spectral colors from Colorchecker24, others color and my 468 colors target, or from web flowers, etc. with a step of 5nm, I think it is large enough. + I think this value of 203 is now complete: I tested correlation with 60, 90, 100, 120, 155...better student increase with number of color, but now it seems stabilized Of course we can increase this number :) 1) for the current raw file we create a table for each temp of RGB multipliers 2) then, I choose the "camera temp" to initialize calculation (why not) - 3) for this temp, I calculated XYZ values for the 200 spectral datas + 3) for this temp, I calculated XYZ values for the 203 spectral datas 4) then I create for the image an "histogram", but for xyY (Cie 1931 color space) 5) for each pixel (in fact to accelerate only 1/10 for and 1/10 for y), I determine for each couple xy, the number of occurences 6) I sort this result in ascending order @@ -4764,7 +4764,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double {12001., 0.960440, 1.601019} }; const int N_t = sizeof(Txyz) / sizeof(Txyz[0]); //number of temperature White point - constexpr int Nc = 200 + 1;//200 number of reference spectral colors, I think it is enough to retrieve good values + constexpr int Nc = 203 + 1;//200 number of reference spectral colors, I think it is enough to retrieve good values array2D Tx(N_t, Nc); array2D Ty(N_t, Nc); array2D Tz(N_t, Nc); @@ -4863,7 +4863,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double array2D reff_spect_xx_camera(N_t, 2 * Nc + 2); //here we select the good spectral color inside the 113 values - //call tempxy to calculate for 200 color references Temp and XYZ with cat02 + //call tempxy to calculate for 203 color references Temp and XYZ with cat02 ColorTemp::tempxy(separated, repref, Tx, Ty, Tz, Ta, Tb, TL, TX, TY, TZ, wbpar); //calculate chroma xy (xyY) for Z known colors on under 200 illuminants @@ -5021,7 +5021,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double int maxnb = rtengine::LIM(settings->itcwb_sizereference, 1, 5); if (settings->itcwb_thres > 39) { - maxnb = 200 / settings->itcwb_thres; + maxnb = 203 / settings->itcwb_thres; } for (int nb = 1; nb <= maxnb; ++nb) { //max 5 iterations for Itcwb_thres=33, after trial 3 is good in most cases but in some cases 5 @@ -5299,7 +5299,7 @@ void RawImageSource::getrgbloc(int begx, int begy, int yEn, int xEn, int cx, int { // BENCHFUN //used by auto WB local to calculate red, green, blue in local region - const int bfw = W / 10 + ((W % 10) > 0 ? 1 : 0);// 10 arbitrary value ; perhaps 4 or 5 or 20 + const int bfw = W / 10 + ((W % 10) > 0 ? 1 : 0);//10 arbitrary value ; perhaps 4 or 5 or 20 const int bfh = H / 10 + ((H % 10) > 0 ? 1 : 0); if (! greenloc) { From f6c5bf0a0b5b4478d1b40a79b33c1202a9885d7c Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 6 Mar 2020 08:53:39 +0100 Subject: [PATCH 011/109] Change didide getrgbloc 10 to 9 - suppress 3 spectral datas --- rtengine/colortemp.cc | 7 ++++--- rtengine/colortemp.h | 3 ++- rtengine/rawimagesource.cc | 14 +++++++------- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index 8ef1be27d..0b49658cd 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -2408,6 +2408,7 @@ const double ColorTemp::Colorlab_n80_26_spect[97] = { -0.2047, -0.205, -0.2069, -0.208, -0.2099, -0.21, -0.2115, -0.21, -0.2106, -0.209, -0.2086, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; +/* //0,1767000 0,2207000 0,3142000 0,5269000 0,7018000 0,7605000 0,7580000 0,7366000 0,7182000 0,6929000 0,6661000 0,6542000 //0,6420000 0,6085000 0,5752000 0,5728000 0,5723000 0,5318000 0,4982000 0,5226000 0,5670000 0,5929000 0,5977000 0,5975000 //0,6002000 0,6065000 0,6177000 0,6352000 0,6526000 0,6623000 0,6633000 0,6593000 0,6517000 0,6479000 0,6607000 0,6908000 @@ -2442,7 +2443,7 @@ const double ColorTemp::JDC468_greyf26_156_spect[97] = { 0.2579, 0.26, 0.2653, 0.27, 0.2765, 0.28, 0.2941, 0.30, 0.3126, 0.32, 0.3230, 0.323, 0.3238, 0.32, 0.3189, 0.31, 0.3091, 0.302, 0.3043, 0.31, 0.3200, 0.34, 0.3579, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; - +*/ /* * Name: XYZtoCorColorTemp.c @@ -3484,8 +3485,8 @@ void ColorTemp::tempxy(bool separated, int repref, float **Tx, float **Ty, float J570_NeuQ1_spect, J570_NeuS7_spect, J570_NeuV10_spect, J570_NeuW18_spect, J570_NeuZ14_spect, //189 J570_NeuC18_spect, J570_NeuD17_spect, J570_NeuJ11_spect, J570_NeuL4_spect, Colorlab_n72_n2_spect, - Colorlab_10_n70_spect, Colorlab_n33_n70_spect, Colorlab_n8_n74_spect, Colorlab_19_n69_spect, Colorlab_n80_10_spect, Colorlab_n80_26_spect, - JDC468_greyc14_66_spect, JDC468_greym13_325_spect, JDC468_greyf26_156_spect + Colorlab_10_n70_spect, Colorlab_n33_n70_spect, Colorlab_n8_n74_spect, Colorlab_19_n69_spect, Colorlab_n80_10_spect, Colorlab_n80_26_spect + /*JDC468_greyc14_66_spect, JDC468_greym13_325_spect, JDC468_greyf26_156_spect*/ }; diff --git a/rtengine/colortemp.h b/rtengine/colortemp.h index e96bf8563..e3c899f82 100644 --- a/rtengine/colortemp.h +++ b/rtengine/colortemp.h @@ -367,10 +367,11 @@ public: static const double Colorlab_19_n69_spect[97]; static const double Colorlab_n80_10_spect[97]; static const double Colorlab_n80_26_spect[97]; + /* static const double JDC468_greyc14_66_spect[97]; static const double JDC468_greym13_325_spect[97]; static const double JDC468_greyf26_156_spect[97]; - + */ static void spectrum_to_xyz_daylight (double _m1, double _m2, double &x, double &y, double &z); static void spectrum_to_xyz_blackbody (double _temp, double &x, double &y, double &z); static void spectrum_to_xyz_preset (const double* spec_intens, double &x, double &y, double &z); diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index f876b8902..c4226585a 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -4764,7 +4764,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double {12001., 0.960440, 1.601019} }; const int N_t = sizeof(Txyz) / sizeof(Txyz[0]); //number of temperature White point - constexpr int Nc = 203 + 1;//200 number of reference spectral colors, I think it is enough to retrieve good values + constexpr int Nc = 200 + 1;//200 number of reference spectral colors, I think it is enough to retrieve good values array2D Tx(N_t, Nc); array2D Ty(N_t, Nc); array2D Tz(N_t, Nc); @@ -5299,8 +5299,8 @@ void RawImageSource::getrgbloc(int begx, int begy, int yEn, int xEn, int cx, int { // BENCHFUN //used by auto WB local to calculate red, green, blue in local region - const int bfw = W / 10 + ((W % 10) > 0 ? 1 : 0);//10 arbitrary value ; perhaps 4 or 5 or 20 - const int bfh = H / 10 + ((H % 10) > 0 ? 1 : 0); + const int bfw = W / 9 + ((W % 9) > 0 ? 1 : 0);//10 arbitrary value ; perhaps 4 or 5 or 20 + const int bfh = H / 9 + ((H % 9) > 0 ? 1 : 0); if (! greenloc) { greenloc(bfw, bfh); @@ -5350,9 +5350,9 @@ void RawImageSource::getrgbloc(int begx, int begy, int yEn, int xEn, int cx, int #pragma omp parallel for #endif for (int i = 0; i < bfh; ++i) { - const int ii = i * 10; + const int ii = i * 9; if (ii < H) { - for (int j = 0, jj = 0; jj < W; ++j, jj += 10) { + for (int j = 0, jj = 0; j < bfw; ++j, jj += 9) { redloc[i][j] = red[ii][jj] * multip; greenloc[i][j] = green[ii][jj] * multip; blueloc[i][j] = blue[ii][jj] * multip; @@ -5552,8 +5552,8 @@ void RawImageSource::getAutoWBMultipliersitc(double & tempref, double & greenref if (wbpar.method == "autitcgreen") { bool twotimes = false; - const int bfw = W / 10 + ((W % 10) > 0 ? 1 : 0);// 10 arbitrary value ; perhaps 4 or 5 or 20 - const int bfh = H / 10 + ((H % 10) > 0 ? 1 : 0); + const int bfw = W / 9 + ((W % 9) > 0 ? 1 : 0);// 10 arbitrary value ; perhaps 4 or 5 or 20 + const int bfh = H / 9 + ((H % 9) > 0 ? 1 : 0); WBauto(tempref, greenref, redloc, greenloc, blueloc, bfw, bfh, avg_rm, avg_gm, avg_bm, tempitc, greenitc, studgood, twotimes, wbpar, begx, begy, yEn, xEn, cx, cy, cmp, raw); } From 9773f1bd98930e43930c19625b491eb156208bbb Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 6 Mar 2020 10:41:58 +0100 Subject: [PATCH 012/109] Improve results when chroma is very low --- rtengine/colortemp.cc | 27 ++++++++++++++++++++++++++- rtengine/colortemp.h | 3 +++ rtengine/rawimagesource.cc | 30 ++++++++++++++++++------------ 3 files changed, 47 insertions(+), 13 deletions(-) diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index 0b49658cd..4d5cb42f2 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -2444,7 +2444,30 @@ const double ColorTemp::JDC468_greyf26_156_spect[97] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; */ +//A1 0.0912 0.1228 0.1712 0.2978 0.3713 0.4241 0.4861 0.5255 0.5355 0.5363 0.5237 0.5251 +// 0.5722 0.6554 0.6936 0.6675 0.6203 0.5651 0.5116 0.4825 0.4714 0.4866 0.5320 0.5729 +// 0.5968 0.6069 0.6131 0.6198 0.6285 0.6325 0.6316 0.6282 0.6227 0.6196 0.6215 0.6337 +const double ColorTemp::Colorlab_n80_5_9_5_9spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0912, 0.1, 0.1228, 0.15, 0.1712, 0.2, 0.2978, 0.32, 0.3713, 0.41, 0.4241, 0.44, 0.4861, 0.51, 0.5255, 0.53, 0.5355, 0.534, 0.5363, 0.53, 0.5237, 0.524, 0.5251, 0.56, + 0.5722, 0.6, 0.6554, 0.67, 0.6936, 0.67, 0.6675, 0.65, 0.6203, 0.6, 0.5651, 0.54, 0.5116, 0.5, 0.4825, 0.48, 0.4714, 0.48, 0.4866, 0.5, 0.5320, 0.55, 0.5729, 0.58, + 0.5968, 0.6, 0.6069, 0.61, 0.6131, 0.615, 0.6198, 0.62, 0.6285, 0.63, 0.6325, 0.632, 0.6316, 0.63, 0.6282, 0.625, 0.6227, 0.62, 0.6196, 0.62, 0.6215, 0.63, 0.6337, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +/* +//A2 0.0385 0.0514 0.0711 0.1229 0.1528 0.1744 0.1999 0.2163 0.2209 0.2216 0.2167 0.2185 +//0.2414 0.2813 0.3012 0.2922 0.2734 0.2511 0.2292 0.2173 0.2127 0.2183 0.2354 0.2508 +//0.2599 0.2637 0.2662 0.2689 0.2725 0.2742 0.2738 0.2724 0.2701 0.2689 0.2697 0.2747 + +const double ColorTemp::Colorlab_n57_5_6_9spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0385, 0.04, 0.0514, 0.06, 0.0711, 0.1, 0.1229, 0.14, 0.1528, 0.16, 0.1744, 0.18, 0.1999, 0.2, 0.2163, 0.22, 0.2209, 0.221, 0.2216, 0.22, 0.2167, 0.216, 0.2185, 0.23, + 0.2414, 0.26, 0.2813, 0.3, 0.3012, 0.3, 0.2922, 0.28, 0.2734, 0.26, 0.2511, 0.24, 0.2292, 0.22, 0.2173, 0.215, 0.2127, 0.215, 0.2183, 0.22, 0.2354, 0.24, 0.2508, 0.255, + 0.2599, 0.26, 0.2637, 0.263, 0.2662, 0.267, 0.2689, 0.27, 0.2725, 0.273, 0.2742, 0.274, 0.2738, 0.273, 0.2724, 0.271, 0.2701, 0.27, 0.2689, 0.269, 0.2697, 0.27, 0.2747, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +*/ /* * Name: XYZtoCorColorTemp.c * @@ -3485,7 +3508,9 @@ void ColorTemp::tempxy(bool separated, int repref, float **Tx, float **Ty, float J570_NeuQ1_spect, J570_NeuS7_spect, J570_NeuV10_spect, J570_NeuW18_spect, J570_NeuZ14_spect, //189 J570_NeuC18_spect, J570_NeuD17_spect, J570_NeuJ11_spect, J570_NeuL4_spect, Colorlab_n72_n2_spect, - Colorlab_10_n70_spect, Colorlab_n33_n70_spect, Colorlab_n8_n74_spect, Colorlab_19_n69_spect, Colorlab_n80_10_spect, Colorlab_n80_26_spect + Colorlab_10_n70_spect, Colorlab_n33_n70_spect, Colorlab_n8_n74_spect, Colorlab_19_n69_spect, Colorlab_n80_10_spect, Colorlab_n80_26_spect, + Colorlab_n80_5_9_5_9spect //, Colorlab_n57_5_6_9spect + /*JDC468_greyc14_66_spect, JDC468_greym13_325_spect, JDC468_greyf26_156_spect*/ }; diff --git a/rtengine/colortemp.h b/rtengine/colortemp.h index e3c899f82..89c324490 100644 --- a/rtengine/colortemp.h +++ b/rtengine/colortemp.h @@ -367,6 +367,9 @@ public: static const double Colorlab_19_n69_spect[97]; static const double Colorlab_n80_10_spect[97]; static const double Colorlab_n80_26_spect[97]; + static const double Colorlab_n80_5_9_5_9spect[97]; +// static const double Colorlab_n57_5_6_9spect[97]; + /* static const double JDC468_greyc14_66_spect[97]; static const double JDC468_greym13_325_spect[97]; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index c4226585a..0326609cd 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -4412,19 +4412,19 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double Copyright (c) Jacques Desmis 6 - 2018 jdesmis@gmail.com Copyright (c) Ingo Weyrich 3 - 2020 (heckflosse67@gmx.de) - This algorithm try to find temperature correlation between 20 to 203 color between 200 spectral color and about 20 to 55 color found in the image, I just found the idea in the web "correlate with chroma" instead of RGB grey point,but I don't use any algo found on the web. + This algorithm try to find temperature correlation between 20 to 201 color between 200 spectral color and about 20 to 55 color found in the image, I just found the idea in the web "correlate with chroma" instead of RGB grey point,but I don't use any algo found on the web. I have test many many algorithms to find the first one that work :) Probably (sure) there are improvement to do... I have create a table temperature with temp and white point with 100 values between 2000K and 12000K we can obviously change these values, more...with different steps - I have create or recuparate and transformed 203 spectral colors from Colorchecker24, others color and my 468 colors target, or from web flowers, etc. with a step of 5nm, I think it is large enough. - I think this value of 203 is now complete: I tested correlation with 60, 90, 100, 120, 155...better student increase with number of color, but now it seems stabilized + I have create or recuparate and transformed 201 spectral colors from Colorchecker24, others color and my 468 colors target, or from web flowers, etc. with a step of 5nm, I think it is large enough. + I think this value of 201 is now complete: I tested correlation with 60, 90, 100, 120, 155...better student increase with number of color, but now it seems stabilized Of course we can increase this number :) 1) for the current raw file we create a table for each temp of RGB multipliers 2) then, I choose the "camera temp" to initialize calculation (why not) - 3) for this temp, I calculated XYZ values for the 203 spectral datas + 3) for this temp, I calculated XYZ values for the 201 spectral datas 4) then I create for the image an "histogram", but for xyY (Cie 1931 color space) 5) for each pixel (in fact to accelerate only 1/10 for and 1/10 for y), I determine for each couple xy, the number of occurences 6) I sort this result in ascending order @@ -4764,7 +4764,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double {12001., 0.960440, 1.601019} }; const int N_t = sizeof(Txyz) / sizeof(Txyz[0]); //number of temperature White point - constexpr int Nc = 200 + 1;//200 number of reference spectral colors, I think it is enough to retrieve good values + constexpr int Nc = 201 + 1;//200 number of reference spectral colors, I think it is enough to retrieve good values array2D Tx(N_t, Nc); array2D Ty(N_t, Nc); array2D Tz(N_t, Nc); @@ -4863,7 +4863,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double array2D reff_spect_xx_camera(N_t, 2 * Nc + 2); //here we select the good spectral color inside the 113 values - //call tempxy to calculate for 203 color references Temp and XYZ with cat02 + //call tempxy to calculate for 201 color references Temp and XYZ with cat02 ColorTemp::tempxy(separated, repref, Tx, Ty, Tz, Ta, Tb, TL, TX, TY, TZ, wbpar); //calculate chroma xy (xyY) for Z known colors on under 200 illuminants @@ -4998,7 +4998,9 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } estimchrom /= sizcu4; - + if (settings->verbose) { + printf("estimchrom=%f\n", estimchrom); + } if (settings->itcwb_sort) { //sort in ascending with chroma values std::sort(wbchro, wbchro + sizcu4, wbchro[0]); } @@ -5021,7 +5023,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double int maxnb = rtengine::LIM(settings->itcwb_sizereference, 1, 5); if (settings->itcwb_thres > 39) { - maxnb = 203 / settings->itcwb_thres; + maxnb = 201 / settings->itcwb_thres; } for (int nb = 1; nb <= maxnb; ++nb) { //max 5 iterations for Itcwb_thres=33, after trial 3 is good in most cases but in some cases 5 @@ -5178,13 +5180,14 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } //degrade correllation with color high chroma, but not too much...seems not good, but keep in case of?? - if (estimchrom < 0.025f) {//very smal value of chroma for image - + //I suppress this old behavior replace by tint += 0.02 + /* if (estimchrom < 0.025f) {//very smal value of chroma for image + //enable strong values good_spectral[0] = true;//blue good_spectral[11] = true;//green good_spectral[62] = true;//red } - +*/ int kkg = -1; for (int i = 0; i < Nc ; ++i) { if (good_spectral[i]) { @@ -5253,7 +5256,10 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double tempitc = Txyz[goodref].Tem; greenitc = gree[greengood].green; - + if (estimchrom < 0.025f) { + float ac = -2.40f * estimchrom + 0.06f;//small empirical correction, maximum 0.06 if chroma=0 for all image, currently for very low chroma +0.02 + greenitc += ac; + } } avg_rm = 10000.f * rmm[goodref]; From 0e5f514ec11a12e1d25c5d78602cc206957c18ad Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 6 Mar 2020 12:00:21 +0100 Subject: [PATCH 013/109] recalculate itcwb when demosaic method changed --- rtengine/improccoordinator.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 3cc58b01c..9bef5b502 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -434,7 +434,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) currWB = imgsrc->getWB(); lastAwbauto = ""; //reinitialize auto } else if (autowb) { - if (lastAwbEqual != params->wb.equal || lastAwbTempBias != params->wb.tempBias || lastAwbauto != params->wb.method) { + if (params->wb.method == "autitcgreen" || lastAwbEqual != params->wb.equal || lastAwbTempBias != params->wb.tempBias || lastAwbauto != params->wb.method) { double rm, gm, bm; double tempitc = 5000.f; double greenitc = 1.; From 961bf3e5fda37ca8a907733f72a1680e3a73e6c8 Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 6 Mar 2020 15:15:22 +0100 Subject: [PATCH 014/109] Change range geen in autowb --- rtengine/rawimagesource.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 0326609cd..1296e1a42 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -5284,7 +5284,7 @@ void RawImageSource::WBauto(double & tempref, double & greenref, array2D if (wbpar.method == "autitcgreen") { bool extra = false; - if (greenref > 0.77 && greenref < 1.3) {// 0/77 and 1.3 arbitraties values + if (greenref > 0.5 && greenref < 1.3) {// 0/77 and 1.3 arbitraties values greenitc = greenref; if (settings->itcwb_forceextra) { From 8875cc8df47e70852a235c167fca4a48adf297d7 Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 6 Mar 2020 16:04:31 +0100 Subject: [PATCH 015/109] Change number of green reference from 118 to 134 --- rtengine/rawimagesource.cc | 42 ++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 1296e1a42..48383c8ba 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -4493,14 +4493,30 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double float snedecor;//1. actually but put in case of confiance interval } WbGreen; //green (tint) values between 0.4 to 4.0 - constexpr WbGreen gree[118] = {//symmetric coefficient between 0.717 and 1.40 + constexpr WbGreen gree[134] = {//symmetric coefficient between 0.717 and 1.40 {0.400, 1.f}, + {0.420, 1.f}, + {0.440, 1.f}, + {0.460, 1.f}, + {0.480, 1.f}, {0.500, 1.f}, + {0.520, 1.f}, + {0.540, 1.f}, {0.550, 1.f}, + {0.560, 1.f}, + {0.570, 1.f}, + {0.580, 1.f}, + {0.590, 1.f}, {0.600, 1.f}, - {0.625, 1.f}, + {0.610, 1.f}, + {0.620, 1.f}, + {0.630, 1.f}, + {0.640, 1.f}, {0.650, 1.f}, - {0.675, 1.f}, + {0.660, 1.f}, + {0.670, 1.f}, + {0.680, 1.f}, + {0.690, 1.f}, {0.700, 1.f}, {0.714, 1.f}, {0.727, 1.f}, @@ -4533,7 +4549,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double {0.971, 1.f}, {0.980, 1.f}, {0.990, 1.f}, - {1.000, 1.f},//39 + {1.000, 1.f},//55 {1.010, 1.f}, {1.020, 1.f}, {1.030, 1.f}, @@ -4620,8 +4636,8 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double int end; } RangeGreen; - constexpr RangeGreen Rangestandard = {8, 70}; - constexpr RangeGreen Rangeextended = {4, 77}; + constexpr RangeGreen Rangestandard = {24, 86}; + constexpr RangeGreen Rangeextended = {15, 93}; const RangeGreen Rangemax = {0, N_g}; RangeGreen Rangegreenused; @@ -5022,7 +5038,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double //calculate deltaE xx to find best values of spectrals datas - limited to chroma values int maxnb = rtengine::LIM(settings->itcwb_sizereference, 1, 5); - if (settings->itcwb_thres > 39) { + if (settings->itcwb_thres > 55) { maxnb = 201 / settings->itcwb_thres; } @@ -5130,7 +5146,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double for (int i = 0; i < N_g; ++i) {//init variables with Tgstud[i].student = 1000.f;//max value to initialize Tgstud[i].tempref = 57;//5002K - Tgstud[i].greenref = 39;// 1.f + Tgstud[i].greenref = 55;// 1.f } @@ -5223,13 +5239,13 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double int goodrefprov; float studprov; const int goodref0 = Tgstud[0].tempref; - const int greengood0 = Tgstud[0].greenref - 39;//39 green = 1 + const int greengood0 = Tgstud[0].greenref - 55;//55 green = 1 const float stud0 = Tgstud[0].student; const int goodref1 = Tgstud[1].tempref; const float stud1 = Tgstud[1].student; - const int greengood1 = Tgstud[1].greenref - 39; + const int greengood1 = Tgstud[1].greenref - 55; const int goodref2 = Tgstud[2].tempref; - const int greengood2 = Tgstud[2].greenref - 39; + const int greengood2 = Tgstud[2].greenref - 55; const float stud2 = Tgstud[2].student; if (std::fabs(greengood2) < std::fabs(greengood1)) { @@ -5245,12 +5261,12 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double if (std::fabs(greengoodprov) < std::fabs(greengood0)) { goodref = goodrefprov; - greengood = greengoodprov + 39; + greengood = greengoodprov + 55; studgood = studprov; } else { goodref = goodref0; - greengood = greengood0 + 39; + greengood = greengood0 + 55; studgood = stud0; } From 6563989f5df1892648fe25a5b62436cb460e3426 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 7 Mar 2020 17:52:04 +0100 Subject: [PATCH 016/109] Added X-T3 matrix to camconst --- rtengine/camconst.json | 1 + 1 file changed, 1 insertion(+) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 9b1b99d1b..d50e050dd 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1376,6 +1376,7 @@ Camera constants: { // Quality C, only raw crop "make_model": [ "FUJIFILM X-T3", "FUJIFILM X-T30" ], + "dcraw_matrix": [ 13426,-6334,-1177,-4244,12136,2371,-580,1303,5980 ], // DNG_v11, standard_v2 d65 "raw_crop": [ 0, 5, 6252, 4176] }, From b2165aedd9bedac97b4c0207a6026c1f600bf11c Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 8 Mar 2020 14:12:23 +0100 Subject: [PATCH 017/109] camconst.cc/h : code review --- rtengine/camconst.cc | 223 ++++++++++++++---------------------- rtengine/camconst.h | 33 +++--- rtengine/pdaflinesfilter.cc | 2 +- rtengine/rawimage.cc | 109 +----------------- rtengine/rawimagesource.cc | 2 +- 5 files changed, 109 insertions(+), 260 deletions(-) diff --git a/rtengine/camconst.cc b/rtengine/camconst.cc index 36aa96030..52466cd1a 100644 --- a/rtengine/camconst.cc +++ b/rtengine/camconst.cc @@ -2,20 +2,23 @@ * This file is part of RawTherapee. */ #include "camconst.h" + +#include +#include +#include +#include +#include + #include #include #include + #include "settings.h" #include "rt_math.h" -#include -#include // cJSON is a very minimal JSON parser lib in C, not for threaded stuff etc, so if we're going to use JSON more than just // here we should probably replace cJSON with something beefier. #include "cJSON.h" -#include -#include -#include namespace rtengine { @@ -30,8 +33,7 @@ CameraConst::CameraConst() : pdafOffset(0) } -bool -CameraConst::parseApertureScaling(CameraConst *cc, void *ji_) +bool CameraConst::parseApertureScaling(CameraConst *cc, void *ji_) { cJSON *ji = (cJSON *)ji_; @@ -40,7 +42,7 @@ CameraConst::parseApertureScaling(CameraConst *cc, void *ji_) return false; } - for (ji = ji->child; ji != nullptr; ji = ji->next) { + for (ji = ji->child; ji; ji = ji->next) { cJSON *js = cJSON_GetObjectItem(ji, "aperture"); if (!js) { @@ -51,7 +53,7 @@ CameraConst::parseApertureScaling(CameraConst *cc, void *ji_) return false; } - float aperture = (float)js->valuedouble; + const float aperture = js->valuedouble; js = cJSON_GetObjectItem(ji, "scale_factor"); if (!js) { @@ -62,22 +64,21 @@ CameraConst::parseApertureScaling(CameraConst *cc, void *ji_) return false; } - float scale_factor = (float)js->valuedouble; + const float scale_factor = js->valuedouble; cc->mApertureScaling.insert(std::pair(aperture, scale_factor)); } return true; } -bool -CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_) +bool CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_) { cJSON *ji = (cJSON *)ji_; if (ji->type == cJSON_Number) { - struct camera_const_levels lvl; + camera_const_levels lvl; lvl.levels[0] = lvl.levels[1] = lvl.levels[2] = lvl.levels[3] = ji->valueint; - cc->mLevels[bw].insert(std::pair(0, lvl)); + cc->mLevels[bw].insert(std::pair(0, lvl)); return true; } else if (ji->type != cJSON_Array) { fprintf(stderr, "\"ranges\":\"%s\" must be a number or an array\n", bw ? "white" : "black"); @@ -85,11 +86,11 @@ CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_) } if (ji->child->type == cJSON_Number) { - struct camera_const_levels lvl; + camera_const_levels lvl; int i; cJSON *js; - for (js = ji->child, i = 0; js != nullptr && i < 4; js = js->next, i++) { + for (js = ji->child, i = 0; js && i < 4; js = js->next, i++) { lvl.levels[i] = js->valueint; } @@ -97,16 +98,16 @@ CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_) lvl.levels[3] = lvl.levels[1]; // G2 = G1 } else if (i == 1) { lvl.levels[3] = lvl.levels[2] = lvl.levels[1] = lvl.levels[0]; - } else if (i != 4 || js != nullptr) { + } else if (i != 4 || js) { fprintf(stderr, "\"ranges\":\"%s\" array must have 1, 3 or 4 numbers.\n", bw ? "white" : "black"); return false; } - cc->mLevels[bw].insert(std::pair(0, lvl)); + cc->mLevels[bw].insert(std::pair(0, lvl)); return true; } - for (ji = ji->child; ji != nullptr; ji = ji->next) { + for (ji = ji->child; ji; ji = ji->next) { int iso[1000] = { 0 }; int iso_count = 0; cJSON *js = cJSON_GetObjectItem(ji, "iso"); @@ -120,7 +121,7 @@ CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_) } else if (js->type == cJSON_Array) { int i; - for (js = js->child, i = 0; js != nullptr && i < 1000; js = js->next, i++) { + for (js = js->child, i = 0; js && i < 1000; js = js->next, i++) { if (js->type != cJSON_Number) { fprintf(stderr, "\"ranges\":\"%s\":\"iso\" must be a number or an array of numbers.\n", bw ? "white" : "black"); return false; @@ -142,14 +143,14 @@ CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_) return false; } - struct camera_const_levels lvl; + camera_const_levels lvl; if (js->type == cJSON_Number) { lvl.levels[0] = lvl.levels[1] = lvl.levels[2] = lvl.levels[3] = js->valueint; } else if (js->type == cJSON_Array) { int i; - for (js = js->child, i = 0; js != nullptr && i < 4; js = js->next, i++) { + for (js = js->child, i = 0; js && i < 4; js = js->next, i++) { if (js->type != cJSON_Number) { fprintf(stderr, "\"ranges\":\"%s\":\"levels\" must be a number or an array of numbers.\n", bw ? "white" : "black"); return false; @@ -162,7 +163,7 @@ CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_) lvl.levels[3] = lvl.levels[1]; // G2 = G1 } else if (i == 1) { lvl.levels[3] = lvl.levels[2] = lvl.levels[1] = lvl.levels[0]; - } else if (i != 4 || js != nullptr) { + } else if (i != 4 || js) { fprintf(stderr, "\"ranges\":\"%s\":\"levels\" array must have 1, 3 or 4 numbers.\n", bw ? "white" : "black"); return false; } @@ -172,15 +173,14 @@ CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_) } for (int i = 0; i < iso_count; i++) { - cc->mLevels[bw].insert(std::pair(iso[i], lvl)); + cc->mLevels[bw].insert(std::pair(iso[i], lvl)); } } return true; } -CameraConst * -CameraConst::parseEntry(void *cJSON_, const char *make_model) +CameraConst* CameraConst::parseEntry(void *cJSON_, const char *make_model) { cJSON *js, *ji, *jranges; js = (cJSON *)cJSON_; @@ -198,7 +198,7 @@ CameraConst::parseEntry(void *cJSON_, const char *make_model) int i; - for (i = 0, ji = ji->child; i < 12 && ji != nullptr; i++, ji = ji->next) { + for (i = 0, ji = ji->child; i < 12 && ji; i++, ji = ji->next) { if (ji->type != cJSON_Number) { fprintf(stderr, "\"dcraw_matrix\" array must contain numbers\n"); goto parse_error; @@ -218,7 +218,7 @@ CameraConst::parseEntry(void *cJSON_, const char *make_model) int i; - for (i = 0, ji = ji->child; i < 4 && ji != nullptr; i++, ji = ji->next) { + for (i = 0, ji = ji->child; i < 4 && ji; i++, ji = ji->next) { if (ji->type != cJSON_Number) { fprintf(stderr, "\"raw_crop\" array must contain numbers\n"); goto parse_error; @@ -227,7 +227,7 @@ CameraConst::parseEntry(void *cJSON_, const char *make_model) cc->raw_crop[i] = ji->valueint; } - if (i != 4 || ji != nullptr) { + if (i != 4 || ji) { fprintf(stderr, "\"raw_crop\" must contain 4 numbers\n"); goto parse_error; } @@ -243,7 +243,7 @@ CameraConst::parseEntry(void *cJSON_, const char *make_model) int i; - for (i = 0, ji = ji->child; i < 8 * 4 && ji != nullptr; i++, ji = ji->next) { + for (i = 0, ji = ji->child; i < 2 * 4 && ji; i++, ji = ji->next) { if (ji->type != cJSON_Number) { fprintf(stderr, "\"masked_areas\" array must contain numbers\n"); goto parse_error; @@ -298,16 +298,14 @@ CameraConst::parseEntry(void *cJSON_, const char *make_model) } for (int bw = 0; bw < 2; bw++) { - struct camera_const_levels lvl; + camera_const_levels lvl; if (!cc->get_Levels(lvl, bw, 0, 0)) { - std::map::iterator it; - it = cc->mLevels[bw].begin(); + const std::map::const_iterator it = cc->mLevels[bw].begin(); if (it != cc->mLevels[bw].end()) { // insert levels with lowest iso as the default (iso 0) - struct camera_const_levels lvl = it->second; - cc->mLevels[bw].insert(std::pair(0, lvl)); + cc->mLevels[bw].insert(std::pair(0, it->second)); } } } @@ -320,7 +318,7 @@ CameraConst::parseEntry(void *cJSON_, const char *make_model) goto parse_error; } - for (ji = ji->child; ji != nullptr; ji = ji->next) { + for (ji = ji->child; ji; ji = ji->next) { if (ji->type != cJSON_Number) { fprintf(stderr, "\"pdaf_pattern\" array must contain numbers\n"); goto parse_error; @@ -359,14 +357,12 @@ parse_error: return nullptr; } -bool -CameraConst::has_dcrawMatrix() +bool CameraConst::has_dcrawMatrix() const { return dcraw_matrix[0] != 0; } -void -CameraConst::update_dcrawMatrix(const short *other) +void CameraConst::update_dcrawMatrix(const short *other) { if (!other) { return; @@ -377,8 +373,7 @@ CameraConst::update_dcrawMatrix(const short *other) } } -const short * -CameraConst::get_dcrawMatrix() +const short* CameraConst::get_dcrawMatrix() const { if (!has_dcrawMatrix()) { return nullptr; @@ -387,20 +382,12 @@ CameraConst::get_dcrawMatrix() return dcraw_matrix; } -bool -CameraConst::has_pdafPattern() -{ - return pdafPattern.size() > 0; -} - -std::vector -CameraConst::get_pdafPattern() +const std::vector& CameraConst::get_pdafPattern() const { return pdafPattern; } -void -CameraConst::update_pdafPattern(const std::vector &other) +void CameraConst::update_pdafPattern(const std::vector &other) { if (other.empty()) { return; @@ -408,8 +395,7 @@ CameraConst::update_pdafPattern(const std::vector &other) pdafPattern = other; } -void -CameraConst::update_pdafOffset(int other) +void CameraConst::update_pdafOffset(int other) { if (other == 0) { return; @@ -417,14 +403,12 @@ CameraConst::update_pdafOffset(int other) pdafOffset = other; } -bool -CameraConst::has_rawCrop() +bool CameraConst::has_rawCrop() const { return raw_crop[0] != 0 || raw_crop[1] != 0 || raw_crop[2] != 0 || raw_crop[3] != 0; } -void -CameraConst::get_rawCrop(int& left_margin, int& top_margin, int& width, int& height) +void CameraConst::get_rawCrop(int& left_margin, int& top_margin, int& width, int& height) const { left_margin = raw_crop[0]; top_margin = raw_crop[1]; @@ -432,22 +416,20 @@ CameraConst::get_rawCrop(int& left_margin, int& top_margin, int& width, int& hei height = raw_crop[3]; } -bool -CameraConst::has_rawMask(int idx) +bool CameraConst::has_rawMask(int idx) const { - if (idx < 0 || idx > 7) { + if (idx < 0 || idx > 1) { return false; } return (raw_mask[idx][0] | raw_mask[idx][1] | raw_mask[idx][2] | raw_mask[idx][3]) != 0; } -void -CameraConst::get_rawMask(int idx, int& top, int& left, int& bottom, int& right) +void CameraConst::get_rawMask(int idx, int& top, int& left, int& bottom, int& right) const { top = left = bottom = right = 0; - if (idx < 0 || idx > 7) { + if (idx < 0 || idx > 1) { return; } @@ -457,8 +439,7 @@ CameraConst::get_rawMask(int idx, int& top, int& left, int& bottom, int& right) right = raw_mask[idx][3]; } -void -CameraConst::update_Levels(const CameraConst *other) +void CameraConst::update_Levels(const CameraConst *other) { if (!other) { return; @@ -482,13 +463,9 @@ CameraConst::update_Levels(const CameraConst *other) if (other->white_max) { white_max = other->white_max; } - -// for (std::map::iterator i=other->mLevels[0].begin(); i!=other->mLevels[0].end(); i++) { -// } } -void -CameraConst::update_Crop(CameraConst *other) +void CameraConst::update_Crop(CameraConst *other) { if (!other) { return; @@ -499,18 +476,16 @@ CameraConst::update_Crop(CameraConst *other) } } -bool -CameraConst::get_Levels(struct camera_const_levels & lvl, int bw, int iso, float fnumber) +bool CameraConst::get_Levels(camera_const_levels & lvl, int bw, int iso, float fnumber) const { - std::map::iterator it; - it = mLevels[bw].find(iso); + std::map::const_iterator it = mLevels[bw].find(iso); if (it == mLevels[bw].end()) { - std::map::iterator best_it = mLevels[bw].begin(); + std::map::const_iterator best_it = mLevels[bw].begin(); if (iso > 0) { for (it = mLevels[bw].begin(); it != mLevels[bw].end(); ++it) { - if (abs(it->first - iso) <= abs(best_it->first - iso)) { + if (std::abs(it->first - iso) <= std::abs(best_it->first - iso)) { best_it = it; } else { break; @@ -528,16 +503,15 @@ CameraConst::get_Levels(struct camera_const_levels & lvl, int bw, int iso, float lvl = it->second; if (bw == 1 && fnumber > 0 && mApertureScaling.size() > 0) { - std::map::iterator it; - it = mApertureScaling.find(fnumber); + std::map::const_iterator scaleIt = mApertureScaling.find(fnumber); - if (it == mApertureScaling.end()) { + if (scaleIt == mApertureScaling.end()) { // fnumber may be an exact aperture, eg 1.414, or a rounded eg 1.4. In our map we // should have rounded numbers so we translate and retry the lookup // table with traditional 1/3 stop f-number rounding used by most cameras, we only // have in the range 0.7 - 10.0, but aperture scaling rarely happen past f/4.0 - const float fn_tab[8][3] = { + constexpr float fn_tab[8][3] = { { 0.7, 0.8, 0.9 }, { 1.0, 1.1, 1.2 }, { 1.4, 1.6, 1.8 }, @@ -550,12 +524,12 @@ CameraConst::get_Levels(struct camera_const_levels & lvl, int bw, int iso, float for (int avh = 0; avh < 8; avh++) { for (int k = 0; k < 3; k++) { - float av = (avh - 1) + (float)k / 3; - float aperture = sqrtf(powf(2, av)); + const float av = (avh - 1) + k / 3.f; + const float aperture = std::sqrt(std::pow(2.f, av)); if (fnumber > aperture * 0.97f && fnumber < aperture / 0.97f) { fnumber = fn_tab[avh][k]; - it = mApertureScaling.find(fnumber); + scaleIt = mApertureScaling.find(fnumber); avh = 7; break; } @@ -565,18 +539,16 @@ CameraConst::get_Levels(struct camera_const_levels & lvl, int bw, int iso, float float scaling = 1.0; - if (it == mApertureScaling.end()) { - std::map::reverse_iterator it; - - for (it = mApertureScaling.rbegin(); it != mApertureScaling.rend(); ++it) { - if (it->first > fnumber) { - scaling = it->second; + if (scaleIt == mApertureScaling.end()) { + for (std::map::const_reverse_iterator entry = mApertureScaling.rbegin(); entry != mApertureScaling.rend(); ++entry) { + if (entry->first > fnumber) { + scaling = entry->second; } else { break; } } } else { - scaling = it->second; + scaling = scaleIt->second; } if (scaling > 1.f) { @@ -593,11 +565,10 @@ CameraConst::get_Levels(struct camera_const_levels & lvl, int bw, int iso, float return true; } -int -CameraConst::get_BlackLevel(const int idx, const int iso_speed) +int CameraConst::get_BlackLevel(const int idx, const int iso_speed) const { assert(idx >= 0 && idx <= 3); - struct camera_const_levels lvl; + camera_const_levels lvl; if (!get_Levels(lvl, 0, iso_speed, 0.0)) { return -1; @@ -606,11 +577,10 @@ CameraConst::get_BlackLevel(const int idx, const int iso_speed) return lvl.levels[idx]; } -int -CameraConst::get_WhiteLevel(const int idx, const int iso_speed, const float fnumber) +int CameraConst::get_WhiteLevel(const int idx, const int iso_speed, const float fnumber) const { assert(idx >= 0 && idx <= 3); - struct camera_const_levels lvl; + camera_const_levels lvl; if (!get_Levels(lvl, 1, iso_speed, fnumber)) { return -1; @@ -619,45 +589,41 @@ CameraConst::get_WhiteLevel(const int idx, const int iso_speed, const float fnum return lvl.levels[idx]; } -bool -CameraConst::has_globalGreenEquilibration() +bool CameraConst::has_globalGreenEquilibration() const { return globalGreenEquilibration >= 0; } -bool -CameraConst::get_globalGreenEquilibration() +bool CameraConst::get_globalGreenEquilibration() const { return globalGreenEquilibration > 0; } -void -CameraConst::update_globalGreenEquilibration(bool other) +void CameraConst::update_globalGreenEquilibration(bool other) { globalGreenEquilibration = (other ? 1 : 0); } -bool -CameraConstantsStore::parse_camera_constants_file(const Glib::ustring& filename_) +bool CameraConstantsStore::parse_camera_constants_file(const Glib::ustring& filename_) { // read the file into a single long string const char *filename = filename_.c_str(); FILE *stream = fopen(filename, "rt"); - if (stream == nullptr) { + if (!stream) { fprintf(stderr, "Could not open camera constants file \"%s\": %s\n", filename, strerror(errno)); return false; } - size_t bufsize = 16384; - size_t increment = 2 * bufsize; + size_t bufsize = 262144; + size_t increment = bufsize; size_t datasize = 0, ret; char *buf = (char *)malloc(bufsize); - while ((ret = fread(&buf[datasize], 1, bufsize - datasize, stream)) != 0) { + while ((ret = fread(&buf[datasize], 1, bufsize - datasize - 1, stream)) != 0) { datasize += ret; - if (datasize == bufsize) { // we need more memory + if (datasize == bufsize - 1) { // we need more memory bufsize += increment; void *temp = realloc(buf, bufsize); // try to realloc buffer with new size if(!temp) { // realloc failed @@ -683,10 +649,6 @@ CameraConstantsStore::parse_camera_constants_file(const Glib::ustring& filename_ fclose(stream); - if(datasize == bufsize) { - buf = (char *)realloc(buf, datasize + 1); - } - buf[datasize] = '\0'; // remove comments @@ -711,11 +673,7 @@ CameraConstantsStore::parse_camera_constants_file(const Glib::ustring& filename_ } free(buf); - /*{ - char *js_str = cJSON_Print(jsroot); - printf("%s\n", js_str); - free(js_str); - }*/ + cJSON *js = cJSON_GetObjectItem(jsroot, "camera_constants"); if (!js) { @@ -723,7 +681,7 @@ CameraConstantsStore::parse_camera_constants_file(const Glib::ustring& filename_ goto parse_error; } - for (js = js->child; js != nullptr; js = js->next) { + for (js = js->child; js; js = js->next) { cJSON *ji = cJSON_GetObjectItem(js, "make_model"); if (!ji) { @@ -738,7 +696,7 @@ CameraConstantsStore::parse_camera_constants_file(const Glib::ustring& filename_ is_array = true; } - while (ji != nullptr) { + while (ji) { if (ji->type != cJSON_String) { fprintf(stderr, "\"make_model\" must be a string or an array of strings\n"); goto parse_error; @@ -750,18 +708,18 @@ CameraConstantsStore::parse_camera_constants_file(const Glib::ustring& filename_ goto parse_error; } - Glib::ustring make_model(ji->valuestring); - make_model = make_model.uppercase(); + std::string make_model(ji->valuestring); + std::transform(make_model.begin(), make_model.end(), make_model.begin(), ::toupper); - const auto ret = mCameraConstants.emplace(make_model, cc); + const auto entry = mCameraConstants.emplace(make_model, cc); - if(ret.second) { // entry inserted into map + if (entry.second) { // entry inserted into map if (settings->verbose) { printf("Add camera constants for \"%s\"\n", make_model.c_str()); } } else { // The CameraConst already exist for this camera make/model -> we merge the values - CameraConst *existingcc = ret.first->second; + CameraConst *existingcc = entry.first->second; // updating the dcraw matrix existingcc->update_dcrawMatrix(cc->get_dcrawMatrix()); @@ -820,22 +778,19 @@ void CameraConstantsStore::init(const Glib::ustring& baseDir, const Glib::ustrin } } -CameraConstantsStore * -CameraConstantsStore::getInstance() +CameraConstantsStore* CameraConstantsStore::getInstance() { static CameraConstantsStore instance_; return &instance_; } -CameraConst * -CameraConstantsStore::get(const char make[], const char model[]) +const CameraConst* CameraConstantsStore::get(const char make[], const char model[]) const { - Glib::ustring key(make); + std::string key(make); key += " "; key += model; - key = key.uppercase(); - std::map::iterator it; - it = mCameraConstants.find(key); + std::transform(key.begin(), key.end(), key.begin(), ::toupper); + const auto it = mCameraConstants.find(key); if (it == mCameraConstants.end()) { return nullptr; diff --git a/rtengine/camconst.h b/rtengine/camconst.h index 3af05ab01..b959481ba 100644 --- a/rtengine/camconst.h +++ b/rtengine/camconst.h @@ -27,9 +27,9 @@ private: std::string make_model; short dcraw_matrix[12]; int raw_crop[4]; - int raw_mask[8][4]; + int raw_mask[2][4]; int white_max; - std::map mLevels[2]; + std::map mLevels[2]; std::map mApertureScaling; std::vector pdafPattern; int pdafOffset; @@ -38,24 +38,23 @@ private: CameraConst(); static bool parseLevels(CameraConst *cc, int bw, void *ji); static bool parseApertureScaling(CameraConst *cc, void *ji); - bool get_Levels(struct camera_const_levels & lvl, int bw, int iso, float fnumber); + bool get_Levels(camera_const_levels & lvl, int bw, int iso, float fnumber) const; public: static CameraConst *parseEntry(void *cJSON, const char *make_model); - bool has_dcrawMatrix(void); - bool has_pdafPattern(void); + bool has_dcrawMatrix(void) const; void update_dcrawMatrix(const short *other); - const short *get_dcrawMatrix(void); - std::vector get_pdafPattern(); - int get_pdafOffset() {return pdafOffset;} - bool has_rawCrop(void); - void get_rawCrop(int& left_margin, int& top_margin, int& width, int& height); - bool has_rawMask(int idx); - void get_rawMask(int idx, int& top, int& left, int& bottom, int& right); - int get_BlackLevel(int idx, int iso_speed); - int get_WhiteLevel(int idx, int iso_speed, float fnumber); - bool has_globalGreenEquilibration(); - bool get_globalGreenEquilibration(); + const short *get_dcrawMatrix(void) const; + const std::vector& get_pdafPattern() const; + int get_pdafOffset() const {return pdafOffset;}; + bool has_rawCrop(void) const; + void get_rawCrop(int& left_margin, int& top_margin, int& width, int& height) const; + bool has_rawMask(int idx) const; + void get_rawMask(int idx, int& top, int& left, int& bottom, int& right) const; + int get_BlackLevel(int idx, int iso_speed) const; + int get_WhiteLevel(int idx, int iso_speed, float fnumber) const; + bool has_globalGreenEquilibration() const; + bool get_globalGreenEquilibration() const; void update_Levels(const CameraConst *other); void update_Crop(CameraConst *other); void update_pdafPattern(const std::vector &other); @@ -75,7 +74,7 @@ public: ~CameraConstantsStore(); void init(const Glib::ustring& baseDir, const Glib::ustring& userSettingsDir); static CameraConstantsStore *getInstance(void); - CameraConst *get(const char make[], const char model[]); + const CameraConst *get(const char make[], const char model[]) const; }; } diff --git a/rtengine/pdaflinesfilter.cc b/rtengine/pdaflinesfilter.cc index 1eddbc1ea..b5c72f7f4 100644 --- a/rtengine/pdaflinesfilter.cc +++ b/rtengine/pdaflinesfilter.cc @@ -177,7 +177,7 @@ PDAFLinesFilter::PDAFLinesFilter(RawImage *ri): gthresh_ = new PDAFGreenEqulibrateThreshold(W_, H_); CameraConstantsStore* ccs = CameraConstantsStore::getInstance(); - CameraConst *cc = ccs->get(ri_->get_maker().c_str(), ri_->get_model().c_str()); + const CameraConst *cc = ccs->get(ri_->get_maker().c_str(), ri_->get_model().c_str()); if (cc) { pattern_ = cc->get_pdafPattern(); diff --git a/rtengine/rawimage.cc b/rtengine/rawimage.cc index 34d5d961c..c2df70468 100644 --- a/rtengine/rawimage.cc +++ b/rtengine/rawimage.cc @@ -524,7 +524,7 @@ int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, Pro } CameraConstantsStore* ccs = CameraConstantsStore::getInstance(); - CameraConst *cc = ccs->get(make, model); + const CameraConst *cc = ccs->get(make, model); if (raw_image) { if (cc && cc->has_rawCrop()) { @@ -850,42 +850,18 @@ DCraw::dcraw_coeff_overrides(const char make[], const char model[], const int is short trans[12]; // set first value to 0 for no change } table[] = { - { - "Canon EOS 5D Mark III", -1, 0x3a98, /* RT */ - { 6722, -635, -963, -4287, 12460, 2028, -908, 2162, 5668 } - }, { "Canon EOS 5D", -1, 0xe6c, /* RT */ { 6319, -793, -614, -5809, 13342, 2738, -1132, 1559, 7971 } }, - { - "Canon EOS 6D", -1, 0x3c82, - { 7034, -804, -1014, -4420, 12564, 2058, -851, 1994, 5758 } - }, - { - "Canon EOS 7D", -1, 0x3510, /* RT - Colin Walker */ - { 5962, -171, -732, -4189, 12307, 2099, -911, 1981, 6304 } - }, { "Canon EOS 20D", -1, 0xfff, /* RT */ { 7590, -1646, -673, -4697, 12411, 2568, -627, 1118, 7295 } }, - { - "Canon EOS 40D", -1, 0x3f60, /* RT */ - { 6070, -531, -883, -5763, 13647, 2315, -1533, 2582, 6801 } - }, - { - "Canon EOS 60D", -1, 0x2ff7, /* RT - Colin Walker */ - { 5678, -179, -718, -4389, 12381, 2243, -869, 1819, 6380 } - }, { "Canon EOS 450D", -1, 0x390d, /* RT */ { 6246, -1272, -523, -5075, 12357, 3075, -1035, 1825, 7333 } }, - { - "Canon EOS 550D", -1, 0x3dd7, /* RT - Lebedev*/ - { 6519, -772, -703, -4994, 12737, 2519, -1387, 2492, 6175 } - }, { "Canon EOS-1D Mark III", 0, 0x3bb0, /* RT */ { 7406, -1592, -646, -4856, 12457, 2698, -432, 726, 7921 } @@ -894,18 +870,10 @@ DCraw::dcraw_coeff_overrides(const char make[], const char model[], const int is "Canon PowerShot G10", -1, -1, /* RT */ { 12535, -5030, -796, -2711, 10134, 3006, -413, 1605, 5264 } }, - { - "Canon PowerShot G12", -1, -1, /* RT */ - { 12222, -4097, -1380, -2876, 11016, 2130, -888, 1630, 4434 } - }, - - { "Fujifilm X100", -1, -1, /* RT - Colin Walker */ { 10841, -3288, -807, -4652, 12552, 2344, -642, 1355, 7206 } }, - - { "Nikon D200", -1, 0xfbc, /* RT */ { 8498, -2633, -295, -5423, 12869, 2860, -777, 1077, 8124 } @@ -918,32 +886,14 @@ DCraw::dcraw_coeff_overrides(const char make[], const char model[], const int is "Nikon D3100", -1, -1, /* RT */ { 7729, -2212, -481, -5709, 13148, 2858, -1295, 1908, 8936 } }, - { - "Nikon D3S", -1, -1, /* RT */ - { 8792, -2663, -344, -5221, 12764, 2752, -1491, 2165, 8121 } - }, { "Nikon D5200", -1, -1, // color matrix copied from D5200 DNG D65 matrix { 8322, -3112, -1047, -6367, 14342, 2179, -988, 1638, 6394 } }, - { - "Nikon D7000", -1, -1, /* RT - Tanveer(tsk1979) */ - { 7530, -1942, -255, -4318, 11390, 3362, -926, 1694, 7649 } - }, { "Nikon D7100", -1, -1, // color matrix and WP copied from D7100 DNG D65 matrix { 8322, -3112, -1047, -6367, 14342, 2179, -988, 1638, 6394 } }, - { - "Nikon D700", -1, -1, /* RT */ - { 8364, -2503, -352, -6307, 14026, 2492, -1134, 1512, 8156 } - }, - { - "Nikon COOLPIX A", -1, 0x3e00, // color matrix and WP copied from "COOLPIX A" DNG D65 matrix - { 8198, -2239, -724, -4871, 12389, 2798, -1043, 205, 7181 } - }, - - { "Olympus E-30", -1, 0xfbc, /* RT - Colin Walker */ { 8510, -2355, -693, -4819, 12520, 2578, -1029, 2067, 7752 } @@ -984,69 +934,14 @@ DCraw::dcraw_coeff_overrides(const char make[], const char model[], const int is "Olympus XZ-1", -1, -1, /* RT - Colin Walker */ { 8665, -2247, -762, -2424, 10372, 2382, -1011, 2286, 5189 } }, - - - /* since Dcraw_v9.21 Panasonic BlackLevel is read from exif (tags 0x001c BlackLevelRed, 0x001d BlackLevelGreen, 0x001e BlackLevelBlue - and we define here the needed offset of around 15. The total BL is BL + BLoffset (cblack + black) */ - - { - "Panasonic DMC-FZ150", 15, 0xfd2, /* RT */ - { 10435, -3208, -72, -2293, 10506, 2067, -486, 1725, 4682 } - }, - { - "Panasonic DMC-G10", 15, 0xf50, /* RT - Colin Walker - variable WL 3920 - 4080 */ - { 8310, -1811, -960, -4941, 12990, 2151, -1378, 2468, 6860 } - }, - { - "Panasonic DMC-G1", 15, 0xf50, /* RT - Colin Walker - variable WL 3920 - 4080 */ - { 7477, -1615, -651, -5016, 12769, 2506, -1380, 2475, 7240 } - }, - { - "Panasonic DMC-G2", 15, 0xf50, /* RT - Colin Walker - variable WL 3920 - 4080 */ - { 8310, -1811, -960, -4941, 12990, 2151, -1378, 2468, 6860 } - }, - { - "Panasonic DMC-G3", 15, 0xfdc, /* RT - Colin Walker - WL 4060 */ - { 6051, -1406, -671, -4015, 11505, 2868, -1654, 2667, 6219 } - }, - { - "Panasonic DMC-G5", 15, 0xfdc, /* RT - WL 4060 */ - { 7122, -2092, -419, -4643, 11769, 3283, -1363, 2413, 5944 } - }, - { - "Panasonic DMC-GF1", 15, 0xf50, /* RT - Colin Walker - Variable WL 3920 - 4080 */ - { 7863, -2080, -668, -4623, 12331, 2578, -1020, 2066, 7266 } - }, - { - "Panasonic DMC-GF2", 15, 0xfd2, /* RT - Colin Walker - WL 4050 */ - { 7694, -1791, -745, -4917, 12818, 2332, -1221, 2322, 7197 } - }, - { - "Panasonic DMC-GF3", 15, 0xfd2, /* RT - Colin Walker - WL 4050 */ - { 8074, -1846, -861, -5026, 12999, 2239, -1320, 2375, 7422 } - }, - { - "Panasonic DMC-GH1", 15, 0xf5a, /* RT - Colin Walker - variable WL 3930 - 4080 */ - { 6360, -1557, -375, -4201, 11504, 3086, -1378, 2518, 5843 } - }, - { - "Panasonic DMC-GH2", 15, 0xf5a, /* RT - Colin Walker - variable WL 3930 - 4080 */ -// { 6855,-1765,-456,-4223,11600,2996,-1450,2602,5761 } }, disabled due to problems with underwater WB - { 7780, -2410, -806, -3913, 11724, 2484, -1018, 2390, 5298 } - }, // dcraw original - { "Pentax K200D", -1, -1, /* RT */ { 10962, -4428, -542, -5486, 13023, 2748, -569, 842, 8390 } }, - - { "Leica Camera AG M9 Digital Camera", -1, -1, /* RT */ { 7181, -1706, -55, -3557, 11409, 2450, -621, 2072, 7533 } }, - - { "SONY NEX-3", 128 << dcraw_arw2_scaling_bugfix_shift, -1, /* RT - Colin Walker */ { 5145, -741, -123, -4915, 12310, 2945, -794, 1489, 6906 } @@ -1104,7 +999,7 @@ DCraw::dcraw_coeff_overrides(const char make[], const char model[], const int is { // test if we have any information in the camera constants store, if so we take that. rtengine::CameraConstantsStore* ccs = rtengine::CameraConstantsStore::getInstance(); - rtengine::CameraConst *cc = ccs->get(make, model); + const rtengine::CameraConst *cc = ccs->get(make, model); if (cc) { if (RT_blacklevel_from_constant == ThreeValBool::T) { diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 48383c8ba..f08609f5e 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1453,7 +1453,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le [&]() -> bool { CameraConstantsStore *ccs = CameraConstantsStore::getInstance(); - CameraConst *cc = ccs->get(ri->get_maker().c_str(), ri->get_model().c_str()); + const CameraConst *cc = ccs->get(ri->get_maker().c_str(), ri->get_model().c_str()); return cc && cc->get_globalGreenEquilibration(); }; From 8b00bb5a5697dd339f061808e3d9935efeb34dd3 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 8 Mar 2020 14:19:39 +0100 Subject: [PATCH 018/109] camconst.cc : more auto --- rtengine/camconst.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/camconst.cc b/rtengine/camconst.cc index 52466cd1a..5fd8ed81b 100644 --- a/rtengine/camconst.cc +++ b/rtengine/camconst.cc @@ -301,7 +301,7 @@ CameraConst* CameraConst::parseEntry(void *cJSON_, const char *make_model) camera_const_levels lvl; if (!cc->get_Levels(lvl, bw, 0, 0)) { - const std::map::const_iterator it = cc->mLevels[bw].begin(); + const auto it = cc->mLevels[bw].cbegin(); if (it != cc->mLevels[bw].end()) { // insert levels with lowest iso as the default (iso 0) @@ -481,7 +481,7 @@ bool CameraConst::get_Levels(camera_const_levels & lvl, int bw, int iso, float f std::map::const_iterator it = mLevels[bw].find(iso); if (it == mLevels[bw].end()) { - std::map::const_iterator best_it = mLevels[bw].begin(); + auto best_it = mLevels[bw].cbegin(); if (iso > 0) { for (it = mLevels[bw].begin(); it != mLevels[bw].end(); ++it) { From 4ef0b753549eb1314f27ad3d652d415a7d48de44 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 8 Mar 2020 14:36:47 +0100 Subject: [PATCH 019/109] camconst.cc : minor cleanups --- rtengine/camconst.cc | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/rtengine/camconst.cc b/rtengine/camconst.cc index 5fd8ed81b..fe55ecd11 100644 --- a/rtengine/camconst.cc +++ b/rtengine/camconst.cc @@ -512,14 +512,14 @@ bool CameraConst::get_Levels(camera_const_levels & lvl, int bw, int iso, float f // table with traditional 1/3 stop f-number rounding used by most cameras, we only // have in the range 0.7 - 10.0, but aperture scaling rarely happen past f/4.0 constexpr float fn_tab[8][3] = { - { 0.7, 0.8, 0.9 }, - { 1.0, 1.1, 1.2 }, - { 1.4, 1.6, 1.8 }, - { 2.0, 2.2, 2.5 }, - { 2.8, 3.2, 3.5 }, - { 4.0, 4.5, 5.0 }, - { 5.6, 6.3, 7.1 }, - { 8.0, 9.0, 10.0 } + { 0.7f, 0.8f, 0.9f }, + { 1.f, 1.1f, 1.2f }, + { 1.4f, 1.6f, 1.8f }, + { 2.f, 2.2f, 2.5f }, + { 2.8f, 3.2f, 3.5f }, + { 4.f, 4.5f, 5.f }, + { 5.6f, 6.3f, 7.1f }, + { 8.f, 9.f, 10.f } }; for (int avh = 0; avh < 8; avh++) { @@ -537,7 +537,7 @@ bool CameraConst::get_Levels(camera_const_levels & lvl, int bw, int iso, float f } } - float scaling = 1.0; + float scaling = 1.f; if (scaleIt == mApertureScaling.end()) { for (std::map::const_reverse_iterator entry = mApertureScaling.rbegin(); entry != mApertureScaling.rend(); ++entry) { @@ -570,7 +570,7 @@ int CameraConst::get_BlackLevel(const int idx, const int iso_speed) const assert(idx >= 0 && idx <= 3); camera_const_levels lvl; - if (!get_Levels(lvl, 0, iso_speed, 0.0)) { + if (!get_Levels(lvl, 0, iso_speed, 0.f)) { return -1; } @@ -626,7 +626,7 @@ bool CameraConstantsStore::parse_camera_constants_file(const Glib::ustring& file if (datasize == bufsize - 1) { // we need more memory bufsize += increment; void *temp = realloc(buf, bufsize); // try to realloc buffer with new size - if(!temp) { // realloc failed + if (!temp) { // realloc failed temp = malloc(bufsize); // alloc now buffer if (temp) { // alloc worked memcpy(temp, buf, bufsize - increment); // copy old buffer content to new buffer From 5691b5498caad2d23f3b9b4cc9aa2bd45ed9d48a Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 8 Mar 2020 22:08:49 +0100 Subject: [PATCH 020/109] camconst.cc : one more auto --- rtengine/camconst.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/camconst.cc b/rtengine/camconst.cc index fe55ecd11..1e303ba73 100644 --- a/rtengine/camconst.cc +++ b/rtengine/camconst.cc @@ -540,7 +540,7 @@ bool CameraConst::get_Levels(camera_const_levels & lvl, int bw, int iso, float f float scaling = 1.f; if (scaleIt == mApertureScaling.end()) { - for (std::map::const_reverse_iterator entry = mApertureScaling.rbegin(); entry != mApertureScaling.rend(); ++entry) { + for (auto entry = mApertureScaling.crbegin(); entry != mApertureScaling.crend(); ++entry) { if (entry->first > fnumber) { scaling = entry->second; } else { From 493d7306a4d3458136f0d3f151f1a9f84432ab35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 9 Mar 2020 10:33:56 +0100 Subject: [PATCH 021/109] More C++-isms --- rtengine/camconst.cc | 151 +++++++++++++++++++++---------------------- rtengine/camconst.h | 6 +- 2 files changed, 75 insertions(+), 82 deletions(-) diff --git a/rtengine/camconst.cc b/rtengine/camconst.cc index 1e303ba73..aab2a252c 100644 --- a/rtengine/camconst.cc +++ b/rtengine/camconst.cc @@ -8,6 +8,8 @@ #include #include #include +#include +#include #include #include @@ -33,9 +35,9 @@ CameraConst::CameraConst() : pdafOffset(0) } -bool CameraConst::parseApertureScaling(CameraConst *cc, void *ji_) +bool CameraConst::parseApertureScaling(CameraConst *cc, const void *ji_) { - cJSON *ji = (cJSON *)ji_; + const cJSON *ji = static_cast(ji_); if (ji->type != cJSON_Array) { fprintf(stderr, "\"ranges\":\"aperture_scaling\" must be an array\n"); @@ -43,12 +45,14 @@ bool CameraConst::parseApertureScaling(CameraConst *cc, void *ji_) } for (ji = ji->child; ji; ji = ji->next) { - cJSON *js = cJSON_GetObjectItem(ji, "aperture"); + const cJSON *js = cJSON_GetObjectItem(ji, "aperture"); if (!js) { fprintf(stderr, "missing \"ranges\":\"aperture_scaling\":\"aperture\" object item.\n"); return false; - } else if (js->type != cJSON_Number) { + } + + if (js->type != cJSON_Number) { fprintf(stderr, "\"ranges\":\"aperture_scaling\":\"aperture\" must be a number.\n"); return false; } @@ -59,28 +63,32 @@ bool CameraConst::parseApertureScaling(CameraConst *cc, void *ji_) if (!js) { fprintf(stderr, "missing \"ranges\":\"aperture_scaling\":\"scale_factor\" object item.\n"); return false; - } else if (js->type != cJSON_Number) { + } + + if (js->type != cJSON_Number) { fprintf(stderr, "\"ranges\":\"aperture_scaling\":\"scale_factor\" must be a number.\n"); return false; } const float scale_factor = js->valuedouble; - cc->mApertureScaling.insert(std::pair(aperture, scale_factor)); + cc->mApertureScaling.emplace(aperture, scale_factor); } return true; } -bool CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_) +bool CameraConst::parseLevels(CameraConst *cc, int bw, const void *ji_) { - cJSON *ji = (cJSON *)ji_; + const cJSON *ji = static_cast(ji_); if (ji->type == cJSON_Number) { camera_const_levels lvl; lvl.levels[0] = lvl.levels[1] = lvl.levels[2] = lvl.levels[3] = ji->valueint; - cc->mLevels[bw].insert(std::pair(0, lvl)); + cc->mLevels[bw].emplace(0, lvl); return true; - } else if (ji->type != cJSON_Array) { + } + + if (ji->type != cJSON_Array) { fprintf(stderr, "\"ranges\":\"%s\" must be a number or an array\n", bw ? "white" : "black"); return false; } @@ -88,7 +96,7 @@ bool CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_) if (ji->child->type == cJSON_Number) { camera_const_levels lvl; int i; - cJSON *js; + const cJSON *js; for (js = ji->child, i = 0; js && i < 4; js = js->next, i++) { lvl.levels[i] = js->valueint; @@ -103,34 +111,31 @@ bool CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_) return false; } - cc->mLevels[bw].insert(std::pair(0, lvl)); + cc->mLevels[bw].emplace(0, lvl); return true; } for (ji = ji->child; ji; ji = ji->next) { - int iso[1000] = { 0 }; - int iso_count = 0; - cJSON *js = cJSON_GetObjectItem(ji, "iso"); + const cJSON *js = cJSON_GetObjectItem(ji, "iso"); if (!js) { fprintf(stderr, "missing \"ranges\":\"%s\":\"iso\" object item.\n", bw ? "white" : "black"); return false; - } else if (js->type == cJSON_Number) { - iso[0] = js->valueint; - iso_count = 1; - } else if (js->type == cJSON_Array) { - int i; + } - for (js = js->child, i = 0; js && i < 1000; js = js->next, i++) { + std::vector isos; + + if (js->type == cJSON_Number) { + isos.push_back(js->valueint); + } else if (js->type == cJSON_Array) { + for (js = js->child; js; js = js->next) { if (js->type != cJSON_Number) { fprintf(stderr, "\"ranges\":\"%s\":\"iso\" must be a number or an array of numbers.\n", bw ? "white" : "black"); return false; } - iso[i] = js->valueint; + isos.push_back(js->valueint); } - - iso_count = i; } else { fprintf(stderr, "\"ranges\":\"%s\":\"iso\" must be an array or a number.\n", bw ? "white" : "black"); return false; @@ -172,28 +177,27 @@ bool CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_) return false; } - for (int i = 0; i < iso_count; i++) { - cc->mLevels[bw].insert(std::pair(iso[i], lvl)); + for (auto iso : isos) { + cc->mLevels[bw].emplace(iso, lvl); } } return true; } -CameraConst* CameraConst::parseEntry(void *cJSON_, const char *make_model) +CameraConst* CameraConst::parseEntry(const void *cJSON_, const char *make_model) { - cJSON *js, *ji, *jranges; - js = (cJSON *)cJSON_; + const cJSON *js = static_cast(cJSON_); - CameraConst *cc = new CameraConst; + std::unique_ptr cc(new CameraConst); cc->make_model = make_model; - ji = cJSON_GetObjectItem(js, "dcraw_matrix"); + const cJSON *ji = cJSON_GetObjectItem(js, "dcraw_matrix"); if (ji) { if (ji->type != cJSON_Array) { fprintf(stderr, "\"dcraw_matrix\" must be an array\n"); - goto parse_error; + return nullptr; } int i; @@ -201,10 +205,10 @@ CameraConst* CameraConst::parseEntry(void *cJSON_, const char *make_model) for (i = 0, ji = ji->child; i < 12 && ji; i++, ji = ji->next) { if (ji->type != cJSON_Number) { fprintf(stderr, "\"dcraw_matrix\" array must contain numbers\n"); - goto parse_error; + return nullptr; } - cc->dcraw_matrix[i] = (short)ji->valueint; + cc->dcraw_matrix[i] = ji->valueint; } } @@ -213,7 +217,7 @@ CameraConst* CameraConst::parseEntry(void *cJSON_, const char *make_model) if (ji) { if (ji->type != cJSON_Array) { fprintf(stderr, "\"raw_crop\" must be an array\n"); - goto parse_error; + return nullptr; } int i; @@ -221,7 +225,7 @@ CameraConst* CameraConst::parseEntry(void *cJSON_, const char *make_model) for (i = 0, ji = ji->child; i < 4 && ji; i++, ji = ji->next) { if (ji->type != cJSON_Number) { fprintf(stderr, "\"raw_crop\" array must contain numbers\n"); - goto parse_error; + return nullptr; } cc->raw_crop[i] = ji->valueint; @@ -229,7 +233,7 @@ CameraConst* CameraConst::parseEntry(void *cJSON_, const char *make_model) if (i != 4 || ji) { fprintf(stderr, "\"raw_crop\" must contain 4 numbers\n"); - goto parse_error; + return nullptr; } } @@ -238,7 +242,7 @@ CameraConst* CameraConst::parseEntry(void *cJSON_, const char *make_model) if (ji) { if (ji->type != cJSON_Array) { fprintf(stderr, "\"masked_areas\" must be an array\n"); - goto parse_error; + return nullptr; } int i; @@ -246,7 +250,7 @@ CameraConst* CameraConst::parseEntry(void *cJSON_, const char *make_model) for (i = 0, ji = ji->child; i < 2 * 4 && ji; i++, ji = ji->next) { if (ji->type != cJSON_Number) { fprintf(stderr, "\"masked_areas\" array must contain numbers\n"); - goto parse_error; + return nullptr; } cc->raw_mask[i / 4][i % 4] = ji->valueint; @@ -254,27 +258,23 @@ CameraConst* CameraConst::parseEntry(void *cJSON_, const char *make_model) if (i % 4 != 0) { fprintf(stderr, "\"masked_areas\" array length must be divisible by 4\n"); - goto parse_error; + return nullptr; } } - jranges = cJSON_GetObjectItem(js, "ranges"); + const cJSON *jranges = cJSON_GetObjectItem(js, "ranges"); if (jranges) { ji = cJSON_GetObjectItem(jranges, "black"); - if (ji) { - if (!parseLevels(cc, 0, ji)) { - goto parse_error; - } + if (ji && !parseLevels(cc.get(), 0, ji)) { + return nullptr; } ji = cJSON_GetObjectItem(jranges, "white"); - if (ji) { - if (!parseLevels(cc, 1, ji)) { - goto parse_error; - } + if (ji && !parseLevels(cc.get(), 1, ji)) { + return nullptr; } ji = cJSON_GetObjectItem(jranges, "white_max"); @@ -282,18 +282,16 @@ CameraConst* CameraConst::parseEntry(void *cJSON_, const char *make_model) if (ji) { if (ji->type != cJSON_Number) { fprintf(stderr, "\"ranges\":\"white_max\" must be a number\n"); - goto parse_error; + return nullptr; } - cc->white_max = (int)ji->valueint; + cc->white_max = ji->valueint; } ji = cJSON_GetObjectItem(jranges, "aperture_scaling"); - if (ji) { - if (!parseApertureScaling(cc, ji)) { - goto parse_error; - } + if (ji && !parseApertureScaling(cc.get(), ji)) { + return nullptr; } } @@ -303,9 +301,9 @@ CameraConst* CameraConst::parseEntry(void *cJSON_, const char *make_model) if (!cc->get_Levels(lvl, bw, 0, 0)) { const auto it = cc->mLevels[bw].cbegin(); - if (it != cc->mLevels[bw].end()) { + if (it != cc->mLevels[bw].cend()) { // insert levels with lowest iso as the default (iso 0) - cc->mLevels[bw].insert(std::pair(0, it->second)); + cc->mLevels[bw].emplace(0, it->second); } } } @@ -315,13 +313,13 @@ CameraConst* CameraConst::parseEntry(void *cJSON_, const char *make_model) if (ji) { if (ji->type != cJSON_Array) { fprintf(stderr, "\"pdaf_pattern\" must be an array\n"); - goto parse_error; + return nullptr; } for (ji = ji->child; ji; ji = ji->next) { if (ji->type != cJSON_Number) { fprintf(stderr, "\"pdaf_pattern\" array must contain numbers\n"); - goto parse_error; + return nullptr; } cc->pdafPattern.push_back(ji->valueint); @@ -333,7 +331,7 @@ CameraConst* CameraConst::parseEntry(void *cJSON_, const char *make_model) if (ji) { if (ji->type != cJSON_Number) { fprintf(stderr, "\"pdaf_offset\" must contain a number\n"); - goto parse_error; + return nullptr; } cc->pdafOffset = ji->valueint; @@ -344,17 +342,13 @@ CameraConst* CameraConst::parseEntry(void *cJSON_, const char *make_model) if (ji) { if (ji->type != cJSON_False && ji->type != cJSON_True) { fprintf(stderr, "\"global_green_equilibration\" must be a boolean\n"); - goto parse_error; + return nullptr; } cc->globalGreenEquilibration = (ji->type == cJSON_True); } - return cc; - -parse_error: - delete cc; - return nullptr; + return cc.release(); } bool CameraConst::has_dcrawMatrix() const @@ -392,6 +386,7 @@ void CameraConst::update_pdafPattern(const std::vector &other) if (other.empty()) { return; } + pdafPattern = other; } @@ -400,6 +395,7 @@ void CameraConst::update_pdafOffset(int other) if (other == 0) { return; } + pdafOffset = other; } @@ -445,18 +441,15 @@ void CameraConst::update_Levels(const CameraConst *other) return; } - if (other->mLevels[0].size()) { - mLevels[0].clear(); + if (!other->mLevels[0].empty()) { mLevels[0] = other->mLevels[0]; } - if (other->mLevels[1].size()) { - mLevels[1].clear(); + if (!other->mLevels[1].empty()) { mLevels[1] = other->mLevels[1]; } - if (other->mApertureScaling.size()) { - mApertureScaling.clear(); + if (!other->mApertureScaling.empty()) { mApertureScaling = other->mApertureScaling; } @@ -502,7 +495,7 @@ bool CameraConst::get_Levels(camera_const_levels & lvl, int bw, int iso, float f lvl = it->second; - if (bw == 1 && fnumber > 0 && mApertureScaling.size() > 0) { + if (bw == 1 && fnumber > 0 && !mApertureScaling.empty()) { std::map::const_iterator scaleIt = mApertureScaling.find(fnumber); if (scaleIt == mApertureScaling.end()) { @@ -655,7 +648,7 @@ bool CameraConstantsStore::parse_camera_constants_file(const Glib::ustring& file cJSON_Minify(buf); // parse - cJSON *jsroot = cJSON_Parse(buf); + cJSON* const jsroot = cJSON_Parse(buf); if (!jsroot) { char str[128]; @@ -674,7 +667,7 @@ bool CameraConstantsStore::parse_camera_constants_file(const Glib::ustring& file free(buf); - cJSON *js = cJSON_GetObjectItem(jsroot, "camera_constants"); + const cJSON *js = cJSON_GetObjectItem(jsroot, "camera_constants"); if (!js) { fprintf(stderr, "missing \"camera_constants\" object item\n"); @@ -682,7 +675,7 @@ bool CameraConstantsStore::parse_camera_constants_file(const Glib::ustring& file } for (js = js->child; js; js = js->next) { - cJSON *ji = cJSON_GetObjectItem(js, "make_model"); + const cJSON *ji = cJSON_GetObjectItem(js, "make_model"); if (!ji) { fprintf(stderr, "missing \"make_model\" object item\n"); @@ -702,7 +695,7 @@ bool CameraConstantsStore::parse_camera_constants_file(const Glib::ustring& file goto parse_error; } - CameraConst *cc = CameraConst::parseEntry((void *)js, ji->valuestring); + CameraConst* const cc = CameraConst::parseEntry((const void *)js, ji->valuestring); if (!cc) { goto parse_error; @@ -719,7 +712,7 @@ bool CameraConstantsStore::parse_camera_constants_file(const Glib::ustring& file } } else { // The CameraConst already exist for this camera make/model -> we merge the values - CameraConst *existingcc = entry.first->second; + CameraConst* const existingcc = entry.first->second; // updating the dcraw matrix existingcc->update_dcrawMatrix(cc->get_dcrawMatrix()); @@ -771,7 +764,7 @@ void CameraConstantsStore::init(const Glib::ustring& baseDir, const Glib::ustrin { parse_camera_constants_file(Glib::build_filename(baseDir, "camconst.json")); - Glib::ustring userFile(Glib::build_filename(userSettingsDir, "camconst.json")); + const Glib::ustring userFile(Glib::build_filename(userSettingsDir, "camconst.json")); if (Glib::file_test(userFile, Glib::FILE_TEST_EXISTS)) { parse_camera_constants_file(userFile); diff --git a/rtengine/camconst.h b/rtengine/camconst.h index b959481ba..aa0702439 100644 --- a/rtengine/camconst.h +++ b/rtengine/camconst.h @@ -36,12 +36,12 @@ private: int globalGreenEquilibration; CameraConst(); - static bool parseLevels(CameraConst *cc, int bw, void *ji); - static bool parseApertureScaling(CameraConst *cc, void *ji); + static bool parseLevels(CameraConst *cc, int bw, const void *ji); + static bool parseApertureScaling(CameraConst *cc, const void *ji); bool get_Levels(camera_const_levels & lvl, int bw, int iso, float fnumber) const; public: - static CameraConst *parseEntry(void *cJSON, const char *make_model); + static CameraConst *parseEntry(const void *cJSON, const char *make_model); bool has_dcrawMatrix(void) const; void update_dcrawMatrix(const short *other); const short *get_dcrawMatrix(void) const; From 9c9cd6dd873bbcedeb6aab759f7b2e4a119212cb Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 10 Mar 2020 11:45:04 +0100 Subject: [PATCH 022/109] copied some dcp profiles from ART --- rtdata/dcpprofiles/CANON EOS 5D MARK IV.dcp | Bin 0 -> 32782 bytes rtdata/dcpprofiles/CANON EOS M6 MARK II.dcp | Bin 0 -> 65374 bytes rtdata/dcpprofiles/CANON EOS R.dcp | Bin 0 -> 65350 bytes .../CANON POWERSHOT G1 X MARK II.dcp | Bin 0 -> 65390 bytes rtdata/dcpprofiles/FUJIFILM X-A5.dcp | Bin 0 -> 65358 bytes rtdata/dcpprofiles/FUJIFILM X-H1.dcp | Bin 0 -> 65358 bytes rtdata/dcpprofiles/FUJIFILM X-PRO3.dcp | Bin 0 -> 65358 bytes rtdata/dcpprofiles/FUJIFILM X-T3.dcp | Bin 0 -> 65358 bytes rtdata/dcpprofiles/NIKON D500.dcp | Bin 0 -> 65350 bytes rtdata/dcpprofiles/NIKON D5300.dcp | Bin 0 -> 65350 bytes rtdata/dcpprofiles/NIKON D610.dcp | Bin 0 -> 65350 bytes rtdata/dcpprofiles/NIKON D7100.dcp | Bin 0 -> 65350 bytes rtdata/dcpprofiles/NIKON D7500.dcp | Bin 0 -> 65350 bytes rtdata/dcpprofiles/NIKON D800.dcp | Bin 0 -> 65350 bytes rtdata/dcpprofiles/NIKON D850.dcp | Bin 0 -> 65350 bytes rtdata/dcpprofiles/NIKON Z 50.dcp | Bin 0 -> 65350 bytes rtdata/dcpprofiles/NIKON Z 6.dcp | Bin 0 -> 65350 bytes rtdata/dcpprofiles/NIKON Z 7.dcp | Bin 0 -> 65350 bytes rtdata/dcpprofiles/OLYMPUS E-M5MARKII.dcp | Bin 0 -> 65366 bytes rtdata/dcpprofiles/PENTAX K-50.dcp | Bin 0 -> 65350 bytes rtdata/dcpprofiles/SONY ILCE-6400.dcp | Bin 0 -> 65358 bytes rtdata/dcpprofiles/SONY ILCE-6600.dcp | Bin 0 -> 65358 bytes rtdata/dcpprofiles/SONY ILCE-7RM4.dcp | Bin 0 -> 65358 bytes rtdata/dcpprofiles/SONY ILCE-9.dcp | Bin 0 -> 65350 bytes 24 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 rtdata/dcpprofiles/CANON EOS 5D MARK IV.dcp create mode 100644 rtdata/dcpprofiles/CANON EOS M6 MARK II.dcp create mode 100644 rtdata/dcpprofiles/CANON EOS R.dcp create mode 100644 rtdata/dcpprofiles/CANON POWERSHOT G1 X MARK II.dcp create mode 100644 rtdata/dcpprofiles/FUJIFILM X-A5.dcp create mode 100644 rtdata/dcpprofiles/FUJIFILM X-H1.dcp create mode 100644 rtdata/dcpprofiles/FUJIFILM X-PRO3.dcp create mode 100644 rtdata/dcpprofiles/FUJIFILM X-T3.dcp create mode 100644 rtdata/dcpprofiles/NIKON D500.dcp create mode 100644 rtdata/dcpprofiles/NIKON D5300.dcp create mode 100644 rtdata/dcpprofiles/NIKON D610.dcp create mode 100644 rtdata/dcpprofiles/NIKON D7100.dcp create mode 100644 rtdata/dcpprofiles/NIKON D7500.dcp create mode 100644 rtdata/dcpprofiles/NIKON D800.dcp create mode 100644 rtdata/dcpprofiles/NIKON D850.dcp create mode 100644 rtdata/dcpprofiles/NIKON Z 50.dcp create mode 100644 rtdata/dcpprofiles/NIKON Z 6.dcp create mode 100644 rtdata/dcpprofiles/NIKON Z 7.dcp create mode 100644 rtdata/dcpprofiles/OLYMPUS E-M5MARKII.dcp create mode 100644 rtdata/dcpprofiles/PENTAX K-50.dcp create mode 100644 rtdata/dcpprofiles/SONY ILCE-6400.dcp create mode 100644 rtdata/dcpprofiles/SONY ILCE-6600.dcp create mode 100644 rtdata/dcpprofiles/SONY ILCE-7RM4.dcp create mode 100644 rtdata/dcpprofiles/SONY ILCE-9.dcp diff --git a/rtdata/dcpprofiles/CANON EOS 5D MARK IV.dcp b/rtdata/dcpprofiles/CANON EOS 5D MARK IV.dcp new file mode 100644 index 0000000000000000000000000000000000000000..80407fb216c5afcbe94bfdc84c229c4dc113133b GIT binary patch literal 32782 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 Wp^`d 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 B5r_Z) literal 0 HcmV?d00001 diff --git a/rtdata/dcpprofiles/CANON EOS M6 MARK II.dcp b/rtdata/dcpprofiles/CANON EOS M6 MARK II.dcp new file mode 100644 index 0000000000000000000000000000000000000000..9a877f02f1e18f7ef952d36f7b58558a21aecda5 GIT binary patch literal 65374 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 P?{hl-`!q59@%R4&yQf?j literal 0 HcmV?d00001 diff --git a/rtdata/dcpprofiles/CANON EOS R.dcp b/rtdata/dcpprofiles/CANON EOS R.dcp new file mode 100644 index 0000000000000000000000000000000000000000..6ea5302e290637ef5fb806575782f07b7d344e80 GIT binary patch literal 65350 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 AWdHyG literal 0 HcmV?d00001 diff --git a/rtdata/dcpprofiles/CANON POWERSHOT G1 X MARK II.dcp b/rtdata/dcpprofiles/CANON POWERSHOT G1 X MARK II.dcp new file mode 100644 index 0000000000000000000000000000000000000000..656649fd966bf495a85347ae478535de884b0c00 GIT binary patch literal 65390 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 literal 0 HcmV?d00001 diff --git a/rtdata/dcpprofiles/FUJIFILM X-A5.dcp b/rtdata/dcpprofiles/FUJIFILM X-A5.dcp new file mode 100644 index 0000000000000000000000000000000000000000..c6e88d7891b7c2db8438b5f3cf889dc15aa16bdf GIT binary patch literal 65358 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 S`|JGsIqm+vmNfnF`u_oLw>SO( literal 0 HcmV?d00001 diff --git a/rtdata/dcpprofiles/FUJIFILM X-H1.dcp b/rtdata/dcpprofiles/FUJIFILM X-H1.dcp new file mode 100644 index 0000000000000000000000000000000000000000..e3abc07f179edb0d81bca5b6c0e75a75164ea5a3 GIT binary patch literal 65358 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 dnswQ>@^y{Vw&4-1#KDi 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 literal 0 HcmV?d00001 diff --git a/rtdata/dcpprofiles/FUJIFILM X-PRO3.dcp b/rtdata/dcpprofiles/FUJIFILM X-PRO3.dcp new file mode 100644 index 0000000000000000000000000000000000000000..bfbaff9e5670680c1da81fddea2736519b8f10dc GIT binary patch literal 65358 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 I{rL0$0mxx5%m4rY literal 0 HcmV?d00001 diff --git a/rtdata/dcpprofiles/FUJIFILM X-T3.dcp b/rtdata/dcpprofiles/FUJIFILM X-T3.dcp new file mode 100644 index 0000000000000000000000000000000000000000..5024f38a9f3a64cee842691f23ef5bd982077078 GIT binary patch literal 65358 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

<8oS*ZJ>OF;?36 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 literal 0 HcmV?d00001 diff --git a/rtdata/dcpprofiles/NIKON D5300.dcp b/rtdata/dcpprofiles/NIKON D5300.dcp new file mode 100644 index 0000000000000000000000000000000000000000..2c7566c8cd78547ff598f94a97d9f333d3082f19 GIT binary patch literal 65350 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

+BJ270IlF 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 literal 0 HcmV?d00001 diff --git a/rtdata/dcpprofiles/NIKON D7100.dcp b/rtdata/dcpprofiles/NIKON D7100.dcp new file mode 100644 index 0000000000000000000000000000000000000000..332157fc96dd4ff99242aa420804b9e507ca8610 GIT binary patch literal 65350 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

dKMxfEE@9hVkA8>7aMFM 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 z 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 CiGS+= literal 0 HcmV?d00001 diff --git a/rtdata/dcpprofiles/NIKON D800.dcp b/rtdata/dcpprofiles/NIKON D800.dcp new file mode 100644 index 0000000000000000000000000000000000000000..5f0ebba8c15c2bdc7fea753cdd128f0e35a3def3 GIT binary patch literal 65350 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­vd}GZZK2*|_(3C=a1KZ^sqN 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 literal 0 HcmV?d00001 diff --git a/rtdata/dcpprofiles/NIKON D850.dcp b/rtdata/dcpprofiles/NIKON D850.dcp new file mode 100644 index 0000000000000000000000000000000000000000..806e1e9bb7ed9086baeb92d15b4d147228aa8bbd GIT binary patch literal 65350 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 h2%+)$+(5BcG%@+1mQr~;w?LoIv`~1KAd8g(z zE^&rlyS@wNO#OjY+q^NY3$y9_RS@w@$YJ0*JnLCi{HA{K%rY0ujH)FpMtGx~2Yn3Y z))%X+y|FQYd57H_3llZktEdazajmH+Xvd78uk`f$)l6(_LEl#5+ZkJ$i6>2|edO$B zUYjOjTx0rSt|8B|djqkzkvEQNT*+~)CG7e7H}bZ>=2?jCO{hsdLM_v<^5Q37AE3D6 zV*EFRkT;u}?}}b0-{3KEk#dE^kq17)xi4Dy^7W&mZgF11o>0=aD(fodA|;|vpBsg^B3q{ zOI@vtpDUbK+9HV9c>ZH@w`YyOiQQUE;qxPNRi$%2dmiu7{&iR5CJ6O&KUj5jfvtX; z_=_I7gXVFs-ku`{Qh)8^M_tyHMIvgpAMDxh?cB3M)aXus*IzD3yRb%#u0;Q$f%I7O z*(m;x+n;vgU2^3X5tv1vB7VmGueXUe5ybK<)8j8{ySV4*i@6hdm#@A}#4PZIBWGkS z8#;*CVbtRn@H<#;t!T$t(vENBm~USuGKql%wIXlcW}e9V=7YMD>ANG(r8P%`e3S)8Ww><)FV$v>%k1EeS^iY&OX@UOa73vjVR%F+KU|V z;Ih`D8~f!WJR_S`>L?}`c;me%IT=sd3yV~5=CIMDW_}~_gwHQs)#zEmOwTy-4fr!1 z`cxKs_6Ac*5_^6?jY=24^6n*H;tAd%0!)I?&nPx^<7{ulM=ah}<-Pr`*8If2>j zc`n;UiNWLau=JvbQO_9hxEk-3FWr#aZLes3S%+_SYNQm$hQh>A);w5QD-v(8U*5%j+IxYRe%}ZEHW7!kTp;dVAdj1`^MDkS_#X9E z_8I-`L|bC#WB7VXwyn^wp(pf`(*7Iw9_|+*#Js1@cfsQK2gT_=ff#U_I8)tzA6s9!qD|K$VyUk`vgf$L>gO>LLB8wFi|i-TPl(*} z#C^xmTcOrzF>9j{hx662N<1TS>KmzTaEHV7GvXfkbR+Y*o`0PZN9dzBl0C6QXr{2M zPv36?=OSe@#EJsWX4y+!XP$CC^=)SAHMaZ53m0Mnt44WZU8PvD>Tew)wtB)VHcFi0 zJaJ~y|XU^w@y9~rw2Q?fAUJ$E?Gb6s7 zJM=}Dg!*g%wsVFw@J^8!GBE&o^e5S%x+1FI@J9mq5L;SZ7LS(rBbOS1YBA?T%TGpZ zJWj8SYB}PyFLC0EUg&@HjIix!#N4se%?&;-z9aO_RFaoRR@SR^9^W2j3(RJDB7(x zVjpKfuc@cAq>kVYHM;*@=d2<5V)*O`#QV}u`|CL|`A|5Vo4MlqmJ8zJ7y7{Syr{#q z(vD@ms-PETt1IGYR4B1BH~iXmO?>$j0!yy#gzMMERp!2~;(X}T;9_A;<(&B#J$8(@ zM5VgH=*b=q&Ub{zt|0WNPb|9LU6J-U5IuPB{cBK(SWa%h<#EI#qOS7$9)QJZ%#{3o zUMv_NfLE0@__x_v(e%7O3g&VaJ4*_0YF%BDIDgE`5_NKnnDUz#$HLQM@?ayn&7q&^ zpOfM_@v%nPTKwL`z0|{i_JcShTXa%vA!a_u?2Ve+PKpz)^q67m1JmIn;=(dLtXk2x z+IU24w$kG`v8JszlSNn^16~bfy^zVG*&97Z&-Fq3IYx09)Xlu7zI&6mNJuoIoudKj z&znU=)c}+WFTKvse_ax)jA-26?}AMKE8_6|C@AAO$Gve)R3w*S6Y;)}Pp^yPgCcQ{ z`lr*^ZVG$ySlfSk z8__eT{(TW1L4N%ePizjjD|S%B=SY9`L&e2HZySs*#DGF8UK4$&dzkD>EZXOy=vFNV zd*2ZkeO@3|lCP0Hmp#OUJW=av06wsXSa300^x~|$sINDcZk1wVgg>>;)I3;G_g%ps zpXU2u`$8#>t}~*j9(553QY2DqznR{G!_uXg+RK1-E2vZE-zaiBbuf+nP|^0Zn9I3F z!8||QR8b?$8Q1y^I{LlGi;hY3vRI&p!!(WP@;n6oy#ldv0yUw#L(su45EjJ?g>P2_ zMiiD_=N~_d#4(FFG|i$n-P&tnLW5W|V$V=!^K}v3VlP(E|FCI?o8nmK7&sG?8XQAM0+2Lm!zfMx689$gAQCIiAb1G}!pU8Hc`vm zuS>4DmE?~>U717EDpw5rXvC{0It1tDh-e!lx;V1Fgq{-Z@~M3*qen&OQ)21-K=c`{ zNBbAy!qYbZ&OZ%kaoA5JWct&?*&i|e){1hyiGxN3!mweP@C-7*d_E8v&+Nn)Y9dP- zm&Tui{0oIri}~{GE8Zkupkyow9;_AiV=sx47Kzy6?#2wQ%c7`Z0&2`x^Sf6h8dNxh zC*+@>aV-)fpB+Hk3e*zxDiYVs@o+8jz?(LgMSISScG)EQ z{2hrwS|7YVkR>eNMPM{}S_6({i8I|Ju$5=h42?;2bPvak**Z-9V-gSOK@qe@58K-& zVSW$_|NaJOcbLSkA0en%V&MGOBo=X|8b`mI#tjn%s1tJTYsB?#@gk)c=T1dNIL_6G zaWg~ltA6Qyn`=K#h%oW7;saDv9r=l&-`pp?y5r2r8O7wM! zch!o=2b0m|yEkGRYlVk42@76wE*q*5XXhj$RQlrI-t_71o`6XPKP+#p5qG;B#N+ik z3|y`eJ(|X2t*ahwj%viq>f~weB^TYYY`TRa~paH$A`rJzXoE^u9o7; zb1$gbZ+YZ46(K!6(a9+YwcRYl`8sNznWfixi1Q**aatAvf3x2RSt8z)IfIbj>^Fjz z3c*~qrN61Y_gpHjbvTKKKRA<`yF}RTJB|s&TMIrd6o+eMqAaoTt-a@oH2b6Yi=34q z&1Z_<#}6Zq`pp+}CyP;aGBB7Lmc;xCqNhy5nvq&${hlBKi&JrWr8joFP86~CQczvv zgBM38is>>L_56KtHD#hWPTlthM?ZwdO%!W;9AXA5?=VRd#h}XZ=uf|xH`gYL9~HT8 zPw43{Zzm3tdnH4u@tkQVZtadln_WgkdfSO{55mYx^oK_Zwf2ibFykM8G|#gWSAKBc zx&&bVbvxmG%pY%m1>ocZJCW#Xz#-<=o1fZ=(Js_DQe*qyeOu?RkJxyWK6~V2?<@Zt z-+Fjp3^fD8>J?%lambF1OZ#su_irSEznM_KGW9~un}~zKS%|DfuWWr2F|E}Zd}*Xc zwJ(juzg+VU%51e3^x+JwFZ!%L4u>Y57-gz0)@L08Zxw5Tjj z9uJ4=Fwgr@l|^=B2u81@zkzFIaVb3z^PBo(hPkpB^u~yP^87KlToti@q8|HMAI^`h zB4Rny^#3OSZ33%^49H_w^H4H_a3A-#lU0^*C-$^@6hxGXebQV?f;d z;;eO;Rre@!?1|9~UW&=L4`VU0DywOWFyKlC?w=-3yI?U=j;G^Nc|WxIXDPmQPK94R z9g2>wz{Bc^u;hHbTF5Gt`!^mHg7v7ea4lZdio=8<2JC;Z9&cAfW8r-RHrCjLzo=n7 z;mY~_I|rz8L-3OPzq<)r@FJT%;W=_m7jHx3e~fs$idxzpJJ5BQ9{3Z0)E2v-J3(J) z??BY*#vFqw-bk+!gid4k;5*N4jU#mgOH|~Z(r4&V5Y*&h47{So<>A2)#GCBzxZ-R$ zy(awfhb9qg8B4#d|K3yXx!pU{aa=ZfHfDBAt$;H_&nf8CoBoRZub+8uZH6Cb66*33 zvW`V$q1;M$?D9C8_4CVV*m6!;{aZ~_{FGD3Fw)nwjh$&;#tC@t=bbc9V`|X;IF_B( zpzq*=roVEJVF2fR-5k%DhJ+l&5n?(uLe83E_8dVj`9_b5pa$2g!n9A>o!S+HUrq2s8 zjr|>g1}ptBV!Od~>0~G(%CO&U>22yruI`So03567Zc@13+U|k;yE>UN>KQOQD-e&< zH=4eZU+{iJ5IR~dGfiv6Y$Mj#(5*8~)z53tpYs3=|o8?mnY74xBa`;l79AB$gHG#~NV zi~EQCvGG}$+vzUpJ%S>7mUq|194+aj=5)C0FvJXqEUHi zK19CCG-h6xEi{>1P9(4O8*zlNGv?3qO}f4{80)s2GS~IiV#o`w?ZOl0^E}%J%?zO~ zJJVb^j5Ya82$n`2HUAu`Mu=r7KIQK*9~$b8bwQ=qIc87?Wl&5W96E7+?b<;ZP%#%v zX3!7ib4TUz!faGjtI>Q%7bW+of{vU=-+9tqDXC$G+aqFMmVJ~*o3mhS!hGJpt(C@a zPvh(y;^Ti0R(|`PLa!7psva7qRGxMc8O_OWjvJ}W?8@BUBwy5TH%4)PpNXZ^s%W>3 zQ9O4a!^z`%Y`-x|vEFItd*)S{tmD@YNyo3=2X?K|kfjwm|Aw zgHT~`U*&xoe|EcIEXnSz%&n(K%>%)xHoKS7fgFh~twJ#MXAk8Uc?aD?LNGm}yYi(r z{b?(QqP$Z##s3R=5Dv^adqR)p>7FpQ3B}#5)s>5l$PFJa;G(h_5;L5Us|f25yQYYl~9i4!4%>%7b_XYMyV;-Y zwaS;6EP9h_@Mngv(wM$9H;Kdcx6v!kEly)RG2%Z*jmoD_Cn4ASA#Ox~@^t?R_*n9@ z^$$>Xlsk?@-l_bq85P&uBY3{oh@g%JWn!l^X82GGv0kUFPD#YRveb8H`zpV;FiSc( zfI4;`#abPQ7i|Oa?UGh87Dw~DMz0O6MhV>zf$9T-U|Qm(G)E}?jDrv`%~PqzUTo6H zV5H9RP@3)}SF<1(^)|UHD{kna9UFqSfokQixqeu3HUy`0-IO~#tKSa|#h`L-%BBM1 zPxO&Uv2#_PCwby*>o6p3+OCY`jA_#KP#nIqN_oh&ss6e2ItTYnRuaBa8%V5v`uSvK z!gxE-S?eo{`gmzmBu0+uPX-N!0$84u(Twch$WWs@RYK7dr*Yp#3K&`>7hxD4Pl&aWs zhSG3e7#<)+DMOyx$tz))^l`t^ayic;`!Edn9HKm^;Dx!nO8b39Mcq<99VkTb2ztD3 zy{*)KSAdN^>`|)URhstChh;J67c=fF3qA92n*52K!~RyLyvo5+Z~AX!JyCwIXMXs1 zFC-s^oUyw5N=5d|wcm!|?}hi2f@!=jZV$!%(RY=tS9EasNj=NxJIeUYS)hwJ~}e&e6s73GMT z7qDmo{fe?H%8wz1$cv($^Gqc<QueO6g^UT#Lvb$g%;(kQ zxYoHSHzeY{rEJWhSI@4!%z!gW=2+3Y_GMk!YMO$}yvJFesxL#{n$XvU*&eeS z$N}B5u-DdzZ~67)n4(kgb@a#n!a6d#;&D`-5r9TjYRmU+4#W04y?WQwl;`QsHp>u* zeqXE0iOm!6j5>(=>D6R--FQq%3Br1PRXKiIEImMip*C8`zQs}az?xu{QAIWh5635Z z^^AN`SxzTUe-g7}kM*l8D>2)28P~REKqc9j=c=wk7+(CYC_8dCG}cHjyB!tfmX3ZH zWf>0juL|^ZPGG4IA zX(#_K&ci0=1BI^bD931WQR)Bl+Lm49k`Xx=+sT)?FWuy_HxdoWeLOL`hitr1!QdJO z*!J!rG0B9`3?mLS?I!;zJdMxvX5F0KS=v51j@iip$TD}7hrS+$(`4Q;-nWMr{TW=y)*!iO9-*B{4H;|*t`JiX#h*JCfzxz4yM}K+a_+?Zj zUorNcwN&0*#M5lfp~l(B-(4=?O;74H2Mm(4+zN4&{CG|D5c!7nTp8?ziz|hErO(H> z=Ng2p93j02pT(M^-bk1=N}8YL!i||RyDyKC85?uZJA(XOt8sF4yhI^+#S4dwm8p}> zcuI^|n=newO+ABiEdwyAtgW1U*6?OxP{>0q=E7+y-yROLf|oiULA>Yvcb&(TOqMm)T)}Jl zZv?)XB0VE6Bb{E^ZzHD3J|!11ieAm<@6M2?dS5`f5)UNrn=Nxw3X!vme2WY7WZKAc zXf}X;=}i|&^^1IDHuQmYkEL?8(^+h!pT!@iv8H1n=C++D!}c7-=qrI(TW^jm$xp+V&D0%F zo+Zz$Ou|R{^LQ7{kXvUTL`G&X-fO4JKSBGDJ1+$L9j3_@ji|3L7YbkJsnY6tBnBjf zVsXM0=~NJg-qXVn{(7=J##uv)U#zRPljUWbK=`mG+)bGzJyMMrI57f0I!uxsN9i%( zQv{YDwv%4JeDNea63)pZ<>{K7BUhw9Rc1dK#r5C#fgUMV{bgg$_jkzB>#Uo-mimip zxUrErar@RutMOM5{oD=XA~(o#+ROCFq2HU0gH)be#0_dQ&n??3la^gTU-FFGz1$%~ zz7}FLc@JB5I?54#=g@Dv57ru;<@P`MXuQ)8Wrw-Q?6zl-u~Cn+|EucCH_VySqs zURqv{`o(>gNb0AB(C*2Av-4tcxyr+2C=8du zMH%=(n}zRdg^TTx4ZQ|rjqs)}_vl%cu9s@JFYzDd z-3Rhw<*SC3+#`#{@Yiv&p83l?JNHcr6U5x^2=?BIhfP5a_23H34@$(vfMgjEB&bcU z&ey+@XE**Zt|^k~QJ5kvUX){T;}lH)D@EoHIEc7VBXL~@Vol57!P@4p&6B0x-hCKI zj@Fn#tEJ+b-Du35W%}_1F)DW8X%A`|IO4@;)K(bDNA8;&CkF#Jp$GYj=Biln-%*6; z26FJ1#vn%`%b@r|i!Gihf}8u1s?gyb?L=*4y{ zRSF(_ft##D^@=mgL*o}{OHARm2&=54K1@K5c%1&sCf>}oo06M4sF7VdjNXU;YKiOW zkRjC(d#OoGUfYKm;!8b~gTw>%akk54%Py>*l8nkhHmP5+lY0ErdTnQwkcZn5U5l9M zmE_w_*os2p(RX(yAG~lA>V+FHw^1s+U)Q7aMgtT*jI#1|0YZNF7u-NPf>`(O0CQ6E%fe zUrmzE`z+K%CqE=NNq#4`p|phj=j9151Owo0VjEyZ}4TRXOy;ixdFM(4f`9inSq&l&L{^>eIFHM&h z*(JoPaGzyFh72la4RZpu1jjg})r}I2d#T5bD7ex02zCC~bTiZQF%7}5>52HA zNuG|gpf52Vjx3W*-b_x}RQjr%;uut#5q*;T7bOO%wT<)1E&5`A7%#UEk&k{O8ISdP zIns-JjH}+p<({8olkRcr;P#G|T4d=mqE;bvO|`H&?9xbAh{Ii}73!5Kmzx$LZ;Te* z`)5h%2A*rlDVmrg4~J5#`Gl7GrFru5*m{g|qdwcfd>Pwy1H297Jo~Se!JZqi{U){j z=d6`xFR05+%lZDupY@g78Vx39 z@p&b%KYy;lsOG8CC4g9kt9q!O80AJ0+xZUp^Ro@ovY8oAqZpe77-aTtYI?-Hjr)oV zwaUJ2+1Q(_Va$;xU%KSLYp90&UYo?|axjuO+jo}PCFDvDZkyD^_+|_;l}I-4WWPjaEyq{4-QJXzqA2h$vSN*!1u-=|RTt(}V8sx{Jfe;!m7^!SX+ zli#Z7_cK|E`-5`ilM{LL&{M#FjzhXu@w6Yn+YpV$#zf{BDMBS2xX85(yVPKp=Zc#(5$eEadH|C9BYMbN<*W2U7 ztQNjDN$A}yoR~|W-_aI1HX<8echq3lk5(D$$VLe{{3!=)vg2Mhe$7_nMwwljlgGbd zmKq6LGG#lpaE|s=oAXQE`B;Q>dgCXSjpIeuK&Y#9`92zCZ&kiU07I&`VTHKU-q>W-ws!I|7D`^<^ zFd7GkrHIENE1bTGCe}AaHnDc+cPJVsFB>Fon;922M`QjzgOrg+o|74k4t)*sC-ax2 zSqhBoV32{8ChQ7UV9wDbnfxC!tW(vvT$Us;)g~B%)o-ebgMdfxN!JSC!B3=+RP3vQ3-G5lAOft9&cJLb*j>lJ6VC#OIOP>*6@NxD3Is1T8ykk-J?JE?N+O0!&>rO zId*&=Cdz%r%$28^L_X084*@@z%&qR}LoX4tGORH1F zEs(44@e$YM77ome(BR6KjM@AcGX`pqGS4Wki4ItXYfw%-mP5N7m`wliz$Rw-sG52? zZ8SiZS?b($U@@P|UlYwz`I7@BC)K#v)+BpQIIuHSO%Fw*oG0&psJj|3Lz3l8j03r+ zRM@ySQI=8{ZO#-G^3?IN)|0iI>q^AL#YwPFCa#btv!HdH?Dt@9ZB=6YK#fnJfWA?Ix_|&DbfE+yUnwc$xpFd-9bx08D{Fj-cHWMblG`b652r3=qjWfNE5 zFIlq25d)^?TJUJKwCItEg?<{Gyq6$JFETiGH7K4IC;KFWz6WX?FVM**BekS_)zJK? zmeBAFc-~Z@`^PG2{giXU4i%J@O7U~GQ!87AkYc4Y@K49kwJJn!R?1?%4exJIp=^^< zmQw>y#p}xom9qO!;`GW@xSFFB&oNf?ag;<$5$CM`Temq?|rjBH|(%VmT*5j zki3a4AH>M!j&^dD$Ri6^%FtjtqRE?3+*Zr6R6YyFB>D=ibf)H03vv@~)YD5Tu_cXL zQon{d!jZdn6t>gCnfe^4wC7wpjC{9Ol?s{I)Q$}q8s^a}B$D5)6FuUuc8-!hYts?&3)khc2$>th{NS(} zIcp=NJ8Mg!2h=c~B}bkZx9mzarZ$L_&^_Frs#fFXN0Cz9B@Ov^)CdZQlqohVZvUmm z9}6R82y>b$j=Q~@NLia`fop#ao~1|1q6QW;BZs2*&PdTxSEPb`v`u*tl2&C#efEv0 z%@Oj9Yh_We2B#fMWmy>YF{YEhlebjvvYijl*1R=uIDNNJ{wT5$`%1s|r;DZXz772u z*JbsKkeROO=;f?Mqm(H5WlGoCoQ zYZ@HsH&q8S3HOh{c5%r z%iGM8NIx?geoCyq%RCw9Zids8zw?v7|7!A-Z}$*KEen#@>aCGJ5Bm#jefpr4iVxfTOPO_9mYfI`H4X?q#OMf$cL{}9wf!}S^uxi98DW21&rVN6C2Ra5h$))2Pc!`(D1*((#zS5 z)EioK8xkywdCiDBZ?|*WML+4uJ)+n)T5NLrRK77<;WB_+%2|`;EU}T@`HVc{r%2d2 zVqBRQOjs2po4Nm4n8DxGYMNNDS{cjG>!5eAL{!l$=86{QY{4?Ch?U!s zo}|N)Nn_+NaWny;I(X)d5!DkDj;M6h>K`Me*Gw3irh{*LUooCB;RSi2^8IZ4)|u z@^<{(wb4*H(bMwJI4af*m$Q7n>qc@el@ZdNnjfDmAz$q5D0!UDdc1>U-|i#5**6|h zW8%z%F;Z>f^-qZZ-|Z_SBQ4m--`?zuuWX=qhQ^0{M%J7!JT;>_Oot)KKH^M2A0O(d zJZ;Gu^!s| z@puo3Y{F|sQYR;RosG(L~%TsjwjO2Jy8_LsDe#oW{8MXgz zwD6Vn)V4oQt&D`ezEV4aS{cNAy5I7bkHv&z(bV90>@WVTfq7~EubuyY?ub}Edr{b& zPIH$oo)xx)FJEd~t5$QjTD7`5)f`Le)*OQx)Ew(}s5$PeU32Wr_xyc*)VnpujqPiW pL)+CHOaFa+-@o^J*{J6A1OI-`v^q8a^LGE-r}e+bZk=lW{~y_JMa=*J literal 0 HcmV?d00001 diff --git a/rtdata/dcpprofiles/NIKON Z 50.dcp b/rtdata/dcpprofiles/NIKON Z 50.dcp new file mode 100644 index 0000000000000000000000000000000000000000..beca667a73a76ef894b17f0fc83f77f5cdc0fec1 GIT binary patch literal 65350 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 Y{(WqR58w00{qN`K{`XYZ{_y?(0ng`HT>t<8 literal 0 HcmV?d00001 diff --git a/rtdata/dcpprofiles/NIKON Z 6.dcp b/rtdata/dcpprofiles/NIKON Z 6.dcp new file mode 100644 index 0000000000000000000000000000000000000000..eeb45a6b82fda30ae8ea94315136012d663eb451 GIT binary patch literal 65350 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 Y?fC)T{eAm?J`Vr6|NXqP_50`l0i+`>b^rhX literal 0 HcmV?d00001 diff --git a/rtdata/dcpprofiles/NIKON Z 7.dcp b/rtdata/dcpprofiles/NIKON Z 7.dcp new file mode 100644 index 0000000000000000000000000000000000000000..19fb7bba6e7197efd6a8b1ba396896e4387edc82 GIT binary patch literal 65350 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 literal 0 HcmV?d00001 diff --git a/rtdata/dcpprofiles/PENTAX K-50.dcp b/rtdata/dcpprofiles/PENTAX K-50.dcp new file mode 100644 index 0000000000000000000000000000000000000000..3205c757982490b50e1c1835c8d559f432a54a2b GIT binary patch literal 65350 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

E{a-cIZF2hj4*@PF;{a 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 literal 0 HcmV?d00001 diff --git a/rtdata/dcpprofiles/SONY ILCE-7RM4.dcp b/rtdata/dcpprofiles/SONY ILCE-7RM4.dcp new file mode 100644 index 0000000000000000000000000000000000000000..e473fa4968a4bb0cf7bf17e466e162c77cc682df GIT binary patch literal 65358 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 Wzk92EzYh5K=V<+V?Kk}U_x}&TIpX#J literal 0 HcmV?d00001 diff --git a/rtdata/dcpprofiles/SONY ILCE-9.dcp b/rtdata/dcpprofiles/SONY ILCE-9.dcp new file mode 100644 index 0000000000000000000000000000000000000000..c073158120918ae484fc3a38606495d193112e37 GIT binary patch literal 65350 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⪼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 Date: Tue, 10 Mar 2020 14:41:29 +0100 Subject: [PATCH 023/109] camconst.json : added FUJIFILM X-PRO3 --- rtengine/camconst.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index d50e050dd..507c782b3 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1375,7 +1375,7 @@ Camera constants: }, { // Quality C, only raw crop - "make_model": [ "FUJIFILM X-T3", "FUJIFILM X-T30" ], + "make_model": [ "FUJIFILM X-T3", "FUJIFILM X-T30", "FUJIFILM X-PRO3" ], "dcraw_matrix": [ 13426,-6334,-1177,-4244,12136,2371,-580,1303,5980 ], // DNG_v11, standard_v2 d65 "raw_crop": [ 0, 5, 6252, 4176] }, From 5732500e2fd0b4c7c8b8744c511435ad1eacbba3 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 10 Mar 2020 16:42:47 +0100 Subject: [PATCH 024/109] Do not use Standard light A if D65 does not exist --- rtengine/dcraw.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 7f6e2ee31..ac47c67a6 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -6898,7 +6898,7 @@ it under the terms of the one of two licenses as you choose: break; case 50778: case 50779: - if( get2() == 21 ) + if( get2() != 17 ) // 17 is Standard light A cm_D65 = (tag-50778); break; case 50829: /* ActiveArea */ From 6490c7d945bb110fcf000d6571e691d3987b735c Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 10 Mar 2020 20:40:46 +0100 Subject: [PATCH 025/109] camconst.json : added some dcraw_matrices from ART --- rtengine/camconst.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 507c782b3..27066897b 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1242,6 +1242,7 @@ Camera constants: { // Quality C, only raw crop "make_model": "Canon PowerShot SX70 HS", + "dcraw_matrix" : [18285, -8907, -1951, -1845, 10688, 1323, 364, 1101, 5139], // taken from ART "raw_crop": [ 96, 17, 5248, 3932 ] }, @@ -1270,6 +1271,7 @@ Camera constants: { // Quality C "make_model": "FUJIFILM GFX 100", + "dcraw_matrix" : [16212, -8423, -1583, -4336, 12583, 1937, -195, 726, 6199], // taken from ART "raw_crop": [ 0, 2, 11664, 8734 ] }, @@ -1350,6 +1352,7 @@ Camera constants: { // Quality C "make_model": [ "FUJIFILM X-T100" ], + "dcraw_matrix" : [11673, -4760, -1041, -3988, 12058, 2166, -771, 1417, 5568], // taken from ART "ranges": { "white": 16100 } }, @@ -1774,6 +1777,7 @@ Camera constants: { // Quality C, only raw crop "make_model": "OLYMPUS TG-6", + "dcraw_matrix" : [10899, -3832, -1082, -2112, 10736, 1575, -267, 1452, 5269], // taken from ART "raw_crop": [ 0, 0, -24, 0 ] // 24 pixels at right are garbage }, From 1693d66abc1e6ad4ca30925a465b995f143ac0a7 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 10 Mar 2020 21:07:34 +0100 Subject: [PATCH 026/109] camconst.json : added some dcraw_matrices from ART --- rtengine/camconst.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 27066897b..e97d1635c 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1395,6 +1395,11 @@ Camera constants: "ranges": { "white": 4040 } }, + { // Quality B, Matrix from ART + "make_model" : "LEICA D-LUX 7", + "dcraw_matrix" : [11577, -4230, -1106, -3967, 12211, 1957, -758, 1762, 5610] + }, + { // Quality B, Matrix from Adobe's dcp D65 instead of the internal in Leica's DNG "make_model": "LEICA Q (Typ 116)", "dcraw_matrix": [ 10068,-4043,-1068,-5319,14268,1044,-765,1701,6522 ], // DCP D65 @@ -1417,6 +1422,11 @@ Camera constants: "raw_crop": [ 0, 0, 0, -18 ] // 18 rows at bottom are garbage }, + { // Quality B, Matrix from ART + "make_model" : "LEICA V-LUX 5", + "dcraw_matrix" : [9803, -4185, -992, -4066, 12578, 1628, -838, 1824, 5288] + }, + { // Quality C "make_model": "LG mobile LG-H815", "dcraw_matrix": [ 5859,547,-1250,-6484,15547,547,-2422,5625,3906 ], // DNG D65 From a801d768ea6590a3eeb74cf035280f89db9278f7 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 10 Mar 2020 22:13:48 +0100 Subject: [PATCH 027/109] fixed lookup of camera matrices for DNG files always prefer our matrices in camconst.json over the embedded ones if available, patch taken from ART --- rtengine/dcraw.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index ac47c67a6..8085e12b6 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -9077,9 +9077,6 @@ void CLASS adobe_coeff (const char *make, const char *model) if (RT_blacklevel_from_constant == ThreeValBool::X || is_pentax_dng) { RT_blacklevel_from_constant = ThreeValBool::T; } - if (RT_matrix_from_constant == ThreeValBool::X) { - RT_matrix_from_constant = ThreeValBool::T; - } // -- RT -------------------------------------------------------------------- for (i=0; i < sizeof table / sizeof *table; i++) @@ -9097,6 +9094,9 @@ void CLASS adobe_coeff (const char *make, const char *model) black <<= 2; tiff_bps += 2; } + if (RT_matrix_from_constant == ThreeValBool::X) { + RT_matrix_from_constant = ThreeValBool::T; + } { /* Check for RawTherapee table overrides and extensions */ int black_level, white_level; short trans[12]; @@ -10541,7 +10541,7 @@ dng_skip: * files. See #4129 */) { memcpy (rgb_cam, cmatrix, sizeof cmatrix); // raw_color = 0; - RT_matrix_from_constant = ThreeValBool::F; + RT_matrix_from_constant = ThreeValBool::X; } if(!strncmp(make, "Panasonic", 9) && !strncmp(model, "DMC-LX100",9)) adobe_coeff (make, model); From 4e03c3e4b0813c7123d22d0fc572d26d30118a3a Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 11 Mar 2020 13:49:42 +0100 Subject: [PATCH 028/109] raw crop for FUJIFILM X-T4 --- rtengine/camconst.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index e97d1635c..150d5d455 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1383,6 +1383,11 @@ Camera constants: "raw_crop": [ 0, 5, 6252, 4176] }, + { // Quality C, only raw crop + "make_model": [ "FUJIFILM X-T4" ], + "raw_crop": [ 0, 5, 6252, 4140] + }, + { // Quality B "make_model": "FUJIFILM X30", "dcraw_matrix": [ 12328,-5256,-1144,-4469,12927,1675,-87,1291,4351 ], // DNG_v8.7 D65 From 5bf4da1a84c33c85c5a26041315d58568ed8ff6a Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 15 Mar 2020 12:40:35 +0100 Subject: [PATCH 029/109] raw crop for FUJIFILM X100V --- rtengine/camconst.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 150d5d455..44e01ea99 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1295,6 +1295,11 @@ Camera constants: "ranges": { "white": 16100 } }, + { // Quality C + "make_model": [ "FUJIFILM X100V" ], + "raw_crop": [ 0, 5, 6252, 4140 ] + }, + { // Quality C "make_model": "Fujifilm X10", "ranges": { "white": 3788 } From b1901997a794799bda406fea385fd3d9442b16ae Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 15 Mar 2020 17:50:03 +0100 Subject: [PATCH 030/109] Fix wrong white level scaling on 14-bit Panasonic RW2 files --- rtengine/dcraw.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 8085e12b6..b8d5b9895 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -9093,6 +9093,8 @@ void CLASS adobe_coeff (const char *make, const char *model) if (load_raw == &CLASS sony_arw2_load_raw) { // RT: arw2 scale fix black <<= 2; tiff_bps += 2; + } else if (load_raw == &CLASS panasonic_load_raw) { + tiff_bps = RT_pana_info.bpp; } if (RT_matrix_from_constant == ThreeValBool::X) { RT_matrix_from_constant = ThreeValBool::T; From 97b8918d5c2cd4755efbbe09f4b7642f13f417d3 Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 16 Mar 2020 15:48:38 +0100 Subject: [PATCH 031/109] =?UTF-8?q?Added=20standard=20observer=2010=C2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rtengine/colortemp.cc | 100 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index 4d5cb42f2..0f85feba0 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -69,6 +69,106 @@ static const double cie_colour_match_jd[97][3] = {//350nm to 830nm 5 nm J.Desm {0.000001251141, 0.00000045181, 0.000000} }; + +static const double cie_colour_match_jd10[97][3] = {//350nm to 830nm 5 nm J.Desmis 10° Standard Observer. +{0.000000000000, 0.000000000000, 0.000000000000}, +{0.000000000000, 0.000000000000, 0.000000000000}, +{0.000000122200, 0.000000013398, 0.000000535027}, +{0.000000919270, 0.000000100650, 0.000004028300}, +{0.000005958600, 0.000000651100, 0.000026143700}, +{0.000033266000, 0.000003625000, 0.000146220000}, +{0.000159952000, 0.000017364000, 0.000704776000}, +{0.000662440000, 0.000071560000, 0.002927800000}, +{0.002361600000, 0.000253400000, 0.010482200000}, +{0.007242300000, 0.000768500000, 0.032344000000}, +{0.019109700000, 0.002004400000, 0.086010900000}, +{0.043400000000, 0.004509000000, 0.197120000000}, +{0.084736000000, 0.008756000000, 0.389366000000}, +{0.140638000000, 0.014456000000, 0.656760000000}, +{0.204492000000, 0.021391000000, 0.972542000000}, +{0.264737000000, 0.029497000000, 1.282500000000}, +{0.314679000000, 0.038676000000, 1.553480000000}, +{0.357719000000, 0.049602000000, 1.798500000000}, +{0.383734000000, 0.062077000000, 1.967280000000}, +{0.386726000000, 0.074704000000, 2.027300000000}, +{0.370702000000, 0.089456000000, 1.994800000000}, +{0.342957000000, 0.106256000000, 1.900700000000}, +{0.302273000000, 0.128201000000, 1.745370000000}, +{0.254085000000, 0.152761000000, 1.554900000000}, +{0.195618000000, 0.185190000000, 1.317560000000}, +{0.132349000000, 0.219940000000, 1.030200000000}, +{0.080507000000, 0.253589000000, 0.772125000000}, +{0.041072000000, 0.297665000000, 0.570060000000}, +{0.016172000000, 0.339133000000, 0.415254000000}, +{0.005132000000, 0.395379000000, 0.302356000000}, +{0.003816000000, 0.460777000000, 0.218502000000}, +{0.015444000000, 0.531360000000, 0.159249000000}, +{0.037465000000, 0.606741000000, 0.112044000000}, +{0.071358000000, 0.685660000000, 0.082248000000}, +{0.117749000000, 0.761757000000, 0.060709000000}, +{0.172953000000, 0.823330000000, 0.043050000000}, +{0.236491000000, 0.875211000000, 0.030451000000}, +{0.304213000000, 0.923810000000, 0.020584000000}, +{0.376772000000, 0.961988000000, 0.013676000000}, +{0.451584000000, 0.982200000000, 0.007918000000}, +{0.529826000000, 0.991761000000, 0.003988000000}, +{0.616053000000, 0.999110000000, 0.001091000000}, +{0.793832000000, 0.982380000000, 0.000000000000}, +{0.878655000000, 0.955552000000, 0.000000000000}, +{0.951162000000, 0.915175000000, 0.000000000000}, +{1.014160000000, 0.868934000000, 0.000000000000}, +{1.074300000000, 0.825623000000, 0.000000000000}, +{1.118520000000, 0.777405000000, 0.000000000000}, +{1.134300000000, 0.720353000000, 0.000000000000}, +{1.123990000000, 0.658341000000, 0.000000000000}, +{1.089100000000, 0.593878000000, 0.000000000000}, +{1.030480000000, 0.527963000000, 0.000000000000}, +{0.950740000000, 0.461834000000, 0.000000000000}, +{0.856297000000, 0.398057000000, 0.000000000000}, +{0.754930000000, 0.339554000000, 0.000000000000}, +{0.647467000000, 0.283493000000, 0.000000000000}, +{0.535110000000, 0.228254000000, 0.000000000000}, +{0.431567000000, 0.179828000000, 0.000000000000}, +{0.343690000000, 0.140211000000, 0.000000000000}, +{0.268329000000, 0.107633000000, 0.000000000000}, +{0.204300000000, 0.081187000000, 0.000000000000}, +{0.152568000000, 0.060281000000, 0.000000000000}, +{0.112210000000, 0.044096000000, 0.000000000000}, +{0.081260600000, 0.031800400000, 0.000000000000}, +{0.057930000000, 0.022601700000, 0.000000000000}, +{0.040850800000, 0.015905100000, 0.000000000000}, +{0.028623000000, 0.011130300000, 0.000000000000}, +{0.019941300000, 0.007748800000, 0.000000000000}, +{0.013842000000, 0.005375100000, 0.000000000000}, +{0.009576880000, 0.003717740000, 0.000000000000}, +{0.006605200000, 0.002564560000, 0.000000000000}, +{0.004552630000, 0.001768470000, 0.000000000000}, +{0.003144700000, 0.001222390000, 0.000000000000}, +{0.002174960000, 0.000846190000, 0.000000000000}, +{0.001505700000, 0.000586440000, 0.000000000000}, +{0.001044760000, 0.000407410000, 0.000000000000}, +{0.000727450000, 0.000284041000, 0.000000000000}, +{0.000508258000, 0.000198730000, 0.000000000000}, +{0.000356380000, 0.000139550000, 0.000000000000}, +{0.000250969000, 0.000098428000, 0.000000000000}, +{0.000177730000, 0.000069819000, 0.000000000000}, +{0.000126390000, 0.000049737000, 0.000000000000}, +{0.000090151000, 0.000035540500, 0.000000000000}, +{0.000064525800, 0.000025486000, 0.000000000000}, +{0.000046339000, 0.000018338400, 0.000000000000}, +{0.000033411700, 0.000013249000, 0.000000000000}, +{0.000024209000, 0.000009619600, 0.000000000000}, +{0.000017611500, 0.000007012800, 0.000000000000}, +{0.000012855000, 0.000005129800, 0.000000000000}, +{0.000009413630, 0.000003764730, 0.000000000000}, +{0.000006913000, 0.000002770810, 0.000000000000}, +{0.000005093470, 0.000002046130, 0.000000000000}, +{0.000003767100, 0.000001516770, 0.000000000000}, +{0.000002795310, 0.000001128090, 0.000000000000}, +{0.000002082000, 0.000000842160, 0.000000000000}, +{0.000001553140, 0.000000629700, 0.000000000000} +}; + ColorTemp::ColorTemp (double t, double g, double e, const std::string &m) : temp(t), green(g), equal(e), method(m) { clip (temp, green, equal); From 8a972bef9ef8760e8045ebee95f78ec0706d50c5 Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 16 Mar 2020 17:58:35 +0100 Subject: [PATCH 032/109] Itcwb - Use standard observer 10 by default - create option itcwb_stdobserver10 --- rtengine/colortemp.cc | 22 ++++++++++++++++++++-- rtengine/rawimagesource.cc | 3 ++- rtengine/settings.h | 3 ++- rtgui/options.cc | 8 +++++++- 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index 0f85feba0..5061e9021 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -33,7 +33,7 @@ namespace rtengine { -static const double cie_colour_match_jd[97][3] = {//350nm to 830nm 5 nm J.Desmis 2° Standard Observer. +static const double cie_colour_match_jd2[97][3] = {//350nm to 830nm 5 nm J.Desmis 2° Standard Observer. {0.0000000, 0.000000, 0.000000}, {0.0000000, 0.000000, 0.000000}, {0.0001299, 0.0003917, 0.0006061}, {0.0002321, 0.000006965, 0.001086}, {0.0004149, 0.00001239, 0.001946}, {0.0007416, 0.00002202, 0.003846}, {0.001368, 0.000039, 0.006450001}, {0.002236, 0.000064, 0.01054999}, {0.004243, 0.000120, 0.02005001}, @@ -70,7 +70,7 @@ static const double cie_colour_match_jd[97][3] = {//350nm to 830nm 5 nm J.Desm }; -static const double cie_colour_match_jd10[97][3] = {//350nm to 830nm 5 nm J.Desmis 10° Standard Observer. +static double cie_colour_match_jd[97][3] = {//350nm to 830nm 5 nm J.Desmis 10° Standard Observer. {0.000000000000, 0.000000000000, 0.000000000000}, {0.000000000000, 0.000000000000, 0.000000000000}, {0.000000122200, 0.000000013398, 0.000000535027}, @@ -169,6 +169,8 @@ static const double cie_colour_match_jd10[97][3] = {//350nm to 830nm 5 nm J.De {0.000001553140, 0.000000629700, 0.000000000000} }; + + ColorTemp::ColorTemp (double t, double g, double e, const std::string &m) : temp(t), green(g), equal(e), method(m) { clip (temp, green, equal); @@ -3757,6 +3759,22 @@ void ColorTemp::tempxy(bool separated, int repref, float **Tx, float **Ty, float Refxyz[i].Zref = 0.f; } + if (settings->verbose) { + if (settings->itcwb_stdobserver10 == false) { + printf("Use standard observer 2°\n"); + } else { + printf("Use standard observer 10°\n"); + } + } + + if (settings->itcwb_stdobserver10 == false) { + for (int i = 0; i < 97; i++) { + cie_colour_match_jd[i][0] = cie_colour_match_jd2[i][0]; + cie_colour_match_jd[i][1] = cie_colour_match_jd2[i][1];; + cie_colour_match_jd[i][2] = cie_colour_match_jd2[i][2]; + } + } + if (separated) { const double tempw = Txyz[repref].Tem; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index f08609f5e..392c81de1 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -4459,7 +4459,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double You can used it in images :flowers, landscape, portrait, skin, where illuminants are "normal" (daylight, blackbody) You must avoid when illuminant is non standard (fluorescent, LED...) and also, when the subject is lost in the image (some target to generate profiles). - You can change 4 parameters in option.cc + You can change parameters in option.cc Itcwb_thres : 34 by default ==> number of color used in final algorithm - between 10 and max 55 Itcwb_sort : false by default, can improve algorithm if true, ==> sort value in something near chroma order, instead of histogram number Itcwb_greenrange : 0 amplitude of green variation - between 0 to 2 @@ -4467,6 +4467,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double Itcwb_forceextra : false - if true force algorithm "extra" ("extra" is used when camera wbsettings are wrong) to all images Itcwb_sizereference : 3 by default, can be set to 5 ==> size of reference color compare to size of histogram real color itcwb_delta : 1 by default can be set between 0 to 5 ==> delta temp to build histogram xy - if camera temp is not probably good + itcwb_stdobserver10 : true by default - use standard observer 10°, false = standard observer 2° */ // BENCHFUN diff --git a/rtengine/settings.h b/rtengine/settings.h index 38e66c8ac..4d3131695 100644 --- a/rtengine/settings.h +++ b/rtengine/settings.h @@ -7,8 +7,8 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * * RawTherapee is distributed in the hope that it will be useful, +itcw * * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -88,6 +88,7 @@ public: bool itcwb_forceextra; int itcwb_sizereference; int itcwb_delta; + bool itcwb_stdobserver10; enum class ThumbnailInspectorMode { diff --git a/rtgui/options.cc b/rtgui/options.cc index 3cf0a9497..4a21fd8c0 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -597,7 +597,8 @@ void Options::setDefaults() rtSettings.itcwb_forceextra = true; rtSettings.itcwb_sizereference = 3;//between 1 and 5 rtSettings.itcwb_delta = 1;//between 0 and 5 - + rtSettings.itcwb_stdobserver10 = true; + rtSettings.protectred = 60; rtSettings.protectredh = 0.3; rtSettings.CRI_color = 0; @@ -1513,6 +1514,10 @@ void Options::readFromFile(Glib::ustring fname) rtSettings.itcwb_forceextra = keyFile.get_boolean("Color Management", "Itcwb_forceextra"); } + if (keyFile.has_key("Color Management", "Itcwb_stdobserver10")) { + rtSettings.itcwb_stdobserver10 = keyFile.get_boolean("Color Management", "Itcwb_stdobserver10"); + } + if (keyFile.has_key("Color Management", "Itcwb_greenrange")) { rtSettings.itcwb_greenrange = keyFile.get_integer("Color Management", "Itcwb_greenrange"); } @@ -2201,6 +2206,7 @@ void Options::saveToFile(Glib::ustring fname) keyFile.set_boolean("Color Management", "Itcwb_forceextra", rtSettings.itcwb_forceextra); keyFile.set_integer("Color Management", "Itcwb_sizereference", rtSettings.itcwb_sizereference); keyFile.set_integer("Color Management", "Itcwb_delta", rtSettings.itcwb_delta); + keyFile.set_boolean("Color Management", "Itcwb_stdobserver10", rtSettings.itcwb_stdobserver10); //keyFile.set_double ("Color Management", "Colortoningab", rtSettings.colortoningab); //keyFile.set_double ("Color Management", "Decaction", rtSettings.decaction); From d285dbade50f82bd9123a72e2a419f2ccfabbfe6 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 17 Mar 2020 09:24:52 +0100 Subject: [PATCH 033/109] Suppress tabulations in cie_colour_match_jd --- rtengine/colortemp.cc | 192 +++++++++++++++++++++--------------------- 1 file changed, 96 insertions(+), 96 deletions(-) diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index 5061e9021..585f02d20 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -71,102 +71,102 @@ static const double cie_colour_match_jd2[97][3] = {//350nm to 830nm 5 nm J.Des static double cie_colour_match_jd[97][3] = {//350nm to 830nm 5 nm J.Desmis 10° Standard Observer. -{0.000000000000, 0.000000000000, 0.000000000000}, -{0.000000000000, 0.000000000000, 0.000000000000}, -{0.000000122200, 0.000000013398, 0.000000535027}, -{0.000000919270, 0.000000100650, 0.000004028300}, -{0.000005958600, 0.000000651100, 0.000026143700}, -{0.000033266000, 0.000003625000, 0.000146220000}, -{0.000159952000, 0.000017364000, 0.000704776000}, -{0.000662440000, 0.000071560000, 0.002927800000}, -{0.002361600000, 0.000253400000, 0.010482200000}, -{0.007242300000, 0.000768500000, 0.032344000000}, -{0.019109700000, 0.002004400000, 0.086010900000}, -{0.043400000000, 0.004509000000, 0.197120000000}, -{0.084736000000, 0.008756000000, 0.389366000000}, -{0.140638000000, 0.014456000000, 0.656760000000}, -{0.204492000000, 0.021391000000, 0.972542000000}, -{0.264737000000, 0.029497000000, 1.282500000000}, -{0.314679000000, 0.038676000000, 1.553480000000}, -{0.357719000000, 0.049602000000, 1.798500000000}, -{0.383734000000, 0.062077000000, 1.967280000000}, -{0.386726000000, 0.074704000000, 2.027300000000}, -{0.370702000000, 0.089456000000, 1.994800000000}, -{0.342957000000, 0.106256000000, 1.900700000000}, -{0.302273000000, 0.128201000000, 1.745370000000}, -{0.254085000000, 0.152761000000, 1.554900000000}, -{0.195618000000, 0.185190000000, 1.317560000000}, -{0.132349000000, 0.219940000000, 1.030200000000}, -{0.080507000000, 0.253589000000, 0.772125000000}, -{0.041072000000, 0.297665000000, 0.570060000000}, -{0.016172000000, 0.339133000000, 0.415254000000}, -{0.005132000000, 0.395379000000, 0.302356000000}, -{0.003816000000, 0.460777000000, 0.218502000000}, -{0.015444000000, 0.531360000000, 0.159249000000}, -{0.037465000000, 0.606741000000, 0.112044000000}, -{0.071358000000, 0.685660000000, 0.082248000000}, -{0.117749000000, 0.761757000000, 0.060709000000}, -{0.172953000000, 0.823330000000, 0.043050000000}, -{0.236491000000, 0.875211000000, 0.030451000000}, -{0.304213000000, 0.923810000000, 0.020584000000}, -{0.376772000000, 0.961988000000, 0.013676000000}, -{0.451584000000, 0.982200000000, 0.007918000000}, -{0.529826000000, 0.991761000000, 0.003988000000}, -{0.616053000000, 0.999110000000, 0.001091000000}, -{0.793832000000, 0.982380000000, 0.000000000000}, -{0.878655000000, 0.955552000000, 0.000000000000}, -{0.951162000000, 0.915175000000, 0.000000000000}, -{1.014160000000, 0.868934000000, 0.000000000000}, -{1.074300000000, 0.825623000000, 0.000000000000}, -{1.118520000000, 0.777405000000, 0.000000000000}, -{1.134300000000, 0.720353000000, 0.000000000000}, -{1.123990000000, 0.658341000000, 0.000000000000}, -{1.089100000000, 0.593878000000, 0.000000000000}, -{1.030480000000, 0.527963000000, 0.000000000000}, -{0.950740000000, 0.461834000000, 0.000000000000}, -{0.856297000000, 0.398057000000, 0.000000000000}, -{0.754930000000, 0.339554000000, 0.000000000000}, -{0.647467000000, 0.283493000000, 0.000000000000}, -{0.535110000000, 0.228254000000, 0.000000000000}, -{0.431567000000, 0.179828000000, 0.000000000000}, -{0.343690000000, 0.140211000000, 0.000000000000}, -{0.268329000000, 0.107633000000, 0.000000000000}, -{0.204300000000, 0.081187000000, 0.000000000000}, -{0.152568000000, 0.060281000000, 0.000000000000}, -{0.112210000000, 0.044096000000, 0.000000000000}, -{0.081260600000, 0.031800400000, 0.000000000000}, -{0.057930000000, 0.022601700000, 0.000000000000}, -{0.040850800000, 0.015905100000, 0.000000000000}, -{0.028623000000, 0.011130300000, 0.000000000000}, -{0.019941300000, 0.007748800000, 0.000000000000}, -{0.013842000000, 0.005375100000, 0.000000000000}, -{0.009576880000, 0.003717740000, 0.000000000000}, -{0.006605200000, 0.002564560000, 0.000000000000}, -{0.004552630000, 0.001768470000, 0.000000000000}, -{0.003144700000, 0.001222390000, 0.000000000000}, -{0.002174960000, 0.000846190000, 0.000000000000}, -{0.001505700000, 0.000586440000, 0.000000000000}, -{0.001044760000, 0.000407410000, 0.000000000000}, -{0.000727450000, 0.000284041000, 0.000000000000}, -{0.000508258000, 0.000198730000, 0.000000000000}, -{0.000356380000, 0.000139550000, 0.000000000000}, -{0.000250969000, 0.000098428000, 0.000000000000}, -{0.000177730000, 0.000069819000, 0.000000000000}, -{0.000126390000, 0.000049737000, 0.000000000000}, -{0.000090151000, 0.000035540500, 0.000000000000}, -{0.000064525800, 0.000025486000, 0.000000000000}, -{0.000046339000, 0.000018338400, 0.000000000000}, -{0.000033411700, 0.000013249000, 0.000000000000}, -{0.000024209000, 0.000009619600, 0.000000000000}, -{0.000017611500, 0.000007012800, 0.000000000000}, -{0.000012855000, 0.000005129800, 0.000000000000}, -{0.000009413630, 0.000003764730, 0.000000000000}, -{0.000006913000, 0.000002770810, 0.000000000000}, -{0.000005093470, 0.000002046130, 0.000000000000}, -{0.000003767100, 0.000001516770, 0.000000000000}, -{0.000002795310, 0.000001128090, 0.000000000000}, -{0.000002082000, 0.000000842160, 0.000000000000}, -{0.000001553140, 0.000000629700, 0.000000000000} +{0.000000000000, 0.000000000000, 0.000000000000}, +{0.000000000000, 0.000000000000, 0.000000000000}, +{0.000000122200, 0.000000013398, 0.000000535027}, +{0.000000919270, 0.000000100650, 0.000004028300}, +{0.000005958600, 0.000000651100, 0.000026143700}, +{0.000033266000, 0.000003625000, 0.000146220000}, +{0.000159952000, 0.000017364000, 0.000704776000}, +{0.000662440000, 0.000071560000, 0.002927800000}, +{0.002361600000, 0.000253400000, 0.010482200000}, +{0.007242300000, 0.000768500000, 0.032344000000}, +{0.019109700000, 0.002004400000, 0.086010900000}, +{0.043400000000, 0.004509000000, 0.197120000000}, +{0.084736000000, 0.008756000000, 0.389366000000}, +{0.140638000000, 0.014456000000, 0.656760000000}, +{0.204492000000, 0.021391000000, 0.972542000000}, +{0.264737000000, 0.029497000000, 1.282500000000}, +{0.314679000000, 0.038676000000, 1.553480000000}, +{0.357719000000, 0.049602000000, 1.798500000000}, +{0.383734000000, 0.062077000000, 1.967280000000}, +{0.386726000000, 0.074704000000, 2.027300000000}, +{0.370702000000, 0.089456000000, 1.994800000000}, +{0.342957000000, 0.106256000000, 1.900700000000}, +{0.302273000000, 0.128201000000, 1.745370000000}, +{0.254085000000, 0.152761000000, 1.554900000000}, +{0.195618000000, 0.185190000000, 1.317560000000}, +{0.132349000000, 0.219940000000, 1.030200000000}, +{0.080507000000, 0.253589000000, 0.772125000000}, +{0.041072000000, 0.297665000000, 0.570060000000}, +{0.016172000000, 0.339133000000, 0.415254000000}, +{0.005132000000, 0.395379000000, 0.302356000000}, +{0.003816000000, 0.460777000000, 0.218502000000}, +{0.015444000000, 0.531360000000, 0.159249000000}, +{0.037465000000, 0.606741000000, 0.112044000000}, +{0.071358000000, 0.685660000000, 0.082248000000}, +{0.117749000000, 0.761757000000, 0.060709000000}, +{0.172953000000, 0.823330000000, 0.043050000000}, +{0.236491000000, 0.875211000000, 0.030451000000}, +{0.304213000000, 0.923810000000, 0.020584000000}, +{0.376772000000, 0.961988000000, 0.013676000000}, +{0.451584000000, 0.982200000000, 0.007918000000}, +{0.529826000000, 0.991761000000, 0.003988000000}, +{0.616053000000, 0.999110000000, 0.001091000000}, +{0.793832000000, 0.982380000000, 0.000000000000}, +{0.878655000000, 0.955552000000, 0.000000000000}, +{0.951162000000, 0.915175000000, 0.000000000000}, +{1.014160000000, 0.868934000000, 0.000000000000}, +{1.074300000000, 0.825623000000, 0.000000000000}, +{1.118520000000, 0.777405000000, 0.000000000000}, +{1.134300000000, 0.720353000000, 0.000000000000}, +{1.123990000000, 0.658341000000, 0.000000000000}, +{1.089100000000, 0.593878000000, 0.000000000000}, +{1.030480000000, 0.527963000000, 0.000000000000}, +{0.950740000000, 0.461834000000, 0.000000000000}, +{0.856297000000, 0.398057000000, 0.000000000000}, +{0.754930000000, 0.339554000000, 0.000000000000}, +{0.647467000000, 0.283493000000, 0.000000000000}, +{0.535110000000, 0.228254000000, 0.000000000000}, +{0.431567000000, 0.179828000000, 0.000000000000}, +{0.343690000000, 0.140211000000, 0.000000000000}, +{0.268329000000, 0.107633000000, 0.000000000000}, +{0.204300000000, 0.081187000000, 0.000000000000}, +{0.152568000000, 0.060281000000, 0.000000000000}, +{0.112210000000, 0.044096000000, 0.000000000000}, +{0.081260600000, 0.031800400000, 0.000000000000}, +{0.057930000000, 0.022601700000, 0.000000000000}, +{0.040850800000, 0.015905100000, 0.000000000000}, +{0.028623000000, 0.011130300000, 0.000000000000}, +{0.019941300000, 0.007748800000, 0.000000000000}, +{0.013842000000, 0.005375100000, 0.000000000000}, +{0.009576880000, 0.003717740000, 0.000000000000}, +{0.006605200000, 0.002564560000, 0.000000000000}, +{0.004552630000, 0.001768470000, 0.000000000000}, +{0.003144700000, 0.001222390000, 0.000000000000}, +{0.002174960000, 0.000846190000, 0.000000000000}, +{0.001505700000, 0.000586440000, 0.000000000000}, +{0.001044760000, 0.000407410000, 0.000000000000}, +{0.000727450000, 0.000284041000, 0.000000000000}, +{0.000508258000, 0.000198730000, 0.000000000000}, +{0.000356380000, 0.000139550000, 0.000000000000}, +{0.000250969000, 0.000098428000, 0.000000000000}, +{0.000177730000, 0.000069819000, 0.000000000000}, +{0.000126390000, 0.000049737000, 0.000000000000}, +{0.000090151000, 0.000035540500, 0.000000000000}, +{0.000064525800, 0.000025486000, 0.000000000000}, +{0.000046339000, 0.000018338400, 0.000000000000}, +{0.000033411700, 0.000013249000, 0.000000000000}, +{0.000024209000, 0.000009619600, 0.000000000000}, +{0.000017611500, 0.000007012800, 0.000000000000}, +{0.000012855000, 0.000005129800, 0.000000000000}, +{0.000009413630, 0.000003764730, 0.000000000000}, +{0.000006913000, 0.000002770810, 0.000000000000}, +{0.000005093470, 0.000002046130, 0.000000000000}, +{0.000003767100, 0.000001516770, 0.000000000000}, +{0.000002795310, 0.000001128090, 0.000000000000}, +{0.000002082000, 0.000000842160, 0.000000000000}, +{0.000001553140, 0.000000629700, 0.000000000000} }; From a45823995a62a39761ed1fd280320706cdd06ec8 Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 18 Mar 2020 09:00:26 +0100 Subject: [PATCH 034/109] Itcwb increases precision in color sampling 5 instead of 9 - option itcwb_precis --- rtengine/rawimagesource.cc | 30 ++++++++++++++++++++++++------ rtengine/settings.h | 1 + rtgui/options.cc | 7 ++++++- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 392c81de1..232747439 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -5322,8 +5322,17 @@ void RawImageSource::getrgbloc(int begx, int begy, int yEn, int xEn, int cx, int { // BENCHFUN //used by auto WB local to calculate red, green, blue in local region - const int bfw = W / 9 + ((W % 9) > 0 ? 1 : 0);//10 arbitrary value ; perhaps 4 or 5 or 20 - const int bfh = H / 9 + ((H % 9) > 0 ? 1 : 0); + int precision = 5; + if (settings->itcwb_precis == 5) { + precision = 5; + } else if (settings->itcwb_precis < 5) { + precision = 3; + } else if (settings->itcwb_precis > 5) { + precision = 9; + } + + const int bfw = W / precision + ((W % precision) > 0 ? 1 : 0);// 5 arbitrary value can be change to 3 or 9 ; + const int bfh = H / precision + ((H % precision) > 0 ? 1 : 0); if (! greenloc) { greenloc(bfw, bfh); @@ -5373,9 +5382,9 @@ void RawImageSource::getrgbloc(int begx, int begy, int yEn, int xEn, int cx, int #pragma omp parallel for #endif for (int i = 0; i < bfh; ++i) { - const int ii = i * 9; + const int ii = i * precision; if (ii < H) { - for (int j = 0, jj = 0; j < bfw; ++j, jj += 9) { + for (int j = 0, jj = 0; j < bfw; ++j, jj += precision) { redloc[i][j] = red[ii][jj] * multip; greenloc[i][j] = green[ii][jj] * multip; blueloc[i][j] = blue[ii][jj] * multip; @@ -5575,8 +5584,17 @@ void RawImageSource::getAutoWBMultipliersitc(double & tempref, double & greenref if (wbpar.method == "autitcgreen") { bool twotimes = false; - const int bfw = W / 9 + ((W % 9) > 0 ? 1 : 0);// 10 arbitrary value ; perhaps 4 or 5 or 20 - const int bfh = H / 9 + ((H % 9) > 0 ? 1 : 0); + int precision = 5; + if (settings->itcwb_precis == 5) { + precision = 5; + } else if (settings->itcwb_precis < 5) { + precision = 3; + } else if (settings->itcwb_precis > 5) { + precision = 9; + } + + const int bfw = W / precision + ((W % precision) > 0 ? 1 : 0);// 5 arbitrary value can be change to 3 or 9 ; + const int bfh = H / precision + ((H % precision) > 0 ? 1 : 0); WBauto(tempref, greenref, redloc, greenloc, blueloc, bfw, bfh, avg_rm, avg_gm, avg_bm, tempitc, greenitc, studgood, twotimes, wbpar, begx, begy, yEn, xEn, cx, cy, cmp, raw); } diff --git a/rtengine/settings.h b/rtengine/settings.h index 4d3131695..529336cbc 100644 --- a/rtengine/settings.h +++ b/rtengine/settings.h @@ -89,6 +89,7 @@ public: int itcwb_sizereference; int itcwb_delta; bool itcwb_stdobserver10; + int itcwb_precis; enum class ThumbnailInspectorMode { diff --git a/rtgui/options.cc b/rtgui/options.cc index 4a21fd8c0..7ae6c24aa 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -598,7 +598,8 @@ void Options::setDefaults() rtSettings.itcwb_sizereference = 3;//between 1 and 5 rtSettings.itcwb_delta = 1;//between 0 and 5 rtSettings.itcwb_stdobserver10 = true; - + rtSettings.itcwb_precis = 5;//3 or 5 or 9 + rtSettings.protectred = 60; rtSettings.protectredh = 0.3; rtSettings.CRI_color = 0; @@ -1534,6 +1535,9 @@ void Options::readFromFile(Glib::ustring fname) rtSettings.itcwb_delta = keyFile.get_integer("Color Management", "Itcwb_delta"); } + if (keyFile.has_key("Color Management", "Itcwb_precis")) { + rtSettings.itcwb_precis = keyFile.get_integer("Color Management", "Itcwb_precis"); + } //if (keyFile.has_key ("Color Management", "Colortoningab")) rtSettings.colortoningab = keyFile.get_double("Color Management", "Colortoningab"); //if (keyFile.has_key ("Color Management", "Decaction")) rtSettings.decaction = keyFile.get_double("Color Management", "Decaction"); @@ -2207,6 +2211,7 @@ void Options::saveToFile(Glib::ustring fname) keyFile.set_integer("Color Management", "Itcwb_sizereference", rtSettings.itcwb_sizereference); keyFile.set_integer("Color Management", "Itcwb_delta", rtSettings.itcwb_delta); keyFile.set_boolean("Color Management", "Itcwb_stdobserver10", rtSettings.itcwb_stdobserver10); + keyFile.set_integer("Color Management", "Itcwb_precis", rtSettings.itcwb_precis); //keyFile.set_double ("Color Management", "Colortoningab", rtSettings.colortoningab); //keyFile.set_double ("Color Management", "Decaction", rtSettings.decaction); From fe17a7add2c6ec1c44e8fbbbf6dfa4fc54dfdb65 Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 18 Mar 2020 09:37:34 +0100 Subject: [PATCH 035/109] Improve comment code algorithm Itcwb --- rtengine/colortemp.cc | 4 +++- rtengine/rawimagesource.cc | 32 ++++++++++++-------------------- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index 585f02d20..2780fcc84 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -3391,6 +3391,7 @@ this values are often called xBar yBar zBar and are characteristics of a color / values cie_colour_match[][3] = 2° Standard Observer x2, y2, z2 E.g. for 380nm: x2=0.001368 y2=0.000039 z2=0.006451 round in J.Walker to 0.0014 0.0000 0.0065 above I have increase precision used by J.Walker and pass to 350nm to 830nm +And also add 10° standard observer */ void ColorTemp::spectrum_to_xyz_daylight(double _m1, double _m2, double &x, double &y, double &z) @@ -3449,6 +3450,7 @@ void ColorTemp::spectrum_to_xyz_preset(const double* spec_intens, double &x, dou values cie_colour_match[][3] = 2° Standard Observer x2, y2, z2 E.g. for 380nm: x2=0.001368 y2=0.000039 z2=0.006451 round in J.Walker to 0.0014 0.0000 0.0065 above I have increased the precision used by J.Walker and pass from 350nm to 830nm + And also add standard observer 10° */ for (i = 0, lambda = 350.; lambda < 830.1; i++, lambda += 5.) { double Me = get_spectral_color(lambda, spec_intens); @@ -3623,7 +3625,7 @@ void ColorTemp::tempxy(bool separated, int repref, float **Tx, float **Ty, float double ZZ; } WbTxyz; //probbaly can be "passed" with rawimagesource.cc but I don't know how to do. - constexpr WbTxyz Txyz[118] = {//temperature Xwb Zwb 118 values x wb and y wb are calculated after + constexpr WbTxyz Txyz[118] = {//temperature Xwb Zwb 118 values - same table as in Rawimagesource.cc x wb and y wb are calculated after {2001., 1.273842, 0.145295}, {2101., 1.244008, 0.167533}, {2201., 1.217338, 0.190697}, diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 232747439..75088a07c 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -4412,12 +4412,13 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double Copyright (c) Jacques Desmis 6 - 2018 jdesmis@gmail.com Copyright (c) Ingo Weyrich 3 - 2020 (heckflosse67@gmx.de) - This algorithm try to find temperature correlation between 20 to 201 color between 200 spectral color and about 20 to 55 color found in the image, I just found the idea in the web "correlate with chroma" instead of RGB grey point,but I don't use any algo found on the web. + This algorithm try to find temperature correlation between 20 to 201 color between 201 spectral color and about 20 to 55 color found in the image between 192, I just found the idea in the web "correlate with chroma" instead of RGB grey point,but I don't use any algo found on the web. I have test many many algorithms to find the first one that work :) Probably (sure) there are improvement to do... - I have create a table temperature with temp and white point with 100 values between 2000K and 12000K we can obviously change these values, more...with different steps + I have create a table temperature with temp and white point with 118 values between 2000K and 12000K we can obviously change these values, more...with different steps + I have create a table for tint (green)with 134 values between 0.4 to 4. I have create or recuparate and transformed 201 spectral colors from Colorchecker24, others color and my 468 colors target, or from web flowers, etc. with a step of 5nm, I think it is large enough. I think this value of 201 is now complete: I tested correlation with 60, 90, 100, 120, 155...better student increase with number of color, but now it seems stabilized Of course we can increase this number :) @@ -4425,8 +4426,8 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double 1) for the current raw file we create a table for each temp of RGB multipliers 2) then, I choose the "camera temp" to initialize calculation (why not) 3) for this temp, I calculated XYZ values for the 201 spectral datas - 4) then I create for the image an "histogram", but for xyY (Cie 1931 color space) - 5) for each pixel (in fact to accelerate only 1/10 for and 1/10 for y), I determine for each couple xy, the number of occurences + 4) then I create for the image an "histogram", but for xyY (CIE 1931 color space or CIE 1964 (default)) + 5) for each pixel (in fact to accelerate only 1/5 for and 1/5 for y), I determine for each couple xy, the number of occurences, can be change by Itcwb_precis to 3 or 9 6) I sort this result in ascending order 7) in option we can sort in another manner to take into account chroma : chromax = x - white point x, chromay = y - white point y 8) then I compare this result, with spectral datas found above in 3) with deltaE (limited to chroma) @@ -4445,10 +4446,9 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double 20) between these green limits, we make slightly vary temp (settings in options) and recalculated RGB multipliers 21) with this multipliers for the RGB color find in histogram we recalculate xyY 22) we re-adjust references color for these xyY from 20) - 23) we add if chroma image is very low, k colors to degrad correlation - 24) then find all Student correlation for each couple green / temp - 25) sort these Student values, and choose the minimum - 26) then for the 3 better couple "temp / green" choose the one where green is nearest from 1. + 23) then find all Student correlation for each couple green / temp + 24) sort these Student values, and choose the minimum + 25) then for the 3 better couple "temp / green" choose the one where green is nearest from 1. Some variables or function are not used, keep in case of I have test with cat02 but result are not stable enough ! why ??, therefore cat02 neutralized @@ -4468,6 +4468,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double Itcwb_sizereference : 3 by default, can be set to 5 ==> size of reference color compare to size of histogram real color itcwb_delta : 1 by default can be set between 0 to 5 ==> delta temp to build histogram xy - if camera temp is not probably good itcwb_stdobserver10 : true by default - use standard observer 10°, false = standard observer 2° + itcwb_precis : 5 by default - can be set to 3 or 9 - 3 best sampling but more time...9 "old" settings - but low differences in times with 3 instead of 9 about twice time 160ms instead of 80ms for a big raw file */ // BENCHFUN @@ -4660,7 +4661,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double //I don't know how to pass this structure to Colortemp ! // X and Z values calculate for each temp between 2000K to 12000K, so no result after 12000K ! //of course we can change the step between each temp if need - constexpr WbTxyz Txyz[118] = {//temperature Xwb Zwb 118 values x wb and y wb are calculated after + constexpr WbTxyz Txyz[118] = {//temperature Xwb Zwb 118 values x wb and y wb are calculated after, Xwb and Ywb calculated with a spreadsheet {2001., 1.273842, 0.145295}, {2101., 1.244008, 0.167533}, {2201., 1.217338, 0.190697}, @@ -4781,7 +4782,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double {12001., 0.960440, 1.601019} }; const int N_t = sizeof(Txyz) / sizeof(Txyz[0]); //number of temperature White point - constexpr int Nc = 201 + 1;//200 number of reference spectral colors, I think it is enough to retrieve good values + constexpr int Nc = 201 + 1;//201 number of reference spectral colors, I think it is enough to retrieve good values array2D Tx(N_t, Nc); array2D Ty(N_t, Nc); array2D Tz(N_t, Nc); @@ -5196,15 +5197,6 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double reff_spect_xxyy_prov[2 * j + 1][tt] = Ty[j][tt] / (Tx[j][tt] + Ty[j][tt] + Tz[j][tt]); // y from xyY } - //degrade correllation with color high chroma, but not too much...seems not good, but keep in case of?? - //I suppress this old behavior replace by tint += 0.02 - /* if (estimchrom < 0.025f) {//very smal value of chroma for image - //enable strong values - good_spectral[0] = true;//blue - good_spectral[11] = true;//green - good_spectral[62] = true;//red - } -*/ int kkg = -1; for (int i = 0; i < Nc ; ++i) { if (good_spectral[i]) { @@ -5301,7 +5293,7 @@ void RawImageSource::WBauto(double & tempref, double & greenref, array2D if (wbpar.method == "autitcgreen") { bool extra = false; - if (greenref > 0.5 && greenref < 1.3) {// 0/77 and 1.3 arbitraties values + if (greenref > 0.5 && greenref < 1.3) {// 0.5 and 1.3 arbitraties values greenitc = greenref; if (settings->itcwb_forceextra) { From d63fb77c8c44113d20075900c6e0bb6d29c565c2 Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 19 Mar 2020 10:02:28 +0100 Subject: [PATCH 036/109] Fixed crash wavelet clarity softradius --- rtengine/dcrop.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 243ea1b62..640d78b0e 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -1028,7 +1028,7 @@ void Crop::update(int todo) array2D ble(labnCrop->W, labnCrop->H); array2D guid(labnCrop->W, labnCrop->H); Imagefloat *tmpImage = nullptr; - tmpImage = new Imagefloat(labnCrop->W, labnCrop->W); + tmpImage = new Imagefloat(labnCrop->W, labnCrop->H); #ifdef _OPENMP #pragma omp parallel for From 1f4613cd3b3b396e00a93a3a36b7d1bcdae167f8 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 22 Mar 2020 10:37:21 +0100 Subject: [PATCH 037/109] GUI for TM wavelet --- rtdata/languages/default | 10 +++- rtengine/curves.cc | 35 ++++++++++++++ rtengine/curves.h | 24 ++++++++++ rtengine/dcrop.cc | 3 +- rtengine/improccoordinator.cc | 18 ++++++- rtengine/improccoordinator.h | 1 + rtengine/procparams.cc | 28 +++++++++++ rtengine/procparams.h | 6 +++ rtengine/simpleprocess.cc | 3 +- rtgui/paramsedited.cc | 24 ++++++++++ rtgui/paramsedited.h | 4 ++ rtgui/wavelet.cc | 90 +++++++++++++++++++++++++++++++++-- rtgui/wavelet.h | 12 ++++- 13 files changed, 248 insertions(+), 10 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index fe6ddaa7c..e957a5e2a 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -802,6 +802,10 @@ HISTORY_MSG_WAVSIGMA;Sigma HISTORY_MSG_WAVSOFTRAD;Soft radius clarity HISTORY_MSG_WAVSOFTRADEND;Soft radius final HISTORY_MSG_WAVUSHAMET;Clarity method +HISTORY_MSG_THRESWAV;Balance threshold +HISTORY_MSG_SOFTWAV;Soft radius +HISTORY_MSG_TMSHAPE;Compression by level +HISTORY_MSG_WAVTM;Tone mapping wavelet HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -2267,6 +2271,7 @@ TP_WAVELET_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are tr TP_WAVELET_SKY;Sky targetting/protection TP_WAVELET_SKY_TOOLTIP;At -100 sky-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 sky-tones are protected while all other tones are affected. TP_WAVELET_SOFTRAD;Soft Radius +TP_WAVELET_SOFWAV;Soft Radius TP_WAVELET_STREN;Strength TP_WAVELET_STRENGTH;Strength TP_WAVELET_SUPE;Extra @@ -2275,17 +2280,20 @@ TP_WAVELET_THRESHOLD;Highlight levels TP_WAVELET_THRESHOLD2;Shadow levels TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels between 9 and 9 minus the value will be affected by the shadow luminance range. Other levels will be fully treated. The highest level possible is limited by the highlight level value (9 minus highlight level value). TP_WAVELET_THRESHOLD_TOOLTIP;Only levels beyond the chosen value will be affected by the highlight luminance range. Other levels will be fully treated. The chosen value here limits the highest possible value of the shadow levels. +TP_WAVELET_THRESWAV;Balance Threshold TP_WAVELET_THRH;Highlights threshold TP_WAVELET_TILESBIG;Big tiles TP_WAVELET_TILESFULL;Full image TP_WAVELET_TILESIZE;Tiling method TP_WAVELET_TILESLIT;Little tiles TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements. +TP_WAVELET_TM;Tone mapping wavelet TP_WAVELET_TMEDGS;Edge stopping TP_WAVELET_TMSCALE;Scale TP_WAVELET_TMSTRENGTH;Compression strength TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. -TP_WAVELET_TMTYPE;Compression method +TP_WAVELET_TMEDGS;Edge stopping +TP_WAVELET_TMURVE;(un)Compression by Level TP_WAVELET_TON;Toning TP_WAVELET_USH;None TP_WAVELET_USHARP;Clarity method diff --git a/rtengine/curves.cc b/rtengine/curves.cc index a2b5d1d2b..a3e327dbf 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -1209,6 +1209,41 @@ void WavCurve::Set(const std::vector &curvePoints) } } +WavtmCurve::WavtmCurve() {} + +void WavtmCurve::Reset() +{ + luttmCurve.reset(); +} + +void WavtmCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + luttmCurve(501); // raise this value if the quality suffers from this number of samples + + for (int i = 0; i < 501; i++) { + luttmCurve[i] = pCurve.getVal(double(i) / 500.); + } +} + +void WavtmCurve::Set(const std::vector &curvePoints) +{ + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + tcurve.setIdentityValue(0.); + Set(tcurve); + } else { + Reset(); + } + +} + + + WavOpacityCurveRG::WavOpacityCurveRG() {} diff --git a/rtengine/curves.h b/rtengine/curves.h index c5bb0c18f..380bad9d6 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -627,6 +627,30 @@ public: } }; +class WavtmCurve +{ +private: + LUTf luttmCurve; // 0xffff range + void Set(const Curve &pCurve); +public: + virtual ~WavtmCurve() {}; + WavtmCurve(); + + void Reset(); + // void Set(const std::vector &curvePoints, bool &opautili); + void Set(const std::vector &curvePoints); + float operator[](float index) const + { + return luttmCurve[index]; + } + + operator bool (void) const + { + return luttmCurve; + } +}; + + class WavOpacityCurveRG { private: diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 640d78b0e..c2de5e0c5 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -967,13 +967,14 @@ void Crop::update(int todo) } WavCurve wavCLVCurve; + WavtmCurve wavtmCurve; WavOpacityCurveRG waOpacityCurveRG; WavOpacityCurveBY waOpacityCurveBY; WavOpacityCurveW waOpacityCurveW; WavOpacityCurveWL waOpacityCurveWL; LUTf wavclCurve; - params.wavelet.getCurves(wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); + params.wavelet.getCurves(wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); LabImage *unshar = nullptr; Glib::ustring provis; LabImage *provradius = nullptr; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 9bef5b502..682b26410 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -867,7 +867,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if ((params->wavelet.enabled)) { WaveletParams WaveParams = params->wavelet; - WaveParams.getCurves(wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); + WaveParams.getCurves(wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); int kall = 0; LabImage *unshar = nullptr; Glib::ustring provis; @@ -885,8 +885,10 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } if (WaveParams.softrad > 0.f) { + printf("s1\n"); provradius = new LabImage(pW, pH); provradius->CopyFrom(nprevl); + printf("s2\n"); } @@ -922,10 +924,14 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) WaveParams.expnoise = pronois; if (WaveParams.softrad > 0.f) { + printf("s3\n"); + array2D ble(pW, pH); array2D guid(pW, pH); Imagefloat *tmpImage = nullptr; tmpImage = new Imagefloat(pW, pH); + printf("s4\n"); + #ifdef _OPENMP #pragma omp parallel for #endif @@ -948,6 +954,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) tmpImage->b(ir, jr) = Z; ble[ir][jr] = Y / 32768.f; } + printf("s5\n"); + double epsilmax = 0.0001; double epsilmin = 0.00001; double aepsil = (epsilmax - epsilmin) / 90.f; @@ -957,6 +965,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) float blur = 10.f / scale * (0.0001f + 0.8f * WaveParams.softrad); // rtengine::guidedFilter(guid, ble, ble, blur, 0.001, multiTh); rtengine::guidedFilter(guid, ble, ble, blur, epsil, false); + printf("s6\n"); @@ -973,7 +982,10 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) Color::XYZ2Lab(X, Y, Z, L, a, b); nprevl->L[ir][jr] = L; } + printf("s7\n"); + delete tmpImage; + printf("s8\n"); } @@ -1063,8 +1075,12 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } */ if (WaveParams.softrad > 0.f) { + printf("s9\n"); + delete provradius; provradius = NULL; + printf("s10\n"); + } diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 454294beb..c797986e5 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -139,6 +139,7 @@ protected: NoiseCurve noiseLCurve; NoiseCurve noiseCCurve; WavCurve wavCLVCurve; + WavtmCurve wavtmCurve; WavOpacityCurveRG waOpacityCurveRG; WavOpacityCurveBY waOpacityCurveBY; WavOpacityCurveW waOpacityCurveW; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index e795d9bd9..cf5a693f8 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2164,6 +2164,17 @@ WaveletParams::WaveletParams() : 0.35, 0.35 }, + tmcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.75, + 0.35, + 0.35, + 1.0, + 0.75, + 0.35, + 0.35 + }, opacityCurveRG{ static_cast(FCT_MinMaxCPoints), 0.0, @@ -2252,6 +2263,7 @@ WaveletParams::WaveletParams() : c{}, ch{}, expedge(false), + exptm(false), expresid(false), expfinal(false), exptoning(false), @@ -2300,6 +2312,8 @@ WaveletParams::WaveletParams() : thrH(70), radius(40), skinprotect(0.0), + threswav(1.4), + softwav(1.0), hueskin(-5, 25, 170, 120, false), hueskin2(-260, -250, -130, -140, false), hllev(50, 75, 100, 98, false), @@ -2318,6 +2332,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const { return ccwcurve == other.ccwcurve + && tmcurve == other.tmcurve && opacityCurveRG == other.opacityCurveRG && opacityCurveBY == other.opacityCurveBY && opacityCurveW == other.opacityCurveW @@ -2359,6 +2374,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const return true; }() && expedge == other.expedge + && exptm == other.exptm && expresid == other.expresid && expfinal == other.expfinal && expclari == other.expclari @@ -2407,6 +2423,8 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && thrH == other.thrH && radius == other.radius && skinprotect == other.skinprotect + && threswav == other.threswav + && softwav == other.softwav && hueskin == other.hueskin && hueskin2 == other.hueskin2 && hllev == other.hllev @@ -2427,6 +2445,7 @@ bool WaveletParams::operator !=(const WaveletParams& other) const void WaveletParams::getCurves( WavCurve& cCurve, + WavtmCurve& tCurve, WavOpacityCurveRG& opacityCurveLUTRG, WavOpacityCurveBY& opacityCurveLUTBY, WavOpacityCurveW& opacityCurveLUTW, @@ -2434,6 +2453,7 @@ void WaveletParams::getCurves( ) const { cCurve.Set(this->ccwcurve); + tCurve.Set(this->tmcurve); opacityCurveLUTRG.Set(this->opacityCurveRG); opacityCurveLUTBY.Set(this->opacityCurveBY); opacityCurveLUTW.Set(this->opacityCurveW); @@ -3494,6 +3514,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.expcontrast, "Wavelet", "Expcontrast", wavelet.expcontrast, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expchroma, "Wavelet", "Expchroma", wavelet.expchroma, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expedge, "Wavelet", "Expedge", wavelet.expedge, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.exptm, "Wavelet", "Exptm", wavelet.exptm, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expresid, "Wavelet", "Expresid", wavelet.expresid, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expfinal, "Wavelet", "Expfinal", wavelet.expfinal, keyFile); saveToKeyfile(!pedited || pedited->wavelet.exptoning, "Wavelet", "Exptoning", wavelet.exptoning, keyFile); @@ -3541,6 +3562,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.TMmethod, "Wavelet", "TMMethod", wavelet.TMmethod, keyFile); saveToKeyfile(!pedited || pedited->wavelet.chro, "Wavelet", "ChromaLink", wavelet.chro, keyFile); saveToKeyfile(!pedited || pedited->wavelet.ccwcurve, "Wavelet", "ContrastCurve", wavelet.ccwcurve, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.tmcurve, "Wavelet", "TMCurve", wavelet.tmcurve, keyFile); saveToKeyfile(!pedited || pedited->wavelet.pastlev, "Wavelet", "Pastlev", wavelet.pastlev.toVector(), keyFile); saveToKeyfile(!pedited || pedited->wavelet.satlev, "Wavelet", "Satlev", wavelet.satlev.toVector(), keyFile); saveToKeyfile(!pedited || pedited->wavelet.opacityCurveRG, "Wavelet", "OpacityCurveRG", wavelet.opacityCurveRG, keyFile); @@ -3556,6 +3578,8 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.cbenab, "Wavelet", "CBenab", wavelet.cbenab, keyFile); saveToKeyfile(!pedited || pedited->wavelet.lipst, "Wavelet", "Lipst", wavelet.lipst, keyFile); saveToKeyfile(!pedited || pedited->wavelet.skinprotect, "Wavelet", "Skinprotect", wavelet.skinprotect, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.threswav, "Wavelet", "Threswav", wavelet.threswav, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.softwav, "Wavelet", "Softwav", wavelet.softwav, keyFile); saveToKeyfile(!pedited || pedited->wavelet.hueskin, "Wavelet", "Hueskin", wavelet.hueskin.toVector(), keyFile); saveToKeyfile(!pedited || pedited->wavelet.edgrad, "Wavelet", "Edgrad", wavelet.edgrad, keyFile); saveToKeyfile(!pedited || pedited->wavelet.edgval, "Wavelet", "Edgval", wavelet.edgval, keyFile); @@ -4710,6 +4734,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "ThresholdResidHighLight", pedited, wavelet.thrH, pedited->wavelet.thrH); assignFromKeyfile(keyFile, "Wavelet", "Residualradius", pedited, wavelet.radius, pedited->wavelet.radius); assignFromKeyfile(keyFile, "Wavelet", "ContrastCurve", pedited, wavelet.ccwcurve, pedited->wavelet.ccwcurve); + assignFromKeyfile(keyFile, "Wavelet", "TMCurve", pedited, wavelet.tmcurve, pedited->wavelet.tmcurve); assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveRG", pedited, wavelet.opacityCurveRG, pedited->wavelet.opacityCurveRG); assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveBY", pedited, wavelet.opacityCurveBY, pedited->wavelet.opacityCurveBY); assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveW", pedited, wavelet.opacityCurveW, pedited->wavelet.opacityCurveW); @@ -4851,6 +4876,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } assignFromKeyfile(keyFile, "Wavelet", "Skinprotect", pedited, wavelet.skinprotect, pedited->wavelet.skinprotect); + assignFromKeyfile(keyFile, "Wavelet", "Threswav", pedited, wavelet.threswav, pedited->wavelet.threswav); + assignFromKeyfile(keyFile, "Wavelet", "Softwav", pedited, wavelet.softwav, pedited->wavelet.softwav); assignFromKeyfile(keyFile, "Wavelet", "Expcontrast", pedited, wavelet.expcontrast, pedited->wavelet.expcontrast); assignFromKeyfile(keyFile, "Wavelet", "Expchroma", pedited, wavelet.expchroma, pedited->wavelet.expchroma); @@ -4881,6 +4908,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } assignFromKeyfile(keyFile, "Wavelet", "Expedge", pedited, wavelet.expedge, pedited->wavelet.expedge); + assignFromKeyfile(keyFile, "Wavelet", "Exptm", pedited, wavelet.exptm, pedited->wavelet.exptm); assignFromKeyfile(keyFile, "Wavelet", "Expresid", pedited, wavelet.expresid, pedited->wavelet.expresid); assignFromKeyfile(keyFile, "Wavelet", "Expfinal", pedited, wavelet.expfinal, pedited->wavelet.expfinal); assignFromKeyfile(keyFile, "Wavelet", "Exptoning", pedited, wavelet.exptoning, pedited->wavelet.exptoning); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index aabe1e7ae..9bfdaab13 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -40,6 +40,7 @@ class OpacityCurve; class RetinexgaintransmissionCurve; class RetinextransmissionCurve; class WavCurve; +class WavtmCurve; class WavOpacityCurveBY; class WavOpacityCurveRG; class WavOpacityCurveW; @@ -1185,6 +1186,7 @@ private: struct WaveletParams { std::vector ccwcurve; + std::vector tmcurve; std::vector opacityCurveRG; std::vector opacityCurveBY; std::vector opacityCurveW; @@ -1220,6 +1222,7 @@ struct WaveletParams { int c[9]; int ch[9]; bool expedge; + bool exptm; bool expresid; bool expfinal; bool exptoning; @@ -1269,6 +1272,8 @@ struct WaveletParams { int thrH; int radius; double skinprotect; + double threswav; + double softwav; Threshold hueskin; Threshold hueskin2; Threshold hllev; @@ -1288,6 +1293,7 @@ struct WaveletParams { void getCurves( WavCurve& cCurve, + WavtmCurve& tCurve, WavOpacityCurveRG& opacityCurveLUTRG, WavOpacityCurveBY& opacityCurveLUTBY, diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 6b9d86baf..e519d5a56 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1120,6 +1120,7 @@ private: bool wavcontlutili = false; WaveletParams WaveParams = params.wavelet; WavCurve wavCLVCurve; + WavtmCurve wavtmCurve; WavOpacityCurveRG waOpacityCurveRG; WavOpacityCurveBY waOpacityCurveBY; WavOpacityCurveW waOpacityCurveW; @@ -1143,7 +1144,7 @@ private: provradius->CopyFrom(labView); } - params.wavelet.getCurves(wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); + params.wavelet.getCurves(wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); CurveFactory::curveWavContL(wavcontlutili, params.wavelet.wavclCurve, wavclCurve,/* hist16C, dummy,*/ 1); diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 48ba4c341..f954a171a 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -541,11 +541,14 @@ void ParamsEdited::set(bool v) wavelet.hllev = v; wavelet.bllev = v; wavelet.edgcont = v; + wavelet.threswav = v; + wavelet.softwav = v; wavelet.level0noise = v; wavelet.level1noise = v; wavelet.level2noise = v; wavelet.level3noise = v; wavelet.ccwcurve = v; + wavelet.tmcurve = v; wavelet.opacityCurveRG = v; wavelet.opacityCurveBY = v; wavelet.opacityCurveW = v; @@ -565,6 +568,7 @@ void ParamsEdited::set(bool v) wavelet.expcontrast = v; wavelet.expchroma = v; wavelet.expedge = v; + wavelet.exptm = v; wavelet.expresid = v; wavelet.exptoning = v; wavelet.expnoise = v; @@ -1136,6 +1140,8 @@ void ParamsEdited::initFrom(const std::vector& wavelet.hllev = wavelet.hllev && p.wavelet.hllev == other.wavelet.hllev; wavelet.bllev = wavelet.bllev && p.wavelet.bllev == other.wavelet.bllev; wavelet.edgcont = wavelet.edgcont && p.wavelet.edgcont == other.wavelet.edgcont; + wavelet.threswav = wavelet.threswav && p.wavelet.threswav == other.wavelet.threswav; + wavelet.softwav = wavelet.softwav && p.wavelet.softwav == other.wavelet.softwav; wavelet.level0noise = wavelet.level0noise && p.wavelet.level0noise == other.wavelet.level0noise; wavelet.level1noise = wavelet.level1noise && p.wavelet.level1noise == other.wavelet.level1noise; wavelet.level2noise = wavelet.level2noise && p.wavelet.level2noise == other.wavelet.level2noise; @@ -1143,6 +1149,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.pastlev = wavelet.pastlev && p.wavelet.pastlev == other.wavelet.pastlev; wavelet.satlev = wavelet.satlev && p.wavelet.satlev == other.wavelet.satlev; wavelet.ccwcurve = wavelet.ccwcurve && p.wavelet.ccwcurve == other.wavelet.ccwcurve; + wavelet.tmcurve = wavelet.tmcurve && p.wavelet.tmcurve == other.wavelet.tmcurve; wavelet.opacityCurveRG = wavelet.opacityCurveRG && p.wavelet.opacityCurveRG == other.wavelet.opacityCurveRG; wavelet.opacityCurveBY = wavelet.opacityCurveBY && p.wavelet.opacityCurveBY == other.wavelet.opacityCurveBY; wavelet.opacityCurveW = wavelet.opacityCurveW && p.wavelet.opacityCurveW == other.wavelet.opacityCurveW; @@ -1155,6 +1162,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.expcontrast = wavelet.expcontrast && p.wavelet.expcontrast == other.wavelet.expcontrast; wavelet.expchroma = wavelet.expchroma && p.wavelet.expchroma == other.wavelet.expchroma; wavelet.expedge = wavelet.expedge && p.wavelet.expedge == other.wavelet.expedge; + wavelet.exptm = wavelet.exptm && p.wavelet.exptm == other.wavelet.exptm; wavelet.expresid = wavelet.expresid && p.wavelet.expresid == other.wavelet.expresid; wavelet.expfinal = wavelet.expfinal && p.wavelet.expfinal == other.wavelet.expfinal; wavelet.exptoning = wavelet.exptoning && p.wavelet.exptoning == other.wavelet.exptoning; @@ -3037,6 +3045,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.edgcont = mods.wavelet.edgcont; } + if (wavelet.threswav) { + toEdit.wavelet.threswav = mods.wavelet.threswav; + } + + if (wavelet.softwav) { + toEdit.wavelet.softwav = mods.wavelet.softwav; + } + if (wavelet.level0noise) { toEdit.wavelet.level0noise = mods.wavelet.level0noise; } @@ -3065,6 +3081,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.ccwcurve = mods.wavelet.ccwcurve; } + if (wavelet.tmcurve) { + toEdit.wavelet.tmcurve = mods.wavelet.tmcurve; + } + if (wavelet.opacityCurveRG) { toEdit.wavelet.opacityCurveRG = mods.wavelet.opacityCurveRG; } @@ -3106,6 +3126,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.expedge = mods.wavelet.expedge; } + if (wavelet.exptm) { + toEdit.wavelet.exptm = mods.wavelet.exptm; + } + if (wavelet.expresid) { toEdit.wavelet.expresid = mods.wavelet.expresid; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index d2707ec11..619521c05 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -557,11 +557,14 @@ struct WaveletParamsEdited { bool hllev; bool bllev; bool edgcont; + bool threswav; + bool softwav; bool level0noise; bool level1noise; bool level2noise; bool level3noise; bool ccwcurve; + bool tmcurve; bool opacityCurveBY; bool opacityCurveRG; bool opacityCurveW; @@ -584,6 +587,7 @@ struct WaveletParamsEdited { bool expcontrast; bool expchroma; bool expedge; + bool exptm; bool expresid; bool expfinal; bool exptoning; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 7d9a65f2a..a65e3c789 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -63,6 +63,7 @@ Wavelet::Wavelet() : FoldableToolPanel(this, "wavelet", M("TP_WAVELET_LABEL"), true, true), curveEditorG(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_CONTEDIT"))), CCWcurveEditorG(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_CCURVE"))), + curveEditortm(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_TMURVE"))), curveEditorRES(new CurveEditorGroup(options.lastWaveletCurvesDir)), curveEditorGAM(new CurveEditorGroup(options.lastWaveletCurvesDir)), separatorNeutral(Gtk::manage(new Gtk::HSeparator())), @@ -126,6 +127,8 @@ Wavelet::Wavelet() : mergeC(Gtk::manage(new Adjuster(M("TP_WAVELET_MERGEC"), -50, 100, 1, 20))), softrad(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.5, 0.))), softradend(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.5, 0.))), + threswav(Gtk::manage(new Adjuster(M("TP_WAVELET_THRESWAV"), 0.9, 2., 0.01, 1.4))), + softwav(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFWAV"), -10.0, 1000.0, 0.5, 1.))), Lmethod(Gtk::manage(new MyComboBoxText())), CHmethod(Gtk::manage(new MyComboBoxText())), CHSLmethod(Gtk::manage(new MyComboBoxText())), @@ -159,6 +162,7 @@ Wavelet::Wavelet() : expsettings(Gtk::manage(new MyExpander(false, M("TP_WAVELET_SETTINGS")))), exptoning(Gtk::manage(new MyExpander(true, M("TP_WAVELET_TON")))), expclari(Gtk::manage(new MyExpander(true, M("TP_WAVELET_CLARI")))), + exptm(Gtk::manage(new MyExpander(true, M("TP_WAVELET_TM")))), neutrHBox(Gtk::manage(new Gtk::HBox())), usharpHBox(Gtk::manage(new Gtk::HBox())) { @@ -175,6 +179,10 @@ Wavelet::Wavelet() : EvWavscale = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSCALE"); EvWavradius = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVRADIUS"); EvWavsigma = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSIGMA"); + EvWavenatm = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVTM"); + EvWavthreswav = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_THRESWAV"); + EvWavsoftwav = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SOFTWAV"); + EvWavtmshape = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_TMSHAPE"); expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings)); @@ -193,6 +201,9 @@ Wavelet::Wavelet() : expedge->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expedge)); enableEdgeConn = expedge->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), expedge)); + exptm->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), exptm)); + enabletmConn = exptm->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), exptm)); + expgamut->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expgamut)); expresid->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expresid)); @@ -623,6 +634,31 @@ Wavelet::Wavelet() : edgBox->pack_start(*ctboxES); +//TM Wavelet + ToolParamBlock* const tmBox = Gtk::manage(new ToolParamBlock()); + + curveEditortm->setCurveListener(this); + + tmshape = static_cast(curveEditortm->addCurve(CT_Flat, "", nullptr, false, false)); + + tmshape->setIdentityValue(0.); + tmshape->setResetCurve(FlatCurveType(default_params.tmcurve.at(0)), default_params.tmcurve); + tmshape->setTooltip(M("TP_WAVELET_CURVEEDITOR_CC_TOOLTIP")); + + curveEditortm->curveListComplete(); + curveEditortm->show(); + + tmBox->pack_start(*curveEditortm, Gtk::PACK_SHRINK, 4); + + + threswav->setAdjusterListener(this); + tmBox->pack_start(*threswav); + + softwav->setLogScale(10, -10); + softwav->setAdjusterListener(this); + tmBox->pack_start(*softwav); + + // Gamut ToolParamBlock* const conBox = Gtk::manage(new ToolParamBlock()); @@ -939,6 +975,10 @@ Wavelet::Wavelet() : expedge->setLevel(2); pack_start(*expedge); + exptm->add(*tmBox, false); + exptm->setLevel(2); + pack_start(*exptm); + expclari->add(*clariBox, false); expclari->setLevel(2); pack_start(*expclari); @@ -959,6 +999,7 @@ Wavelet::~Wavelet() delete opaCurveEditorG; delete opacityCurveEditorG; + delete curveEditortm; delete CCWcurveEditorG; delete curveEditorRES; delete curveEditorGAM; @@ -1177,6 +1218,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) Lmethod->set_active(selectedLevel == -1 ? 4 : selectedLevel); ccshape->setCurve(pp->wavelet.ccwcurve); + tmshape->setCurve(pp->wavelet.tmcurve); opacityShapeRG->setCurve(pp->wavelet.opacityCurveRG); opacityShapeBY->setCurve(pp->wavelet.opacityCurveBY); opacityShape->setCurve(pp->wavelet.opacityCurveW); @@ -1187,6 +1229,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) expcontrast->setEnabled(pp->wavelet.expcontrast); expchroma->setEnabled(pp->wavelet.expchroma); expedge->setEnabled(pp->wavelet.expedge); + exptm->setEnabled(pp->wavelet.exptm); expresid->setEnabled(pp->wavelet.expresid); expfinal->setEnabled(pp->wavelet.expfinal); exptoning->setEnabled(pp->wavelet.exptoning); @@ -1266,6 +1309,8 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) pastlev->setValue(pp->wavelet.pastlev); satlev->setValue(pp->wavelet.satlev); edgcont->setValue(pp->wavelet.edgcont); + threswav->setValue(pp->wavelet.threswav); + softwav->setValue(pp->wavelet.softwav); greenlow->setValue(pp->wavelet.greenlow); bluelow->setValue(pp->wavelet.bluelow); @@ -1363,9 +1408,11 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) set_inconsistent(multiImage && !pedited->wavelet.enabled); ccshape->setUnChanged(!pedited->wavelet.ccwcurve); + tmshape->setUnChanged(!pedited->wavelet.tmcurve); expcontrast->set_inconsistent(!pedited->wavelet.expcontrast); expchroma->set_inconsistent(!pedited->wavelet.expchroma); expedge->set_inconsistent(!pedited->wavelet.expedge); + exptm->set_inconsistent(!pedited->wavelet.exptm); expresid->set_inconsistent(!pedited->wavelet.expresid); expfinal->set_inconsistent(!pedited->wavelet.expfinal); expclari->set_inconsistent(!pedited->wavelet.expclari); @@ -1437,6 +1484,8 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) satlev->setEditedState(pedited->wavelet.satlev ? Edited : UnEdited); strength->setEditedState(pedited->wavelet.strength ? Edited : UnEdited); edgcont->setEditedState(pedited->wavelet.edgcont ? Edited : UnEdited); + threswav->setEditedState(pedited->wavelet.threswav ? Edited : UnEdited); + softwav->setEditedState(pedited->wavelet.softwav ? Edited : UnEdited); level0noise->setEditedState(pedited->wavelet.level0noise ? Edited : UnEdited); level1noise->setEditedState(pedited->wavelet.level1noise ? Edited : UnEdited); level2noise->setEditedState(pedited->wavelet.level2noise ? Edited : UnEdited); @@ -1542,6 +1591,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) void Wavelet::setEditProvider(EditDataProvider *provider) { ccshape->setEditProvider(provider); + tmshape->setEditProvider(provider); opacityShapeRG->setEditProvider(provider); opacityShapeBY->setEditProvider(provider); opacityShape->setEditProvider(provider); @@ -1554,6 +1604,7 @@ void Wavelet::setEditProvider(EditDataProvider *provider) void Wavelet::autoOpenCurve() { ccshape->openIfNonlinear(); + tmshape->openIfNonlinear(); //opacityShapeRG->openIfNonlinear(); //opacityShapeBY->openIfNonlinear(); } @@ -1604,11 +1655,14 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.hllev = hllev->getValue (); pp->wavelet.bllev = bllev->getValue (); pp->wavelet.edgcont = edgcont->getValue (); + pp->wavelet.threswav = threswav->getValue(); + pp->wavelet.softwav = softwav->getValue(); pp->wavelet.level0noise = level0noise->getValue (); pp->wavelet.level1noise = level1noise->getValue (); pp->wavelet.level2noise = level2noise->getValue (); pp->wavelet.level3noise = level3noise->getValue (); pp->wavelet.ccwcurve = ccshape->getCurve(); + pp->wavelet.tmcurve = tmshape->getCurve(); pp->wavelet.opacityCurveRG = opacityShapeRG->getCurve(); pp->wavelet.opacityCurveBY = opacityShapeBY->getCurve(); pp->wavelet.opacityCurveW = opacityShape->getCurve(); @@ -1633,6 +1687,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.expcontrast = expcontrast->getEnabled(); pp->wavelet.expchroma = expchroma->getEnabled(); pp->wavelet.expedge = expedge->getEnabled(); + pp->wavelet.exptm = exptm->getEnabled(); pp->wavelet.expresid = expresid->getEnabled(); pp->wavelet.expfinal = expfinal->getEnabled(); pp->wavelet.exptoning = exptoning->getEnabled(); @@ -1707,7 +1762,10 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.skinprotect = skinprotect->getEditedState(); pedited->wavelet.hllev = hllev->getEditedState(); pedited->wavelet.ccwcurve = !ccshape->isUnChanged(); + pedited->wavelet.tmcurve = !tmshape->isUnChanged(); pedited->wavelet.edgcont = edgcont->getEditedState(); + pedited->wavelet.threswav = threswav->getEditedState(); + pedited->wavelet.softwav = softwav->getEditedState(); pedited->wavelet.level0noise = level0noise->getEditedState(); pedited->wavelet.level1noise = level1noise->getEditedState(); pedited->wavelet.level2noise = level2noise->getEditedState(); @@ -1738,6 +1796,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.expcontrast = !expcontrast->get_inconsistent(); pedited->wavelet.expchroma = !expchroma->get_inconsistent(); pedited->wavelet.expedge = !expedge->get_inconsistent(); + pedited->wavelet.exptm = !exptm->get_inconsistent(); pedited->wavelet.expresid = !expresid->get_inconsistent(); pedited->wavelet.expfinal = !expfinal->get_inconsistent(); pedited->wavelet.exptoning = !exptoning->get_inconsistent(); @@ -1879,6 +1938,8 @@ void Wavelet::curveChanged(CurveEditor* ce) if (listener && getEnabled()) { if (ce == ccshape) { listener->panelChanged(EvWavCCCurve, M("HISTORY_CUSTOMCURVE")); + } else if (ce == tmshape) { + listener->panelChanged(EvWavtmshape, M("HISTORY_CUSTOMCURVE")); } else if (ce == opacityShapeRG) { listener->panelChanged(EvWavColor, M("HISTORY_CUSTOMCURVE")); } else if (ce == opacityShapeBY) { @@ -1945,6 +2006,8 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit pastlev->setDefault (defParams->wavelet.pastlev); satlev->setDefault (defParams->wavelet.satlev); edgcont->setDefault (defParams->wavelet.edgcont); + threswav->setDefault(defParams->wavelet.threswav); + softwav->setDefault(defParams->wavelet.softwav); level0noise->setDefault (defParams->wavelet.level0noise); level1noise->setDefault (defParams->wavelet.level1noise); level2noise->setDefault (defParams->wavelet.level2noise); @@ -2008,6 +2071,8 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit pastlev->setDefaultEditedState(pedited->wavelet.pastlev ? Edited : UnEdited); satlev->setDefaultEditedState(pedited->wavelet.satlev ? Edited : UnEdited); edgcont->setDefaultEditedState(pedited->wavelet.edgcont ? Edited : UnEdited); + threswav->setDefaultEditedState(pedited->wavelet.threswav ? Edited : UnEdited); + softwav->setDefaultEditedState(pedited->wavelet.softwav ? Edited : UnEdited); strength->setDefaultEditedState(pedited->wavelet.strength ? Edited : UnEdited); balance->setDefaultEditedState(pedited->wavelet.balance ? Edited : UnEdited); iter->setDefaultEditedState(pedited->wavelet.iter ? Edited : UnEdited); @@ -2057,6 +2122,8 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit hllev->setDefaultEditedState(Irrelevant); bllev->setDefaultEditedState(Irrelevant); edgcont->setDefaultEditedState(Irrelevant); + threswav->setDefaultEditedState(Irrelevant); + softwav->setDefaultEditedState(Irrelevant); level0noise->setDefaultEditedState(Irrelevant); level1noise->setDefaultEditedState(Irrelevant); level2noise->setDefaultEditedState(Irrelevant); @@ -2550,6 +2617,7 @@ void Wavelet::setBatchMode(bool batchMode) opacityCurveEditorG->setBatchMode(batchMode); opacityCurveEditorW->setBatchMode(batchMode); opacityCurveEditorWL->setBatchMode(batchMode); + curveEditortm->setBatchMode(batchMode); curveEditorRES->setBatchMode(batchMode); curveEditorGAM->setBatchMode(batchMode); sigma->showEditedCB(); @@ -2587,6 +2655,8 @@ void Wavelet::setBatchMode(bool batchMode) pastlev->showEditedCB(); satlev->showEditedCB(); edgcont->showEditedCB(); + threswav->showEditedCB(); + softwav->showEditedCB(); strength->showEditedCB(); balance->showEditedCB(); iter->showEditedCB(); @@ -2749,6 +2819,10 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavgreenlow, greenlow->getTextValue()); } else if (a == bluelow) { listener->panelChanged(EvWavbluelow, bluelow->getTextValue()); + } else if (a == threswav) { + listener->panelChanged(EvWavthreswav, threswav->getTextValue()); + } else if (a == softwav) { + listener->panelChanged(EvWavsoftwav, softwav->getTextValue()); } if ((a == correction[0] || a == correction[1] || a == correction[2] || a == correction[3] || a == correction[4] || a == correction[5] || a == correction[6] || a == correction[7] || a == correction[8])) { @@ -3270,6 +3344,7 @@ void Wavelet::foldAllButMe(GdkEventButton* event, MyExpander *expander) exptoning->set_expanded(exptoning == expander); expnoise->set_expanded(expnoise == expander); expedge->set_expanded(expedge == expander); + exptm->set_expanded(exptm == expander); expgamut->set_expanded(expgamut == expander); expresid->set_expanded(expresid == expander); expfinal->set_expanded(expfinal == expander); @@ -3292,6 +3367,8 @@ void Wavelet::enableToggled(MyExpander *expander) event = EvWavenanoise; } else if (expander == expedge) { event = EvWavenaedge; + } else if (expander == exptm) { + event = EvWavenatm; } else if (expander == expresid) { event = EvWavenares; } else if (expander == expfinal) { @@ -3354,6 +3431,7 @@ void Wavelet::writeOptions(std::vector &tpOpen) tpOpen.push_back(exptoning->get_expanded()); tpOpen.push_back(expnoise->get_expanded()); tpOpen.push_back(expedge->get_expanded()); + tpOpen.push_back(exptm->get_expanded()); tpOpen.push_back(expgamut->get_expanded()); tpOpen.push_back(expresid->get_expanded()); tpOpen.push_back(expfinal->get_expanded()); @@ -3369,6 +3447,7 @@ void Wavelet::updateToolState(const std::vector& tpOpen) exptoning->set_expanded(false); expnoise->set_expanded(false); expedge->set_expanded(false); + exptm->set_expanded(false); expgamut->set_expanded(false); expresid->set_expanded(false); expfinal->set_expanded(false); @@ -3376,17 +3455,18 @@ void Wavelet::updateToolState(const std::vector& tpOpen) return; } - if (tpOpen.size() >= 10) { + if (tpOpen.size() >= 11) { expsettings->set_expanded(tpOpen[0]); expcontrast->set_expanded(tpOpen[1]); expchroma->set_expanded(tpOpen[2]); exptoning->set_expanded(tpOpen[3]); expnoise->set_expanded(tpOpen[4]); expedge->set_expanded(tpOpen[5]); - expgamut->set_expanded(tpOpen[6]); - expresid->set_expanded(tpOpen[7]); - expfinal->set_expanded(tpOpen[8]); - expclari->set_expanded(tpOpen.at(9)); + exptm->set_expanded(tpOpen[6]); + expgamut->set_expanded(tpOpen[7]); + expresid->set_expanded(tpOpen[8]); + expfinal->set_expanded(tpOpen[9]); + expclari->set_expanded(tpOpen[10]); } } diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index d3b66657e..356241fa0 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -79,6 +79,10 @@ private: rtengine::ProcEvent EvWavscale; rtengine::ProcEvent EvWavradius; rtengine::ProcEvent EvWavsigma; + rtengine::ProcEvent EvWavenatm; + rtengine::ProcEvent EvWavthreswav; + rtengine::ProcEvent EvWavsoftwav; + rtengine::ProcEvent EvWavtmshape; void foldAllButMe(GdkEventButton* event, MyExpander *expander); @@ -140,6 +144,7 @@ private: CurveEditorGroup* const curveEditorG; CurveEditorGroup* const CCWcurveEditorG; + CurveEditorGroup* const curveEditortm; CurveEditorGroup* const curveEditorRES; CurveEditorGroup* const curveEditorGAM; Gtk::HSeparator* const separatorNeutral; @@ -158,6 +163,7 @@ private: DiagonalCurveEditor* clshape; FlatCurveEditor* ccshape; + FlatCurveEditor* tmshape; Gtk::CheckButton* const median; Gtk::CheckButton* const medianlev; Gtk::CheckButton* const linkedg; @@ -194,6 +200,7 @@ private: Adjuster* const strength; Adjuster* const balance; Adjuster* const iter; + Adjuster* greenlow; Adjuster* bluelow; Adjuster* greenmed; @@ -224,6 +231,8 @@ private: Adjuster* const mergeC; Adjuster* const softrad; Adjuster* const softradend; + Adjuster* const threswav; + Adjuster* const softwav; MyComboBoxText* const Lmethod; sigc::connection Lmethodconn; @@ -275,11 +284,12 @@ private: MyExpander* const expsettings; MyExpander* const exptoning; MyExpander* const expclari; + MyExpander* const exptm; Gtk::HBox* const neutrHBox; Gtk::HBox* const usharpHBox; - sigc::connection enableChromaConn, enableContrastConn, enableEdgeConn, enableFinalConn, enableclariConn; + sigc::connection enableChromaConn, enableContrastConn, enableEdgeConn, enabletmConn, enableFinalConn, enableclariConn; sigc::connection enableNoiseConn, enableResidConn, enableToningConn; sigc::connection medianConn, avoidConn, tmrConn, medianlevConn, linkedgConn, lipstConn, cbenabConn, neutralconn, showmaskConn; sigc::connection neutralPressedConn; From 0ffa61748d9acb2abdb97605cd0a05a7dd2e2c14 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 22 Mar 2020 15:31:36 +0100 Subject: [PATCH 038/109] Prepare ipwavelet and periph to TM --- rtengine/dcrop.cc | 4 ++-- rtengine/improccoordinator.cc | 4 ++-- rtengine/improcfun.h | 3 ++- rtengine/ipwavelet.cc | 2 +- rtengine/simpleprocess.cc | 4 ++-- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index c2de5e0c5..8c3f4f140 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -1003,7 +1003,7 @@ void Crop::update(int todo) unshar = new LabImage(labnCrop->W, labnCrop->H); provis = params.wavelet.CLmethod; params.wavelet.CLmethod = "all"; - parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); + parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); unshar->CopyFrom(labnCrop); params.wavelet.CLmethod = provis; @@ -1016,7 +1016,7 @@ void Crop::update(int todo) WaveParams.expnoise = false; } - parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); + parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { WaveParams.expcontrast = procont; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 682b26410..1ad3a0be1 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -898,7 +898,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) unshar = new LabImage(pW, pH); provis = params->wavelet.CLmethod; params->wavelet.CLmethod = "all"; - ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); + ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); unshar->CopyFrom(nprevl); @@ -912,7 +912,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) WaveParams.expnoise = false; } - ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); + ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index a06670b72..bb7588513 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -53,6 +53,7 @@ class OpacityCurve; class PipetteBuffer; class ToneCurve; class WavCurve; +class WavtmCurve; class WavOpacityCurveBY; class WavOpacityCurveRG; class WavOpacityCurveW; @@ -200,7 +201,7 @@ public: int pitch, int scale, const int luma, const int chroma/*, LUTf & Lcurve, LUTf & abcurve*/); void Tile_calc(int tilesize, int overlap, int kall, int imwidth, int imheight, int &numtiles_W, int &numtiles_H, int &tilewidth, int &tileheight, int &tileWskip, int &tileHskip); - void ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip); + void ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavtmCurve & wavtmCurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip); void WaveletcontAllL(LabImage * lab, float **varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_L, struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili); diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 758a9147b..4207eb6d9 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -133,7 +133,7 @@ struct cont_params { int wavNestedLevels = 1; -void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip) +void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavtmCurve & wavtmCurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip) { diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index e519d5a56..f5bfd81df 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1152,7 +1152,7 @@ private: unshar = new LabImage(fw, fh); provis = params.wavelet.CLmethod; params.wavelet.CLmethod = "all"; - ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); + ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); unshar->CopyFrom(labView); params.wavelet.CLmethod = provis; @@ -1164,7 +1164,7 @@ private: WaveParams.expnoise = false; } - ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); + ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { WaveParams.expcontrast = procont; From 5bba83f5213d9092697cf5fd4655e05471bd0eed Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 23 Mar 2020 10:32:29 +0100 Subject: [PATCH 039/109] Prepare 2 - to TM wavelet --- rtengine/improcfun.h | 2 + rtengine/ipwavelet.cc | 193 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 195 insertions(+) diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index bb7588513..caad76a4f 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -188,6 +188,7 @@ public: void EPDToneMapResid(float * WavCoeffs_L0, unsigned int Iterates, int skip, struct cont_params& cp, int W_L, int H_L, float max0, float min0); void CompressDR(float *Source, int W_L, int H_L, float Compression, float DetailBoost); + void Compresslevels2(float **Source, int W_L, int H_L, float compression, float detailattenuator, float thres, float mean, float maxp, float meanN, float maxN, float madL); void ContrastResid(float * WavCoeffs_L0, struct cont_params &cp, int W_L, int H_L, float max0, float min0); void EPDToneMap(LabImage *lab, unsigned int Iterates = 0, int skip = 1); @@ -225,6 +226,7 @@ public: void Sigma(float * HH_Coeffs, int datalen, float averagePlus, float averageNeg, float &sigmaPlus, float &sigmaNeg); void calckoe(float ** WavCoeffs_LL, const cont_params& cp, float ** koeLi, int level, int dir, int W_L, int H_L, float edd, float *maxkoeLi, float **tmC = nullptr); + void softproc2(const LabImage* bufcolorig, const LabImage* bufcolfin, float rad, int bfh, int bfw, double epsilmax, double epsilmin, float thres, int sk, bool multiThread, int flag); void Median_Denoise(float **src, float **dst, int width, int height, Median medianType, int iterations, int numThreads, float **buffer = nullptr); diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 4207eb6d9..ff8efb543 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -32,6 +32,7 @@ #include "EdgePreservingDecomposition.h" #include "iccstore.h" #include "improcfun.h" +#include "imagefloat.h" #include "labimage.h" #include "LUT.h" #include "median.h" @@ -845,6 +846,9 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN); } +//here TM wavelet....big memory + + //init for edge and denoise float vari[4]; @@ -3481,4 +3485,193 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f } } } + +void ImProcFunctions::softproc2(const LabImage* bufcolorig, const LabImage* bufcolfin, float rad, int bfh, int bfw, double epsilmax, double epsilmin, float thres, int sk, bool multiThread, int flag) +{ + if (flag == 0) { + if (rad > 0.f) { + array2D ble(bfw, bfh); + array2D guid(bfw, bfh); + Imagefloat *tmpImage = nullptr; + tmpImage = new Imagefloat(bfw, bfh); + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + + float X, Y, Z; + float L = bufcolorig->L[ir][jr]; + float a = bufcolorig->a[ir][jr]; + float b = bufcolorig->b[ir][jr]; + Color::Lab2XYZ(L, a, b, X, Y, Z); + + guid[ir][jr] = Y / 32768.f; + float La = bufcolfin->L[ir][jr]; + float aa = bufcolfin->a[ir][jr]; + float ba = bufcolfin->b[ir][jr]; + Color::Lab2XYZ(La, aa, ba, X, Y, Z); + tmpImage->r(ir, jr) = X; + tmpImage->g(ir, jr) = Y; + tmpImage->b(ir, jr) = Z; + + ble[ir][jr] = Y / 32768.f; + } + + double aepsil = (epsilmax - epsilmin) / 90.f; + double bepsil = epsilmax - 100.f * aepsil; + double epsil = aepsil * 0.1 * rad + bepsil; + + float blur = 10.f / sk * (thres + 0.8f * rad); + rtengine::guidedFilter(guid, ble, ble, blur, epsil, multiThread, 4); + + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + float X = tmpImage->r(ir, jr); + float Y = 32768.f * ble[ir][jr]; + float Z = tmpImage->b(ir, jr); + float L, a, b; + Color::XYZ2Lab(X, Y, Z, L, a, b); + bufcolfin->L[ir][jr] = L; + } + + delete tmpImage; + } + } else if (flag == 1) { + if (rad > 0.f) { + array2D ble(bfw, bfh); + array2D blechro(bfw, bfh); + array2D hue(bfw, bfh); + array2D guid(bfw, bfh); + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { +// hue[ir][jr] = xatan2f(bufcolfin->b[ir][jr], bufcolfin->a[ir][jr]); +// float chromah = sqrt(SQR(bufcolfin->b[ir][jr]) + SQR(bufcolfin->a[ir][jr])); + + ble[ir][jr] = (bufcolfin->L[ir][jr]) / 32768.f; +// blechro[ir][jr] = chromah / 32768.f; + guid[ir][jr] = bufcolorig->L[ir][jr] / 32768.f; + } + + double aepsil = (epsilmax - epsilmin) / 90.f; + double bepsil = epsilmax - 100.f * aepsil; + double epsil = aepsil * 0.1 * rad + bepsil; + + if (rad != 0.f) { + float blur = rad; + blur = blur < 0.f ? -1.f / blur : 1.f + blur; + // int r1 = max(int(4 / sk * blur + 0.5), 1); + int r2 = max(int(25 / sk * blur + 0.5), 1); + + if (rad < 0.f) { + epsil = 0.0001; + } + + rtengine::guidedFilter(guid, ble, ble, r2, epsil, multiThread); +// rtengine::guidedFilter(guid, blechro, blechro, r1, 0.5 * epsil, multiThread); + } + + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + // float2 sincosval = xsincosf(hue[ir][jr]); + + bufcolfin->L[ir][jr] = 32768.f * ble[ir][jr]; + // bufcolfin->a[ir][jr] = 32768.f * sincosval.y * blechro[ir][jr]; + // bufcolfin->b[ir][jr] = 32768.f * sincosval.x * blechro[ir][jr]; + } + } + + } +} + + +void ImProcFunctions::Compresslevels2(float **Source, int W_L, int H_L, float compression, float detailattenuator, float thres, float mean, float maxp, float meanN, float maxN, float madL) +{ + //J.Desmis 12-2019 + + float exponent; + + // printf("maxp=%f maxn=%f\n", maxp, maxn); + if (detailattenuator > 0.f && detailattenuator < 0.05f) { + float betemp = expf(-(2.f - detailattenuator + 0.693147f)) - 1.f; //0.69315 = log(2) + exponent = 1.2f * xlogf(-betemp); + exponent /= 20.f; + } else if (detailattenuator >= 0.05f && detailattenuator < 0.25f) { + float betemp = expf(-(2.f - detailattenuator + 0.693147f)) - 1.f; + exponent = 1.2f * xlogf(-betemp); + exponent /= (-75.f * detailattenuator + 23.75f); + } else if (detailattenuator >= 0.25f) { + float betemp = expf(-(2.f - detailattenuator + 0.693147f)) - 1.f; + exponent = 1.2f * xlogf(-betemp); + exponent /= (-2.f * detailattenuator + 5.5f); + } else { + exponent = (compression - 1.0f) / 20.f; + } + + exponent += 1.f; + + + float ap = (thres - 1.f) / (maxp - mean); + float bp = 1.f - ap * mean; + + float a0 = (1.33f * thres - 1.f) / (1.f - mean); + float b0 = 1.f - a0 * mean; + + float apn = (thres - 1.f) / (maxN - meanN); + float bpn = 1.f - apn * meanN; + + float a0n = (1.33f * thres - 1.f) / (1.f - meanN); + float b0n = 1.f - a0n * meanN; + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int y = 0; y < H_L; y++) { + for (int x = 0; x < W_L; x++) { + float expone = 1.f; + + if (Source[y][x] >= 0.f) { + + if (Source[y][x] > mean) { + expone = 1.f + (exponent - 1.f) * (ap * Source[y][x] + bp); + } else { + expone = 1.f + (exponent - 1.f) * (a0 * Source[y][x] + b0); + } + + Source[y][x] = xexpf(xlogf(Source[y][x] + 0.05f * madL) * expone); + } else if (Source[y][x] < 0.f) { + if (-Source[y][x] > mean) { + expone = 1.f + (exponent - 1.f) * (apn * -Source[y][x] + bpn); + } else { + expone = 1.f + (exponent - 1.f) * (a0n * -Source[y][x] + b0n); + } + + Source[y][x] = -xexpf(xlogf(-Source[y][x] + 0.05f * madL) * expone); + } + } + } + +} + } From e0d36fb41bd7855cee7f7a4b456ffca710798ea8 Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 23 Mar 2020 18:10:59 +0100 Subject: [PATCH 040/109] First algo TM wavelet --- rtengine/ipwavelet.cc | 136 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 135 insertions(+), 1 deletion(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index ff8efb543..9d5237273 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -124,6 +124,7 @@ struct cont_params { bool finena; bool toningena; bool noiseena; + bool tmena; int maxilev; float edgsens; float edgampl; @@ -204,6 +205,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.finena = params->wavelet.expfinal; cp.toningena = params->wavelet.exptoning; cp.noiseena = params->wavelet.expnoise; + cp.tmena = params->wavelet.exptm; if (params->wavelet.Backmethod == "black") { cp.backm = 0; @@ -846,7 +848,139 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN); } -//here TM wavelet....big memory + //here TM wavelet + if(cp.tmena ){ + float mean2[10]; + float meanN2[10]; + float sigma2[10]; + float sigmaN2[10]; + float MaxP2[10]; + float MaxN2[10]; + //calculate mean, amx, etc. + Evaluate2(*Ldecomp, mean2, meanN2, sigma2, sigmaN2, MaxP2, MaxN2); + + int leve = levwavL; + int dir = 3; + int WW = labco->W; + int HH = labco->H; + float ****templevel = nullptr; + templevel = new float***[dir]; + + //allocate memory for 3 DIR n levels, HH, WW + for (int d = 0; d < dir; d++) { + templevel[d] = new float**[leve]; + + for (int k = 0; k < leve; k++) { + templevel[d][k] = new float*[HH]; + + for (int i = 0; i < HH; i++) { + templevel[d][k][i] = new float[WW]; + } + } + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + //fill templevel with decomp for each level, each dir,X Y + for (int dir = 1; dir < 4; dir++) { + for (int level = 0; level < levwavL; ++level) { + int W_L = Ldecomp->level_W(level); + int H_L = Ldecomp->level_H(level); + float **wav_L = Ldecomp->level_coeffs(level); + madL[level][dir - 1] = Mad(wav_L[dir], W_L * H_L);//evaluate noise by level + + for (int y = 0; y < H_L; y++) { + for (int x = 0; x < W_L; x++) { + float val = wav_L[dir][y * W_L + x]; + templevel[dir - 1][level][y][x] = val; + } + } + } + } + + + float thres = params->wavelet.threswav; + + bool wavcurvecomp = false;//not enable if 0.75 + + if (wavtmCurve) { + for (int i = 0; i < 500; i++) { + if (wavtmCurve[i] != 0.75) { + wavcurvecomp = true; + } + } + } + + //for each level, dir calculate templevel with compression + for (int dir = 1; dir < 4; dir++) { + for (int level = 0; level < levwavL; ++level) { + int W_L = Ldecomp->level_W(level); + int H_L = Ldecomp->level_H(level); + + if (wavtmCurve && wavcurvecomp) { + float klev = (wavtmCurve[level * 55.5f] - 0.75f); + + if (klev < 0.f) { + klev *= 2.6666f;//compression increase contraste + } else { + klev *= 4.f;//dilatation reduce contraste - detailattenuator + } + + float compression = expf(-klev); + float detailattenuator = klev; + + if (klev < 0.0f) { + detailattenuator = 0.0f; + } + Compresslevels2(templevel[dir - 1][level], W_L, H_L, compression, detailattenuator, thres, mean2[level], MaxP2[level], meanN2[level], MaxN2[level], madL[level][dir - 1]); + } + } + } + + //retrieve decomp +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int dir = 1; dir < 4; dir++) { + for (int level = 0; level < levwavL ; ++level) { + int W_L = Ldecomp->level_W(level); + int H_L = Ldecomp->level_H(level); + float **wav_L = Ldecomp->level_coeffs(level); + + for (int y = 0; y < H_L; y++) { + for (int x = 0; x < W_L; x++) { + wav_L[dir][y * W_L + x] = templevel[dir - 1][level][y][x]; + } + } + } + } + + + //free memory + for (int i = 0; i < dir; i++) { + for (int j = 0; j < leve; j++) { + for (int l = 0; l < HH; l++) { + delete [] templevel[i][j][l]; + } + } + } + + for (int i = 0; i < dir; i++) { + for (int j = 0; j < leve; j++) { + delete [] templevel[i][j]; + } + } + + for (int i = 0; i < dir; i++) { + delete [] templevel[i]; + } + + delete [] templevel; + + } + // end TM wavelet //init for edge and denoise From 6d154bcdae6890a77a0374119464ee91ce533325 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 24 Mar 2020 11:29:50 +0100 Subject: [PATCH 041/109] Wavelet - Give possibility to use old algo SH residual image --- rtdata/languages/default | 2 ++ rtengine/ipwavelet.cc | 48 +++++++++++++++++++++++++++++++++++++++- rtengine/procparams.cc | 4 ++++ rtengine/procparams.h | 1 + rtgui/paramsedited.cc | 6 +++++ rtgui/paramsedited.h | 1 + rtgui/wavelet.cc | 42 +++++++++++++++++++++++++++++++++-- rtgui/wavelet.h | 7 ++++-- 8 files changed, 106 insertions(+), 5 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index fe6ddaa7c..3229e1015 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -802,6 +802,7 @@ HISTORY_MSG_WAVSIGMA;Sigma HISTORY_MSG_WAVSOFTRAD;Soft radius clarity HISTORY_MSG_WAVSOFTRADEND;Soft radius final HISTORY_MSG_WAVUSHAMET;Clarity method +HISTORY_MSG_WAVOLDSH;Old algorithm HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -2243,6 +2244,7 @@ TP_WAVELET_NPLOW;Low TP_WAVELET_NPNONE;None TP_WAVELET_NPTYPE;Neighboring pixels TP_WAVELET_NPTYPE_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced. +TP_WAVELET_OLDSH;Old algorithm using negatives values TP_WAVELET_OPACITY;Opacity Blue-Yellow TP_WAVELET_OPACITYW;Contrast balance d/v-h curve TP_WAVELET_OPACITYWL;Final local contrast diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 758a9147b..54d103b7b 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -63,6 +63,7 @@ struct cont_params { float conresH; float radius; float chrores; + bool oldsh; float hueres; float sky; float b_l, t_l, b_r, t_r; @@ -387,6 +388,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.conresH = waparams.resconH; cp.radius = waparams.radius; cp.chrores = waparams.reschro; + cp.oldsh = waparams.oldsh; //cp.hueres=waparams.reshue; cp.hueres = 2.f; cp.th = float(waparams.thr); @@ -1689,7 +1691,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } } - if ((cp.conres != 0.f || cp.conresH != 0.f) && cp.resena) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step + if ((cp.conres != 0.f || cp.conresH != 0.f) && cp.resena && !cp.oldsh) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step LabImage *temp = nullptr; temp = new LabImage(W_L, H_L); #ifdef _OPENMP @@ -1721,6 +1723,50 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } + if((cp.conres != 0.f || cp.conresH != 0.f) && cp.resena && cp.oldsh) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step +#ifdef _OPENMP + #pragma omp for nowait +#endif + + for (int i = 0; i < W_L * H_L; i++) { + float LL = WavCoeffs_L0[i]; + float LL100 = LL / 327.68f; + float tran = 5.f;//transition + //shadow + float alp = 3.f; //increase contrast sahdow in lowlights between 1 and ?? + + if(cp.th > (100.f - tran)) { + tran = 100.f - cp.th; + } + + if(LL100 < cp.th) { + float aalp = (1.f - alp) / cp.th; //no changes for LL100 = cp.th + float kk = aalp * LL100 + alp; + WavCoeffs_L0[i] *= (1.f + kk * cp.conres / 200.f); + } else if(LL100 < cp.th + tran) { + float ath = -cp.conres / tran; + float bth = cp.conres - ath * cp.th; + WavCoeffs_L0[i] *= (1.f + (LL100 * ath + bth) / 200.f); + } + + //highlight + tran = 5.f; + + if(cp.thH < (tran)) { + tran = cp.thH; + } + + if(LL100 > cp.thH) { + WavCoeffs_L0[i] *= (1.f + cp.conresH / 200.f); + } else if(LL100 > (cp.thH - tran)) { + float athH = cp.conresH / tran; + float bthH = cp.conresH - athH * cp.thH; + WavCoeffs_L0[i] *= (1.f + (LL100 * athH + bthH) / 200.f); + } + } + } + + #ifdef _OPENMP #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index e795d9bd9..879423961 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2243,6 +2243,7 @@ WaveletParams::WaveletParams() : lipst(false), avoid(false), showmask(false), + oldsh(true), tmr(false), strength(100), balance(0), @@ -2343,6 +2344,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && lipst == other.lipst && avoid == other.avoid && showmask == other.showmask + && oldsh == other.oldsh && tmr == other.tmr && strength == other.strength && balance == other.balance @@ -3562,6 +3564,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.edgthresh, "Wavelet", "ThrEdg", wavelet.edgthresh, 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.oldsh, "Wavelet", "Oldsh", wavelet.oldsh, 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); @@ -4654,6 +4657,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "Lipst", pedited, wavelet.lipst, pedited->wavelet.lipst); assignFromKeyfile(keyFile, "Wavelet", "AvoidColorShift", pedited, wavelet.avoid, pedited->wavelet.avoid); assignFromKeyfile(keyFile, "Wavelet", "Showmask", pedited, wavelet.showmask, pedited->wavelet.showmask); + assignFromKeyfile(keyFile, "Wavelet", "Oldsh", pedited, wavelet.oldsh, pedited->wavelet.oldsh); assignFromKeyfile(keyFile, "Wavelet", "TMr", pedited, wavelet.tmr, pedited->wavelet.tmr); if (ppVersion < 331) { // wavelet.Lmethod was a string before version 331 diff --git a/rtengine/procparams.h b/rtengine/procparams.h index aabe1e7ae..2eb18781d 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1211,6 +1211,7 @@ struct WaveletParams { bool lipst; bool avoid; bool showmask; + bool oldsh; bool tmr; int strength; int balance; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 48ba4c341..66a302f55 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -494,6 +494,7 @@ void ParamsEdited::set(bool v) wavelet.ushamethod = v; wavelet.avoid = v; wavelet.showmask = v; + wavelet.oldsh = v; wavelet.tmr = v; wavelet.Lmethod = v; wavelet.CLmethod = v; @@ -1090,6 +1091,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.ushamethod = wavelet.ushamethod && p.wavelet.ushamethod == other.wavelet.ushamethod; wavelet.avoid = wavelet.avoid && p.wavelet.avoid == other.wavelet.avoid; wavelet.showmask = wavelet.showmask && p.wavelet.showmask == other.wavelet.showmask; + wavelet.oldsh = wavelet.oldsh && p.wavelet.oldsh == other.wavelet.oldsh; wavelet.tmr = wavelet.tmr && p.wavelet.tmr == other.wavelet.tmr; wavelet.Lmethod = wavelet.Lmethod && p.wavelet.Lmethod == other.wavelet.Lmethod; wavelet.CLmethod = wavelet.CLmethod && p.wavelet.CLmethod == other.wavelet.CLmethod; @@ -2945,6 +2947,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.showmask = mods.wavelet.showmask; } + if (wavelet.oldsh) { + toEdit.wavelet.oldsh = mods.wavelet.oldsh; + } + if (wavelet.tmr) { toEdit.wavelet.tmr = mods.wavelet.tmr; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index d2707ec11..9e50031fb 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -508,6 +508,7 @@ struct WaveletParamsEdited { bool ushamethod; bool avoid; bool showmask; + bool oldsh; bool tmr; bool c[9]; bool ch[9]; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 7d9a65f2a..e314ee018 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -79,10 +79,11 @@ Wavelet::Wavelet() : avoid(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_AVOID")))), tmr(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_BALCHRO")))), showmask(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_SHOWMASK")))), + oldsh(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_OLDSH")))), 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))), - resconH(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCONH"), 0, 100, 1, 0))), + rescon(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCON"), -100, 100, 1, 0))), + resconH(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCONH"), -100, 100, 1, 0))), reschro(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCHRO"), -100, 100, 1, 0))), tmrs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMSTRENGTH"), -1.0, 2.0, 0.01, 0.0))), edgs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMEDGS"), 0.1, 4.0, 0.01, 1.4))), @@ -175,6 +176,7 @@ Wavelet::Wavelet() : EvWavscale = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSCALE"); EvWavradius = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVRADIUS"); EvWavsigma = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSIGMA"); + EvWavoldsh = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVOLDSH"); expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings)); @@ -675,6 +677,9 @@ Wavelet::Wavelet() : // Residual Image ToolParamBlock* const resBox = Gtk::manage(new ToolParamBlock()); + oldsh->set_active(true); + oldshConn = oldsh->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::oldshToggled)); + resBox->pack_start(*oldsh); rescon->setAdjusterListener(this); resBox->pack_start(*rescon, Gtk::PACK_SHRINK); @@ -1200,6 +1205,9 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) showmaskConn.block(true); showmask->set_active(pp->wavelet.showmask); showmaskConn.block(false); + oldshConn.block(true); + oldsh->set_active(pp->wavelet.oldsh); + oldshConn.block(false); tmrConn.block(true); tmr->set_active(pp->wavelet.tmr); tmrConn.block(false); @@ -1230,6 +1238,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) lastlipst = pp->wavelet.lipst; lastavoid = pp->wavelet.avoid; lastshowmask = pp->wavelet.showmask; + lastoldsh = pp->wavelet.oldsh; lasttmr = pp->wavelet.tmr; sigma->setValue(pp->wavelet.sigma); rescon->setValue(pp->wavelet.rescon); @@ -1380,6 +1389,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) clshape->setUnChanged(!pedited->wavelet.wavclCurve); avoid->set_inconsistent(!pedited->wavelet.avoid); showmask->set_inconsistent(!pedited->wavelet.showmask); + oldsh->set_inconsistent(!pedited->wavelet.oldsh); tmr->set_inconsistent(!pedited->wavelet.tmr); edgthresh->setEditedState(pedited->wavelet.edgthresh ? Edited : UnEdited); rescon->setEditedState(pedited->wavelet.rescon ? Edited : UnEdited); @@ -1564,6 +1574,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.enabled = getEnabled(); pp->wavelet.avoid = avoid->get_active(); pp->wavelet.showmask = showmask->get_active(); + pp->wavelet.oldsh = oldsh->get_active(); pp->wavelet.tmr = tmr->get_active(); pp->wavelet.sigma = sigma->getValue(); pp->wavelet.rescon = rescon->getValue(); @@ -1654,6 +1665,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.enabled = !get_inconsistent(); pedited->wavelet.avoid = !avoid->get_inconsistent(); pedited->wavelet.showmask = !showmask->get_inconsistent(); + pedited->wavelet.oldsh = !oldsh->get_inconsistent(); pedited->wavelet.tmr = !tmr->get_inconsistent(); pedited->wavelet.median = !median->get_inconsistent(); pedited->wavelet.medianlev = !medianlev->get_inconsistent(); @@ -3120,6 +3132,32 @@ void Wavelet::showmaskToggled() } } +void Wavelet::oldshToggled() +{ + if (multiImage) { + if (oldsh->get_inconsistent()) { + oldsh->set_inconsistent(false); + oldshConn.block(true); + oldsh->set_active(false); + oldshConn.block(false); + } else if (lastoldsh) { + oldsh->set_inconsistent(true); + } + + lastoldsh = oldsh->get_active(); + } + + if (listener && (multiImage || getEnabled())) { + if (oldsh->get_inconsistent()) { + listener->panelChanged(EvWavoldsh, M("GENERAL_UNCHANGED")); + } else if (oldsh->get_active()) { + listener->panelChanged(EvWavoldsh, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvWavoldsh, M("GENERAL_DISABLED")); + } + } +} + void Wavelet::tmrToggled() { diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index d3b66657e..7aede083f 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -79,6 +79,7 @@ private: rtengine::ProcEvent EvWavscale; rtengine::ProcEvent EvWavradius; rtengine::ProcEvent EvWavsigma; + rtengine::ProcEvent EvWavoldsh; void foldAllButMe(GdkEventButton* event, MyExpander *expander); @@ -98,6 +99,7 @@ private: void TilesmethodChanged(); void avoidToggled(); void showmaskToggled (); + void oldshToggled (); void cbenabToggled(); void contrastMinusPressed(); void contrastPlusPressed(); @@ -166,6 +168,7 @@ private: Gtk::CheckButton* const avoid; Gtk::CheckButton* const tmr; Gtk::CheckButton* const showmask; + Gtk::CheckButton* const oldsh; Gtk::Button* const neutralchButton; Adjuster* correction[9]; @@ -281,13 +284,13 @@ private: sigc::connection enableChromaConn, enableContrastConn, enableEdgeConn, enableFinalConn, enableclariConn; sigc::connection enableNoiseConn, enableResidConn, enableToningConn; - sigc::connection medianConn, avoidConn, tmrConn, medianlevConn, linkedgConn, lipstConn, cbenabConn, neutralconn, showmaskConn; + sigc::connection medianConn, avoidConn, tmrConn, medianlevConn, linkedgConn, lipstConn, cbenabConn, neutralconn, showmaskConn, oldshConn; sigc::connection neutralPressedConn; sigc::connection contrastPlusPressedConn; sigc::connection contrastMinusPressedConn; sigc::connection neutralchPressedConn; - bool lastmedian, lastmedianlev, lastlinkedg, lastavoid, lastlipst, lasttmr, lastcbenab, lastshowmask; + bool lastmedian, lastmedianlev, lastlinkedg, lastavoid, lastlipst, lasttmr, lastcbenab, lastshowmask, lastoldsh; int nextnlevel; IdleRegister idle_register; From 60c341c236b0f20f298d0785eab2fe0b62268521 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 24 Mar 2020 11:30:31 +0100 Subject: [PATCH 042/109] Wavelet - more --- rtengine/ipwavelet.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 54d103b7b..a899f5a9a 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1722,6 +1722,9 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } +#ifdef _OPENMP + #pragma omp barrier +#endif if((cp.conres != 0.f || cp.conresH != 0.f) && cp.resena && cp.oldsh) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step #ifdef _OPENMP From 2bb747b55fd7acf320852ef08db8275d3efb10d7 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 24 Mar 2020 13:46:28 +0100 Subject: [PATCH 043/109] Wvalet - hide radius when old algo --- rtgui/wavelet.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index e314ee018..63eb7743e 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -3134,6 +3134,12 @@ void Wavelet::showmaskToggled() void Wavelet::oldshToggled() { + if (oldsh->get_active()) { + radius->hide(); + } else { + radius->show(); + } + if (multiImage) { if (oldsh->get_inconsistent()) { oldsh->set_inconsistent(false); From cdf8d8ec7f3741af1299b9d524a97bb69858404c Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 25 Mar 2020 07:15:27 +0100 Subject: [PATCH 044/109] Wavelet - added offset to contrast levels --- rtdata/languages/default | 2 ++ rtengine/ipwavelet.cc | 21 +++++++++++---------- rtengine/procparams.cc | 4 ++++ rtengine/procparams.h | 1 + rtgui/paramsedited.cc | 8 +++++++- rtgui/paramsedited.h | 1 + rtgui/wavelet.cc | 14 ++++++++++++++ rtgui/wavelet.h | 2 ++ 8 files changed, 42 insertions(+), 11 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 3229e1015..f8cf543d6 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -803,6 +803,7 @@ HISTORY_MSG_WAVSOFTRAD;Soft radius clarity HISTORY_MSG_WAVSOFTRADEND;Soft radius final HISTORY_MSG_WAVUSHAMET;Clarity method HISTORY_MSG_WAVOLDSH;Old algorithm +HISTORY_MSG_WAVOFFSET;Offset HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -2293,6 +2294,7 @@ TP_WAVELET_USH;None TP_WAVELET_USHARP;Clarity method TP_WAVELET_USHARP_TOOLTIP;Origin : the source file is the file before Wavelet.\nWavelet : the source file is the file including wavelet threatment TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, wavelet settings will be automatically positioned :\nBackground=black, Process=below, level=3...you can change level between 1 and 4.\n\nIf you select Clarity, wavelet settings will be automatically positioned :\nBackground=residual, Process=above, level=7..you can change level between 5 and 10 and wavelet levels. +TP_WAVELET_WAVOFFSET;Offset TP_WBALANCE_AUTO;Auto TP_WBALANCE_AUTOITCGREEN;Auto iterate temperature correlation TP_WBALANCE_AUTOOLD;Auto RGB grey diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index a899f5a9a..9177db0cc 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1691,7 +1691,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } } - if ((cp.conres != 0.f || cp.conresH != 0.f) && cp.resena && !cp.oldsh) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step + if ((cp.conres >= 0.f || cp.conresH >= 0.f) && cp.resena && !cp.oldsh) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step LabImage *temp = nullptr; temp = new LabImage(W_L, H_L); #ifdef _OPENMP @@ -2894,13 +2894,14 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz const float skinprot = params->wavelet.skinprotect; const float skinprotneg = -skinprot; const float factorHard = (1.f - skinprotneg / 100.f); + const float offs = params->wavelet.offset; //to adjust increase contrast with local contrast //for each pixel and each level float beta; float mea[9]; - float rap = mean[level] - 2.f * cp.sigm * sigma[level]; + float rap = offs * mean[level] - 2.f * cp.sigm * sigma[level]; if (rap > 0.f) { mea[0] = rap; @@ -2908,7 +2909,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz mea[0] = mean[level] / 6.f; } - rap = mean[level] - cp.sigm * sigma[level]; + rap = offs * mean[level] - cp.sigm * sigma[level]; if (rap > 0.f) { mea[1] = rap; @@ -2916,13 +2917,13 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz mea[1] = mean[level] / 2.f; } - mea[2] = mean[level]; // 50% data - mea[3] = mean[level] + cp.sigm * sigma[level] / 2.f; - mea[4] = mean[level] + cp.sigm * sigma[level]; //66% - mea[5] = mean[level] + cp.sigm * 1.2f * sigma[level]; - mea[6] = mean[level] + cp.sigm * 1.5f * sigma[level]; // - mea[7] = mean[level] + cp.sigm * 2.f * sigma[level]; //95% - mea[8] = mean[level] + cp.sigm * 2.5f * sigma[level]; //99% + mea[2] = offs * mean[level]; // 50% data + mea[3] = offs * mean[level] + cp.sigm * sigma[level] / 2.f; + mea[4] = offs * mean[level] + cp.sigm * sigma[level]; //66% + mea[5] = offs * mean[level] + cp.sigm * 1.2f * sigma[level]; + mea[6] = offs * mean[level] + cp.sigm * 1.5f * sigma[level]; // + mea[7] = offs * mean[level] + cp.sigm * 2.f * sigma[level]; //95% + mea[8] = offs * mean[level] + cp.sigm * 2.5f * sigma[level]; //99% bool useChromAndHue = (skinprot != 0.f || cp.HSmet); float modchro; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 879423961..96d2302c8 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2274,6 +2274,7 @@ WaveletParams::WaveletParams() : Dirmethod("all"), HSmethod("with"), sigma(1.0), + offset(1.0), rescon(0), resconH(0), reschro(0), @@ -2382,6 +2383,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && Dirmethod == other.Dirmethod && HSmethod == other.HSmethod && sigma == other.sigma + && offset == other.offset && rescon == other.rescon && resconH == other.resconH && reschro == other.reschro @@ -3567,6 +3569,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.oldsh, "Wavelet", "Oldsh", wavelet.oldsh, 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.offset, "Wavelet", "Offset", wavelet.offset, 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.thr, "Wavelet", "ThresholdResidShadow", wavelet.thr, keyFile); @@ -4687,6 +4690,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "HSMethod", pedited, wavelet.HSmethod, pedited->wavelet.HSmethod); assignFromKeyfile(keyFile, "Wavelet", "DirMethod", pedited, wavelet.Dirmethod, pedited->wavelet.Dirmethod); assignFromKeyfile(keyFile, "Wavelet", "Sigma", pedited, wavelet.sigma, pedited->wavelet.sigma); + assignFromKeyfile(keyFile, "Wavelet", "Offset", pedited, wavelet.offset, pedited->wavelet.offset); assignFromKeyfile(keyFile, "Wavelet", "ResidualcontShadow", pedited, wavelet.rescon, pedited->wavelet.rescon); assignFromKeyfile(keyFile, "Wavelet", "ResidualcontHighlight", pedited, wavelet.resconH, pedited->wavelet.resconH); assignFromKeyfile(keyFile, "Wavelet", "Residualchroma", pedited, wavelet.reschro, pedited->wavelet.reschro); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 2eb18781d..feee0391a 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1243,6 +1243,7 @@ struct WaveletParams { Glib::ustring Dirmethod; Glib::ustring HSmethod; double sigma; + double offset; int rescon; int resconH; int reschro; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 66a302f55..d80d98361 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -510,7 +510,8 @@ void ParamsEdited::set(bool v) wavelet.HSmethod = v; wavelet.Dirmethod = v; wavelet.sigma = v; - wavelet.rescon = v; + wavelet.sigma = v; + wavelet.offset = v; wavelet.resconH = v; wavelet.reschro = v; wavelet.tmrs = v; @@ -1107,6 +1108,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.HSmethod = wavelet.HSmethod && p.wavelet.HSmethod == other.wavelet.HSmethod; wavelet.Dirmethod = wavelet.Dirmethod && p.wavelet.Dirmethod == other.wavelet.Dirmethod; wavelet.sigma = wavelet.sigma && p.wavelet.sigma == other.wavelet.sigma; + wavelet.offset = wavelet.offset && p.wavelet.offset == other.wavelet.offset; wavelet.rescon = wavelet.rescon && p.wavelet.rescon == other.wavelet.rescon; wavelet.resconH = wavelet.resconH && p.wavelet.resconH == other.wavelet.resconH; wavelet.reschro = wavelet.reschro && p.wavelet.reschro == other.wavelet.reschro; @@ -3168,6 +3170,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.sigma = mods.wavelet.sigma; } + if (wavelet.offset) { + toEdit.wavelet.offset = mods.wavelet.offset; + } + if (wavelet.resconH) { toEdit.wavelet.resconH = dontforceSet && options.baBehav[ADDSET_WA_RESCONH] ? toEdit.wavelet.resconH + mods.wavelet.resconH : mods.wavelet.resconH; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 9e50031fb..8cd8e25f0 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -526,6 +526,7 @@ struct WaveletParamsEdited { bool daubcoeffmethod; bool Dirmethod; bool sigma; + bool offset; bool rescon; bool resconH; bool reschro; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 63eb7743e..956c52738 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -82,6 +82,7 @@ Wavelet::Wavelet() : oldsh(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_OLDSH")))), 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.))), + offset(Gtk::manage(new Adjuster(M("TP_WAVELET_WAVOFFSET"), 0.33, 1.66, 0.01, 1., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), rescon(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCON"), -100, 100, 1, 0))), resconH(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCONH"), -100, 100, 1, 0))), reschro(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCHRO"), -100, 100, 1, 0))), @@ -177,6 +178,7 @@ Wavelet::Wavelet() : EvWavradius = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVRADIUS"); EvWavsigma = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSIGMA"); EvWavoldsh = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVOLDSH"); + EvWavoffset = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVOFFSET"); expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings)); @@ -331,6 +333,8 @@ Wavelet::Wavelet() : sigma->setAdjusterListener(this); levBox->pack_start(*sigma, Gtk::PACK_SHRINK); + offset->setAdjusterListener(this); + levBox->pack_start(*offset, Gtk::PACK_SHRINK); levBox->pack_start(*sup); sup->setAdjusterListener(this); @@ -1241,6 +1245,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) lastoldsh = pp->wavelet.oldsh; lasttmr = pp->wavelet.tmr; sigma->setValue(pp->wavelet.sigma); + offset->setValue(pp->wavelet.offset); rescon->setValue(pp->wavelet.rescon); resconH->setValue(pp->wavelet.resconH); reschro->setValue(pp->wavelet.reschro); @@ -1394,6 +1399,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) edgthresh->setEditedState(pedited->wavelet.edgthresh ? Edited : UnEdited); rescon->setEditedState(pedited->wavelet.rescon ? Edited : UnEdited); sigma->setEditedState(pedited->wavelet.sigma ? Edited : UnEdited); + offset->setEditedState(pedited->wavelet.offset ? Edited : UnEdited); resconH->setEditedState(pedited->wavelet.resconH ? Edited : UnEdited); reschro->setEditedState(pedited->wavelet.reschro ? Edited : UnEdited); tmrs->setEditedState(pedited->wavelet.tmrs ? Edited : UnEdited); @@ -1577,6 +1583,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.oldsh = oldsh->get_active(); pp->wavelet.tmr = tmr->get_active(); pp->wavelet.sigma = sigma->getValue(); + pp->wavelet.offset = offset->getValue(); pp->wavelet.rescon = rescon->getValue(); pp->wavelet.resconH = resconH->getValue(); pp->wavelet.reschro = reschro->getValue(); @@ -1689,6 +1696,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.Dirmethod = Dirmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.edgthresh = edgthresh->getEditedState(); pedited->wavelet.sigma = sigma->getEditedState(); + pedited->wavelet.offset = offset->getEditedState(); pedited->wavelet.rescon = rescon->getEditedState(); pedited->wavelet.resconH = resconH->getEditedState(); pedited->wavelet.reschro = reschro->getEditedState(); @@ -1924,6 +1932,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit balance->setDefault(defParams->wavelet.balance); iter->setDefault(defParams->wavelet.iter); sigma->setDefault(defParams->wavelet.sigma); + offset->setDefault(defParams->wavelet.offset); rescon->setDefault(defParams->wavelet.rescon); resconH->setDefault(defParams->wavelet.resconH); reschro->setDefault(defParams->wavelet.reschro); @@ -1986,6 +1995,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit softradend->setDefaultEditedState(pedited->wavelet.softradend ? Edited : UnEdited); sigma->setDefault(defParams->wavelet.sigma); + offset->setDefault(defParams->wavelet.offset); rescon->setDefault(defParams->wavelet.rescon); resconH->setDefault(defParams->wavelet.resconH); reschro->setDefault(defParams->wavelet.reschro); @@ -2037,6 +2047,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit } } else { sigma->setDefaultEditedState(Irrelevant); + offset->setDefaultEditedState(Irrelevant); rescon->setDefaultEditedState(Irrelevant); resconH->setDefaultEditedState(Irrelevant); reschro->setDefaultEditedState(Irrelevant); @@ -2565,6 +2576,7 @@ void Wavelet::setBatchMode(bool batchMode) curveEditorRES->setBatchMode(batchMode); curveEditorGAM->setBatchMode(batchMode); sigma->showEditedCB(); + offset->showEditedCB(); rescon->showEditedCB(); resconH->showEditedCB(); reschro->showEditedCB(); @@ -2648,6 +2660,8 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavrescon, rescon->getTextValue()); } else if (a == sigma) { listener->panelChanged(EvWavsigma, sigma->getTextValue()); + } else if (a == offset) { + listener->panelChanged(EvWavoffset, offset->getTextValue()); } else if (a == resconH) { listener->panelChanged(EvWavresconH, resconH->getTextValue()); } else if (a == reschro) { diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index 7aede083f..94b88fd5c 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -80,6 +80,7 @@ private: rtengine::ProcEvent EvWavradius; rtengine::ProcEvent EvWavsigma; rtengine::ProcEvent EvWavoldsh; + rtengine::ProcEvent EvWavoffset; void foldAllButMe(GdkEventButton* event, MyExpander *expander); @@ -174,6 +175,7 @@ private: Adjuster* correction[9]; Adjuster* correctionch[9]; Adjuster* const sigma; + Adjuster* const offset; Adjuster* const rescon; Adjuster* const resconH; Adjuster* const reschro; From ea56e57ec2bcb2be47a36fd62e8fb26e33429544 Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 26 Mar 2020 07:19:54 +0100 Subject: [PATCH 045/109] First version blur by level --- rtdata/languages/default | 4 ++-- rtengine/improcfun.h | 4 ++-- rtengine/ipwavelet.cc | 51 +++++++++++++++++++++++++++++++++------- rtgui/wavelet.cc | 18 +++++++------- rtgui/wavelet.h | 2 +- 5 files changed, 57 insertions(+), 22 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 313f7055a..bf260961f 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -806,7 +806,7 @@ HISTORY_MSG_THRESWAV;Balance threshold HISTORY_MSG_SOFTWAV;Soft radius HISTORY_MSG_WAVOLDSH;Old algorithm HISTORY_MSG_WAVOFFSET;Offset -HISTORY_MSG_TMSHAPE;Compression by level +HISTORY_MSG_BLSHAPE;Blur by level HISTORY_MSG_WAVBL;Blur levels HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s @@ -2141,6 +2141,7 @@ TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider al TP_WAVELET_BANONE;None TP_WAVELET_BASLI;Slider TP_WAVELET_BATYPE;Contrast balance method +TP_WAVELET_BLCURVE;Blur by levels TP_WAVELET_CBENAB;Toning and Color Balance TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted TP_WAVELET_CCURVE;Local contrast @@ -2297,7 +2298,6 @@ TP_WAVELET_TMSCALE;Scale TP_WAVELET_TMSTRENGTH;Compression strength TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. TP_WAVELET_TMEDGS;Edge stopping -TP_WAVELET_TMURVE;(un)Compression by Level TP_WAVELET_TON;Toning TP_WAVELET_USH;None TP_WAVELET_USHARP;Clarity method diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index d896342d5..424084b8c 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -207,8 +207,8 @@ public: void WaveletcontAllL(LabImage * lab, float **varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_L, const Wavblcurve & wavblcurve, struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili); void WaveletcontAllLfinal(const wavelet_decomposition &WaveletCoeffs_L, const cont_params &cp, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL); - void WaveletcontAllAB(LabImage * lab, float **varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_a, const WavOpacityCurveW & waOpacityCurveW, - struct cont_params &cp, const bool useChannelA); + void WaveletcontAllAB(LabImage * lab, float **varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_a, const Wavblcurve & wavblcurve, const WavOpacityCurveW & waOpacityCurveW, + struct cont_params &cp, const bool useChannelA, int skip); void WaveletAandBAllAB(const wavelet_decomposition &WaveletCoeffs_a, const wavelet_decomposition &WaveletCoeffs_b, const cont_params &cp, FlatCurve* hhcurve, bool hhutili); void ContAllL(float **koeLi, float *maxkoeLi, bool lipschitz, int maxlvl, LabImage * lab, float **varhue, float **varchrom, float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp, diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 456a3bd1e..4600f14ec 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -59,6 +59,7 @@ struct cont_params { float sigm; int chrom; int chro; + float chrwav; int contrast; float th; float thH; @@ -209,6 +210,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.toningena = params->wavelet.exptoning; cp.noiseena = params->wavelet.expnoise; cp.blena = params->wavelet.expbl; + cp.chrwav = 0.01f * params->wavelet.chrwav; if (params->wavelet.Backmethod == "black") { cp.backm = 0; @@ -1061,7 +1063,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr adecomp(new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwava, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!adecomp->memoryAllocationFailed) { - WaveletcontAllAB(labco, varhue, varchro, *adecomp, waOpacityCurveW, cp, true); + WaveletcontAllAB(labco, varhue, varchro, *adecomp, wavblcurve, waOpacityCurveW, cp, true, skip); adecomp->reconstruct(labco->data + datalen, cp.strength); } } @@ -1080,7 +1082,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!bdecomp->memoryAllocationFailed) { - WaveletcontAllAB(labco, varhue, varchro, *bdecomp, waOpacityCurveW, cp, false); + WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip); bdecomp->reconstruct(labco->data + 2 * datalen, cp.strength); } } @@ -1100,8 +1102,8 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!adecomp->memoryAllocationFailed && !bdecomp->memoryAllocationFailed) { - WaveletcontAllAB(labco, varhue, varchro, *adecomp, waOpacityCurveW, cp, true); - WaveletcontAllAB(labco, varhue, varchro, *bdecomp, waOpacityCurveW, cp, false); + WaveletcontAllAB(labco, varhue, varchro, *adecomp,wavblcurve, waOpacityCurveW, cp, true, skip); + WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip); WaveletAandBAllAB(*adecomp, *bdecomp, cp, hhCurve, hhutili); adecomp->reconstruct(labco->data + datalen, cp.strength); @@ -2085,9 +2087,9 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * for (int co = 0; co < Hlvl_L * Wlvl_L; co++) { bef[co] = WavCoeffs_L[dir][co]; } - klev = 0.25f * (wavblcurve[lvl * 55.5f]); + klev = (wavblcurve[lvl * 55.5f]); - klev *= 50.f / skip; + klev *= lvl * 50.f / skip; boxblur(bef, aft, klev, Wlvl_L, Hlvl_L, false); for (int co = 0; co < Hlvl_L * Wlvl_L; co++) { @@ -2173,8 +2175,8 @@ void ImProcFunctions::WaveletAandBAllAB(const wavelet_decomposition &WaveletCoef } -void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_ab, const WavOpacityCurveW & waOpacityCurveW, - struct cont_params &cp, const bool useChannelA) +void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_ab, const Wavblcurve & wavblcurve, const WavOpacityCurveW & waOpacityCurveW, + struct cont_params &cp, const bool useChannelA, int skip) { int maxlvl = WaveletCoeffs_ab.maxlevel(); @@ -2297,6 +2299,16 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float } } + bool wavcurvecomp = false;//not enable if 0.75 + + if (wavblcurve) { + for (int i = 0; i < 500; i++) { + if (wavblcurve[i] != 0.) { + wavcurvecomp = true; + } + } + } + #ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -2309,6 +2321,29 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); ContAllAB(labco, maxlvl, varhue, varchrom, WavCoeffs_ab, WavCoeffs_ab0, lvl, dir, waOpacityCurveW, cp, Wlvl_ab, Hlvl_ab, useChannelA); + + if(wavblcurve && wavcurvecomp && cp.blena && cp.chrwav > 0.f) { + float * bef = new float[Wlvl_ab * Hlvl_ab]; + float * aft = new float[Wlvl_ab * Hlvl_ab]; + float klev; + for (int co = 0; co < Hlvl_ab * Wlvl_ab; co++) { + bef[co] = WavCoeffs_ab[dir][co]; + } + klev = (wavblcurve[lvl * 55.5f]); + + klev *= cp.chrwav * lvl * 100.f / skip; + + boxblur(bef, aft, klev, Wlvl_ab, Hlvl_ab, false); + + for (int co = 0; co < Hlvl_ab * Wlvl_ab; co++) { + WavCoeffs_ab[dir][co] = aft[co]; + } + + delete bef; + delete aft; + } + + } } diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 1bea8a3fa..d5c5e55e8 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -63,7 +63,7 @@ Wavelet::Wavelet() : FoldableToolPanel(this, "wavelet", M("TP_WAVELET_LABEL"), true, true), curveEditorG(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_CONTEDIT"))), CCWcurveEditorG(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_CCURVE"))), - curveEditortm(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_TMURVE"))), + curveEditorbl(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_BLCURVE"))), curveEditorRES(new CurveEditorGroup(options.lastWaveletCurvesDir)), curveEditorGAM(new CurveEditorGroup(options.lastWaveletCurvesDir)), separatorNeutral(Gtk::manage(new Gtk::HSeparator())), @@ -186,7 +186,7 @@ Wavelet::Wavelet() : EvWavoldsh = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVOLDSH"); EvWavoffset = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVOFFSET"); EvWavsoftwav = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SOFTWAV"); - EvWavblshape = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_blshape"); + EvWavblshape = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLSHAPE"); expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings)); @@ -643,18 +643,18 @@ Wavelet::Wavelet() : //Blur Wavelet ToolParamBlock* const blBox = Gtk::manage(new ToolParamBlock()); - curveEditortm->setCurveListener(this); + curveEditorbl->setCurveListener(this); - blshape = static_cast(curveEditortm->addCurve(CT_Flat, "", nullptr, false, false)); + blshape = static_cast(curveEditorbl->addCurve(CT_Flat, "", nullptr, false, false)); blshape->setIdentityValue(0.); blshape->setResetCurve(FlatCurveType(default_params.blcurve.at(0)), default_params.blcurve); blshape->setTooltip(M("TP_WAVELET_CURVEEDITOR_CC_TOOLTIP")); - curveEditortm->curveListComplete(); - curveEditortm->show(); + curveEditorbl->curveListComplete(); + curveEditorbl->show(); - blBox->pack_start(*curveEditortm, Gtk::PACK_SHRINK, 4); + blBox->pack_start(*curveEditorbl, Gtk::PACK_SHRINK, 4); chrwav->setAdjusterListener(this); @@ -1008,7 +1008,7 @@ Wavelet::~Wavelet() delete opaCurveEditorG; delete opacityCurveEditorG; - delete curveEditortm; + delete curveEditorbl; delete CCWcurveEditorG; delete curveEditorRES; delete curveEditorGAM; @@ -2640,7 +2640,7 @@ void Wavelet::setBatchMode(bool batchMode) opacityCurveEditorG->setBatchMode(batchMode); opacityCurveEditorW->setBatchMode(batchMode); opacityCurveEditorWL->setBatchMode(batchMode); - curveEditortm->setBatchMode(batchMode); + curveEditorbl->setBatchMode(batchMode); curveEditorRES->setBatchMode(batchMode); curveEditorGAM->setBatchMode(batchMode); sigma->showEditedCB(); diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index 15ad773fc..0d9081660 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -147,7 +147,7 @@ private: CurveEditorGroup* const curveEditorG; CurveEditorGroup* const CCWcurveEditorG; - CurveEditorGroup* const curveEditortm; + CurveEditorGroup* const curveEditorbl; CurveEditorGroup* const curveEditorRES; CurveEditorGroup* const curveEditorGAM; Gtk::HSeparator* const separatorNeutral; From c836376766dd210eafb38584f36bbfc62fa39503 Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 26 Mar 2020 09:34:38 +0100 Subject: [PATCH 046/109] Blur residual luma and chroma --- rtdata/languages/default | 6 ++++ rtengine/ipwavelet.cc | 74 +++++++++++++++++++++++++++++++--------- rtengine/procparams.cc | 8 +++++ rtengine/procparams.h | 2 ++ rtgui/paramsedited.cc | 12 +++++++ rtgui/paramsedited.h | 2 ++ rtgui/wavelet.cc | 36 ++++++++++++++++++- rtgui/wavelet.h | 5 +++ 8 files changed, 128 insertions(+), 17 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index bf260961f..282327ba5 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -808,6 +808,8 @@ HISTORY_MSG_WAVOLDSH;Old algorithm HISTORY_MSG_WAVOFFSET;Offset HISTORY_MSG_BLSHAPE;Blur by level HISTORY_MSG_WAVBL;Blur levels +HISTORY_MSG_BLURWAV;Blur luminance +HISTORY_MSG_BLURCWAV;Blur chroma HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -2142,6 +2144,7 @@ TP_WAVELET_BANONE;None TP_WAVELET_BASLI;Slider TP_WAVELET_BATYPE;Contrast balance method TP_WAVELET_BLCURVE;Blur by levels +TP_WAVELET_BLURFRAME;Blur TP_WAVELET_CBENAB;Toning and Color Balance TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted TP_WAVELET_CCURVE;Local contrast @@ -2262,6 +2265,8 @@ TP_WAVELET_RADIUS;Radius Shadows - Highlight TP_WAVELET_RE1;Reinforced TP_WAVELET_RE2;Unchanged TP_WAVELET_RE3;Reduced +TP_WAVELET_RESBLUR;Blur Luminance +TP_WAVELET_RESBLURC;Blur Chroma TP_WAVELET_RESCHRO;Intensity TP_WAVELET_RESCON;Shadows TP_WAVELET_RESCONH;Highlights @@ -2299,6 +2304,7 @@ TP_WAVELET_TMSTRENGTH;Compression strength TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. TP_WAVELET_TMEDGS;Edge stopping TP_WAVELET_TON;Toning +TP_WAVELET_TMTYPE;Compression method TP_WAVELET_USH;None TP_WAVELET_USHARP;Clarity method TP_WAVELET_USHARP_TOOLTIP;Origin : the source file is the file before Wavelet.\nWavelet : the source file is the file including wavelet threatment diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 4600f14ec..461bdc7ac 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -65,6 +65,8 @@ struct cont_params { float thH; float conres; float conresH; + float blurres; + float blurcres; float radius; float chrores; bool oldsh; @@ -396,6 +398,8 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.radius = waparams.radius; cp.chrores = waparams.reschro; cp.oldsh = waparams.oldsh; + cp.blurres = waparams.resblur; + cp.blurcres = waparams.resblurc; //cp.hueres=waparams.reshue; cp.hueres = 2.f; cp.th = float(waparams.thr); @@ -1910,7 +1914,25 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } } +//Blur luma + if(cp.blurres != 0.f && cp.resena) { + float rad = cp.blurres / skip; + float * bef = new float[W_L * H_L]; + float * aft = new float[W_L * H_L]; + for (int i = 0; i < H_L * W_L; i++) { + bef[i] = WavCoeffs_L0[i]; + } + boxblur(bef, aft, rad, W_L, H_L, false); + + for (int i = 0; i < H_L * W_L; i++) { + WavCoeffs_L0[i] = aft[i]; + } + + delete bef; + delete aft; + } +// #ifdef _OPENMP #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif @@ -2054,15 +2076,15 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * // end } - bool wavcurvecomp = false;//not enable if 0.75 + bool wavcurvecomp = false;//not enable if 0.75 - if (wavblcurve) { - for (int i = 0; i < 500; i++) { - if (wavblcurve[i] != 0.) { - wavcurvecomp = true; - } - } - } + if (wavblcurve) { + for (int i = 0; i < 500; i++) { + if (wavblcurve[i] != 0.) { + wavcurvecomp = true; + } + } + } #ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) @@ -2298,16 +2320,36 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float } } } + +//Blur chroma + if(cp.blurcres != 0.f && cp.resena) { + float rad = cp.blurcres / skip; + float * bef = new float[W_L * H_L]; + float * aft = new float[W_L * H_L]; - bool wavcurvecomp = false;//not enable if 0.75 + for (int i = 0; i < H_L * W_L; i++) { + bef[i] = WavCoeffs_ab0[i]; + } + boxblur(bef, aft, rad, W_L, H_L, false); - if (wavblcurve) { - for (int i = 0; i < 500; i++) { - if (wavblcurve[i] != 0.) { - wavcurvecomp = true; - } - } - } + for (int i = 0; i < H_L * W_L; i++) { + WavCoeffs_ab0[i] = aft[i]; + } + + delete bef; + delete aft; + } + + + bool wavcurvecomp = false;//not enable if 0.75 + + if (wavblcurve) { + for (int i = 0; i < 500; i++) { + if (wavblcurve[i] != 0.) { + wavcurvecomp = true; + } + } + } #ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 0c76e3003..574e4f3a2 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2291,6 +2291,8 @@ WaveletParams::WaveletParams() : rescon(0), resconH(0), reschro(0), + resblur(0), + resblurc(0), tmrs(0), edgs(1.4), scale(1.), @@ -2404,6 +2406,8 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && rescon == other.rescon && resconH == other.resconH && reschro == other.reschro + && resblur == other.resblur + && resblurc == other.resblurc && tmrs == other.tmrs && edgs == other.edgs && scale == other.scale @@ -3601,6 +3605,8 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.thrH, "Wavelet", "ThresholdResidHighLight", wavelet.thrH, keyFile); saveToKeyfile(!pedited || pedited->wavelet.radius, "Wavelet", "Residualradius", wavelet.radius, keyFile); saveToKeyfile(!pedited || pedited->wavelet.reschro, "Wavelet", "Residualchroma", wavelet.reschro, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.resblur, "Wavelet", "Residualblur", wavelet.resblur, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.resblurc, "Wavelet", "Residualblurc", wavelet.resblurc, keyFile); saveToKeyfile(!pedited || pedited->wavelet.tmrs, "Wavelet", "ResidualTM", wavelet.tmrs, keyFile); saveToKeyfile(!pedited || pedited->wavelet.edgs, "Wavelet", "ResidualEDGS", wavelet.edgs, keyFile); saveToKeyfile(!pedited || pedited->wavelet.scale, "Wavelet", "ResidualSCALE", wavelet.scale, keyFile); @@ -4719,6 +4725,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "ResidualcontShadow", pedited, wavelet.rescon, pedited->wavelet.rescon); assignFromKeyfile(keyFile, "Wavelet", "ResidualcontHighlight", pedited, wavelet.resconH, pedited->wavelet.resconH); assignFromKeyfile(keyFile, "Wavelet", "Residualchroma", pedited, wavelet.reschro, pedited->wavelet.reschro); + assignFromKeyfile(keyFile, "Wavelet", "Residualblur", pedited, wavelet.resblur, pedited->wavelet.resblur); + assignFromKeyfile(keyFile, "Wavelet", "Residualblurc", pedited, wavelet.resblurc, pedited->wavelet.resblurc); assignFromKeyfile(keyFile, "Wavelet", "ResidualTM", pedited, wavelet.tmrs, pedited->wavelet.tmrs); assignFromKeyfile(keyFile, "Wavelet", "ResidualEDGS", pedited, wavelet.edgs, pedited->wavelet.edgs); assignFromKeyfile(keyFile, "Wavelet", "ResidualSCALE", pedited, wavelet.scale, pedited->wavelet.scale); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index e78c8fc47..62ca88690 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1250,6 +1250,8 @@ struct WaveletParams { int rescon; int resconH; int reschro; + int resblur; + int resblurc; double tmrs; double edgs; double scale; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index b568d3b52..4dc81fc5f 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -514,6 +514,8 @@ void ParamsEdited::set(bool v) wavelet.offset = v; wavelet.resconH = v; wavelet.reschro = v; + wavelet.resblur = v; + wavelet.resblurc = v; wavelet.tmrs = v; wavelet.edgs = v; wavelet.scale = v; @@ -1116,6 +1118,8 @@ void ParamsEdited::initFrom(const std::vector& wavelet.rescon = wavelet.rescon && p.wavelet.rescon == other.wavelet.rescon; wavelet.resconH = wavelet.resconH && p.wavelet.resconH == other.wavelet.resconH; wavelet.reschro = wavelet.reschro && p.wavelet.reschro == other.wavelet.reschro; + wavelet.resblur = wavelet.resblur && p.wavelet.resblur == other.wavelet.resblur; + wavelet.resblurc = wavelet.resblurc && p.wavelet.resblurc == other.wavelet.resblurc; wavelet.tmrs = wavelet.tmrs && p.wavelet.tmrs == other.wavelet.tmrs; wavelet.edgs = wavelet.edgs && p.wavelet.edgs == other.wavelet.edgs; wavelet.scale = wavelet.scale && p.wavelet.scale == other.wavelet.scale; @@ -3198,6 +3202,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.offset = mods.wavelet.offset; } + if (wavelet.resblur) { + toEdit.wavelet.resblur = mods.wavelet.resblur; + } + + if (wavelet.resblurc) { + toEdit.wavelet.resblurc = mods.wavelet.resblurc; + } + if (wavelet.resconH) { toEdit.wavelet.resconH = dontforceSet && options.baBehav[ADDSET_WA_RESCONH] ? toEdit.wavelet.resconH + mods.wavelet.resconH : mods.wavelet.resconH; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 8e02ba58f..de688d856 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -530,6 +530,8 @@ struct WaveletParamsEdited { bool rescon; bool resconH; bool reschro; + bool resblur; + bool resblurc; bool tmrs; bool edgs; bool scale; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index d5c5e55e8..cc53a45a2 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -87,6 +87,8 @@ Wavelet::Wavelet() : rescon(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCON"), -100, 100, 1, 0))), resconH(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCONH"), -100, 100, 1, 0))), reschro(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCHRO"), -100, 100, 1, 0))), + resblur(Gtk::manage(new Adjuster(M("TP_WAVELET_RESBLUR"), 0, 100, 1, 0))), + resblurc(Gtk::manage(new Adjuster(M("TP_WAVELET_RESBLURC"), 0, 100, 1, 0))), tmrs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMSTRENGTH"), -1.0, 2.0, 0.01, 0.0))), edgs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMEDGS"), 0.1, 4.0, 0.01, 1.4))), scale(Gtk::manage(new Adjuster(M("TP_WAVELET_TMSCALE"), 0.1, 10.0, 0.01, 1.0))), @@ -149,6 +151,7 @@ Wavelet::Wavelet() : chanMixerHLFrame(Gtk::manage(new Gtk::Frame(M("TP_COLORTONING_HIGHLIGHT")))), chanMixerMidFrame(Gtk::manage(new Gtk::Frame(M("TP_COLORTONING_MIDTONES")))), chanMixerShadowsFrame(Gtk::manage(new Gtk::Frame(M("TP_COLORTONING_SHADOWS")))), + blurFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_BLURFRAME")))), chromaFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_CHROMAFRAME")))), wavLabels(Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER))), labmC(Gtk::manage(new Gtk::Label(M("TP_WAVELET_CTYPE") + ":"))), @@ -187,6 +190,8 @@ Wavelet::Wavelet() : EvWavoffset = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVOFFSET"); EvWavsoftwav = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SOFTWAV"); EvWavblshape = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLSHAPE"); + EvWavresblur = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLURWAV"); + EvWavresblurc = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLURCWAV"); expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings)); @@ -662,7 +667,7 @@ Wavelet::Wavelet() : softwav->setLogScale(10, -10); softwav->setAdjusterListener(this); - blBox->pack_start(*softwav); +// blBox->pack_start(*softwav); // Gamut @@ -741,6 +746,14 @@ Wavelet::Wavelet() : resBox->pack_start(*contrast); //keep the possibility to reinstall reschro->setAdjusterListener(this); + resblur->setAdjusterListener(this); + resblurc->setAdjusterListener(this); + + blurFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const blurBox = Gtk::manage(new ToolParamBlock()); + blurBox->pack_start(*resblur); + blurBox->pack_start(*resblurc); + blurFrame->add(*blurBox); chromaFrame->set_label_align(0.025, 0.5); ToolParamBlock* const chromaBox = Gtk::manage(new ToolParamBlock()); @@ -796,6 +809,7 @@ Wavelet::Wavelet() : const std::vector milestones3 = makeWholeHueRange(); curveEditorRES->setCurveListener(this); + resBox->pack_start(*blurFrame); resBox->pack_start(*chromaFrame); hhshape = static_cast(curveEditorRES->addCurve(CT_Flat, M("TP_WAVELET_CURVEEDITOR_HH"))); @@ -1292,6 +1306,8 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) rescon->setValue(pp->wavelet.rescon); resconH->setValue(pp->wavelet.resconH); reschro->setValue(pp->wavelet.reschro); + resblur->setValue(pp->wavelet.resblur); + resblurc->setValue(pp->wavelet.resblurc); tmrs->setValue(pp->wavelet.tmrs); edgs->setValue(pp->wavelet.edgs); scale->setValue(pp->wavelet.scale); @@ -1449,6 +1465,8 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) offset->setEditedState(pedited->wavelet.offset ? Edited : UnEdited); resconH->setEditedState(pedited->wavelet.resconH ? Edited : UnEdited); reschro->setEditedState(pedited->wavelet.reschro ? Edited : UnEdited); + resblur->setEditedState(pedited->wavelet.resblur ? Edited : UnEdited); + resblurc->setEditedState(pedited->wavelet.resblurc ? Edited : UnEdited); tmrs->setEditedState(pedited->wavelet.tmrs ? Edited : UnEdited); edgs->setEditedState(pedited->wavelet.edgs ? Edited : UnEdited); scale->setEditedState(pedited->wavelet.scale ? Edited : UnEdited); @@ -1638,6 +1656,8 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.rescon = rescon->getValue(); pp->wavelet.resconH = resconH->getValue(); pp->wavelet.reschro = reschro->getValue(); + pp->wavelet.resblur = resblur->getValue(); + pp->wavelet.resblurc = resblurc->getValue(); pp->wavelet.tmrs = tmrs->getValue(); pp->wavelet.edgs = edgs->getValue(); pp->wavelet.scale = scale->getValue(); @@ -1755,6 +1775,8 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.rescon = rescon->getEditedState(); pedited->wavelet.resconH = resconH->getEditedState(); pedited->wavelet.reschro = reschro->getEditedState(); + pedited->wavelet.resblur = resblur->getEditedState(); + pedited->wavelet.resblurc = resblurc->getEditedState(); pedited->wavelet.tmrs = tmrs->getEditedState(); pedited->wavelet.edgs = edgs->getEditedState(); pedited->wavelet.scale = scale->getEditedState(); @@ -1997,6 +2019,8 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit rescon->setDefault(defParams->wavelet.rescon); resconH->setDefault(defParams->wavelet.resconH); reschro->setDefault(defParams->wavelet.reschro); + resblur->setDefault(defParams->wavelet.resblur); + resblurc->setDefault(defParams->wavelet.resblurc); tmrs->setDefault(defParams->wavelet.tmrs); edgs->setDefault(defParams->wavelet.edgs); scale->setDefault(defParams->wavelet.scale); @@ -2062,6 +2086,8 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit rescon->setDefault(defParams->wavelet.rescon); resconH->setDefault(defParams->wavelet.resconH); reschro->setDefault(defParams->wavelet.reschro); + resblur->setDefault(defParams->wavelet.resblur); + resblurc->setDefault(defParams->wavelet.resblurc); tmrs->setDefault(defParams->wavelet.tmrs); edgs->setDefault(defParams->wavelet.edgs); scale->setDefault(defParams->wavelet.scale); @@ -2116,6 +2142,8 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit rescon->setDefaultEditedState(Irrelevant); resconH->setDefaultEditedState(Irrelevant); reschro->setDefaultEditedState(Irrelevant); + resblur->setDefaultEditedState(Irrelevant); + resblurc->setDefaultEditedState(Irrelevant); tmrs->setDefaultEditedState(Irrelevant); edgs->setDefaultEditedState(Irrelevant); scale->setDefaultEditedState(Irrelevant); @@ -2648,6 +2676,8 @@ void Wavelet::setBatchMode(bool batchMode) rescon->showEditedCB(); resconH->showEditedCB(); reschro->showEditedCB(); + resblur->showEditedCB(); + resblurc->showEditedCB(); tmrs->showEditedCB(); edgs->showEditedCB(); scale->showEditedCB(); @@ -2736,6 +2766,10 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavresconH, resconH->getTextValue()); } else if (a == reschro) { listener->panelChanged(EvWavreschro, reschro->getTextValue()); + } else if (a == resblur) { + listener->panelChanged(EvWavresblur, resblur->getTextValue()); + } else if (a == resblurc) { + listener->panelChanged(EvWavresblurc, resblurc->getTextValue()); } else if (a == tmrs) { adjusterUpdateUI(a); listener->panelChanged(EvWavtmrs, tmrs->getTextValue()); diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index 0d9081660..15ac97a84 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -85,6 +85,8 @@ private: rtengine::ProcEvent EvWavoffset; rtengine::ProcEvent EvWavsoftwav; rtengine::ProcEvent EvWavblshape; + rtengine::ProcEvent EvWavresblur; + rtengine::ProcEvent EvWavresblurc; void foldAllButMe(GdkEventButton* event, MyExpander *expander); @@ -185,6 +187,8 @@ private: Adjuster* const rescon; Adjuster* const resconH; Adjuster* const reschro; + Adjuster* const resblur; + Adjuster* const resblurc; Adjuster* const tmrs; Adjuster* const edgs; Adjuster* const scale; @@ -273,6 +277,7 @@ private: Gtk::Frame* const chanMixerHLFrame; Gtk::Frame* const chanMixerMidFrame; Gtk::Frame* const chanMixerShadowsFrame; + Gtk::Frame* const blurFrame; Gtk::Frame* const chromaFrame; Gtk::Label* const wavLabels; From ac83695645396b9e185e9c5a4272c80cb8b7f2ba Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 27 Mar 2020 09:27:43 +0100 Subject: [PATCH 047/109] Suppress warning and add tooltips --- rtdata/languages/default | 2 ++ rtengine/improccoordinator.cc | 10 ---------- rtgui/wavelet.cc | 4 +++- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 282327ba5..cac1f6f12 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2276,6 +2276,7 @@ TP_WAVELET_SETTINGS;Wavelet Settings TP_WAVELET_SHA;Sharp mask TP_WAVELET_SHOWMASK;Show wavelet 'mask' TP_WAVELET_SIGMA;Sigma +TP_WAVELET_SIGMA_TOOLTIP;Sigma acts on the relative amplitude of the signal width. The higher it is, the more the effect will be maximum and the more the unsightly effects will appear.\nLow values are recommended for creating tone-mapping in conjonction with usage Shadows/Highlights below 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_SKY;Sky targetting/protection @@ -2310,6 +2311,7 @@ TP_WAVELET_USHARP;Clarity method TP_WAVELET_USHARP_TOOLTIP;Origin : the source file is the file before Wavelet.\nWavelet : the source file is the file including wavelet threatment TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, wavelet settings will be automatically positioned :\nBackground=black, Process=below, level=3...you can change level between 1 and 4.\n\nIf you select Clarity, wavelet settings will be automatically positioned :\nBackground=residual, Process=above, level=7..you can change level between 5 and 10 and wavelet levels. TP_WAVELET_WAVOFFSET;Offset +TP_WAVELET_OFFSET_TOOLTIP;Offset acts on mean of signal.\nHigh values will favor action on the contrast of the highlights.\nLow values will favor action on the contrast of shadows TP_WBALANCE_AUTO;Auto TP_WBALANCE_AUTOITCGREEN;Auto iterate temperature correlation TP_WBALANCE_AUTOOLD;Auto RGB grey diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 45f9f2e56..6374cb837 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -885,10 +885,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } if (WaveParams.softrad > 0.f) { - printf("s1\n"); provradius = new LabImage(pW, pH); provradius->CopyFrom(nprevl); - printf("s2\n"); } @@ -924,13 +922,11 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) WaveParams.expnoise = pronois; if (WaveParams.softrad > 0.f) { - printf("s3\n"); array2D ble(pW, pH); array2D guid(pW, pH); Imagefloat *tmpImage = nullptr; tmpImage = new Imagefloat(pW, pH); - printf("s4\n"); #ifdef _OPENMP #pragma omp parallel for @@ -954,7 +950,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) tmpImage->b(ir, jr) = Z; ble[ir][jr] = Y / 32768.f; } - printf("s5\n"); double epsilmax = 0.0001; double epsilmin = 0.00001; @@ -965,7 +960,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) float blur = 10.f / scale * (0.0001f + 0.8f * WaveParams.softrad); // rtengine::guidedFilter(guid, ble, ble, blur, 0.001, multiTh); rtengine::guidedFilter(guid, ble, ble, blur, epsil, false); - printf("s6\n"); @@ -982,10 +976,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) Color::XYZ2Lab(X, Y, Z, L, a, b); nprevl->L[ir][jr] = L; } - printf("s7\n"); delete tmpImage; - printf("s8\n"); } @@ -1075,11 +1067,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } */ if (WaveParams.softrad > 0.f) { - printf("s9\n"); delete provradius; provradius = NULL; - printf("s10\n"); } diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index cc53a45a2..336aad4d5 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -82,7 +82,7 @@ Wavelet::Wavelet() : showmask(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_SHOWMASK")))), oldsh(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_OLDSH")))), 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.))), + sigma(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMA"), 0.05, 2.5, 0.01, 1.))), offset(Gtk::manage(new Adjuster(M("TP_WAVELET_WAVOFFSET"), 0.33, 1.66, 0.01, 1., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), rescon(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCON"), -100, 100, 1, 0))), resconH(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCONH"), -100, 100, 1, 0))), @@ -351,6 +351,8 @@ Wavelet::Wavelet() : levBox->pack_start(*sigma, Gtk::PACK_SHRINK); offset->setAdjusterListener(this); levBox->pack_start(*offset, Gtk::PACK_SHRINK); + sigma->set_tooltip_text(M("TP_WAVELET_SIGMA_TOOLTIP")); + offset->set_tooltip_text(M("TP_WAVELET_OFFSET_TOOLTIP")); levBox->pack_start(*sup); sup->setAdjusterListener(this); From 95d40e72192096d90efbfa550e85d87603158b6f Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 27 Mar 2020 13:31:46 +0100 Subject: [PATCH 048/109] Clean code ipwavelet --- rtengine/ipwavelet.cc | 155 +----------------------------------------- 1 file changed, 1 insertion(+), 154 deletions(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 461bdc7ac..ede980ee6 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -17,7 +17,7 @@ // // You should have received a copy of the GNU General Public License // along with this program. If not, see . -// * 2014 - 2019 Jacques Desmis +// * 2014 - 2019 2020 - Jacques Desmis // * 2014 Ingo Weyrich // @@ -369,7 +369,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } -// if(settings->verbose) printf("Wav mul 0=%f 1=%f 2=%f 3=%f 4=%f 5=%f 6=%f 7=%f 8=%f 9=%f\n",cp.mul[0],cp.mul[1],cp.mul[2],cp.mul[3],cp.mul[4],cp.mul[5],cp.mul[6],cp.mul[7],cp.mul[8],cp.mul[9]); for (int sc = 0; sc < 9; sc++) { //reduce strength if zoom < 100% for chroma and tuning if (sc == 0) { if (scaleskip[sc] < 1.f) { @@ -425,13 +424,11 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.numlevS = params->wavelet.threshold2; int maxlevS = 9 - cp.numlevH; cp.numlevS = rtengine::min(cp.numlevS, maxlevS); - //printf("levHigh=%d levShad=%d\n",cp.numlevH,cp.numlevS); //highlight cp.b_lhl = static_cast(params->wavelet.hllev.getBottomLeft()); cp.t_lhl = static_cast(params->wavelet.hllev.getTopLeft()); cp.b_rhl = static_cast(params->wavelet.hllev.getBottomRight()); cp.t_rhl = static_cast(params->wavelet.hllev.getTopRight()); - //printf("BL=%f TL=%f BR=%f TR=%f\n",cp.b_lhl,cp.t_lhl,cp.b_rhl,cp.t_rhl); //pastel cp.b_lpast = static_cast(params->wavelet.pastlev.getBottomLeft()); cp.t_lpast = static_cast(params->wavelet.pastlev.getTopLeft()); @@ -458,7 +455,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.lev3n = static_cast(params->wavelet.level3noise.getTop()); cp.detectedge = params->wavelet.medianlev; - //printf("low=%f mean=%f sd=%f max=%f\n",cp.edg_low,cp.edg_mean,cp.edg_sd,cp.edg_max); int minwin = rtengine::min(imwidth, imheight); int maxlevelcrop = 9; @@ -487,7 +483,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const maxlevelcrop = 5; } - // printf("minwin=%d maxcrop=%d\n",minwin, maxlevelcrop); int levwav = params->wavelet.thres; @@ -567,7 +562,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const levwav = rtengine::min(maxlev2, levwav); - //printf("levwav = %d\n",levwav); #ifdef _OPENMP int numthreads = 1; int maxnumberofthreadsforwavelet = 0; @@ -594,7 +588,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const maxnumberofthreadsforwavelet = 8; } - //printf("maxNRT=%d\n",maxnumberofthreadsforwavelet); if ((maxnumberofthreadsforwavelet == 6 || maxnumberofthreadsforwavelet == 8) && levwav == 10) { maxnumberofthreadsforwavelet -= 2; } @@ -604,7 +597,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } - //printf("maxthre=%d\n",maxnumberofthreadsforwavelet); // Calculate number of tiles. If less than omp_get_max_threads(), then limit num_threads to number of tiles @@ -857,141 +849,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (cp.val > 0 || ref || contr) { //edge Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN); } -/* - //here TM wavelet - if(cp.tmena ){ - float mean2[10]; - float meanN2[10]; - float sigma2[10]; - float sigmaN2[10]; - float MaxP2[10]; - float MaxN2[10]; - //calculate mean, amx, etc. - Evaluate2(*Ldecomp, mean2, meanN2, sigma2, sigmaN2, MaxP2, MaxN2); - - int leve = levwavL; - int dir = 3; - int WW = labco->W; - int HH = labco->H; - float ****templevel = nullptr; - templevel = new float***[dir]; - - //allocate memory for 3 DIR n levels, HH, WW - for (int d = 0; d < dir; d++) { - templevel[d] = new float**[leve]; - - for (int k = 0; k < leve; k++) { - templevel[d][k] = new float*[HH]; - - for (int i = 0; i < HH; i++) { - templevel[d][k][i] = new float[WW]; - } - } - } - -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) -#endif - //fill templevel with decomp for each level, each dir,X Y - for (int dir = 1; dir < 4; dir++) { - for (int level = 0; level < levwavL; ++level) { - int W_L = Ldecomp->level_W(level); - int H_L = Ldecomp->level_H(level); - float **wav_L = Ldecomp->level_coeffs(level); - madL[level][dir - 1] = Mad(wav_L[dir], W_L * H_L);//evaluate noise by level - - for (int y = 0; y < H_L; y++) { - for (int x = 0; x < W_L; x++) { - float val = wav_L[dir][y * W_L + x]; - templevel[dir - 1][level][y][x] = val; - } - } - } - } - - - float thres = params->wavelet.threswav; - - bool wavcurvecomp = false;//not enable if 0.75 - - if (wavtmCurve) { - for (int i = 0; i < 500; i++) { - if (wavtmCurve[i] != 0.75) { - wavcurvecomp = true; - } - } - } - - //for each level, dir calculate templevel with compression - for (int dir = 1; dir < 4; dir++) { - for (int level = 0; level < levwavL; ++level) { - int W_L = Ldecomp->level_W(level); - int H_L = Ldecomp->level_H(level); - - if (wavtmCurve && wavcurvecomp) { - float klev = (wavtmCurve[level * 55.5f] - 0.75f); - - if (klev < 0.f) { - klev *= 2.6666f;//compression increase contraste - } else { - klev *= 4.f;//dilatation reduce contraste - detailattenuator - } - - float compression = expf(-klev); - float detailattenuator = klev; - - if (klev < 0.0f) { - detailattenuator = 0.0f; - } - Compresslevels2(templevel[dir - 1][level], W_L, H_L, compression, detailattenuator, thres, mean2[level], MaxP2[level], meanN2[level], MaxN2[level], madL[level][dir - 1]); - } - } - } - - //retrieve decomp -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) -#endif - - for (int dir = 1; dir < 4; dir++) { - for (int level = 0; level < levwavL ; ++level) { - int W_L = Ldecomp->level_W(level); - int H_L = Ldecomp->level_H(level); - float **wav_L = Ldecomp->level_coeffs(level); - - for (int y = 0; y < H_L; y++) { - for (int x = 0; x < W_L; x++) { - wav_L[dir][y * W_L + x] = templevel[dir - 1][level][y][x]; - } - } - } - } - - - //free memory - for (int i = 0; i < dir; i++) { - for (int j = 0; j < leve; j++) { - for (int l = 0; l < HH; l++) { - delete [] templevel[i][j][l]; - } - } - } - - for (int i = 0; i < dir; i++) { - for (int j = 0; j < leve; j++) { - delete [] templevel[i][j]; - } - } - - for (int i = 0; i < dir; i++) { - delete [] templevel[i]; - } - - delete [] templevel; - - } - // end TM wavelet -*/ //init for edge and denoise float vari[4]; @@ -1055,14 +912,12 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (!hhutili) { //always a or b int levwava = levwav; - // printf("Levwava before: %d\n",levwava); if (cp.chrores == 0.f && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels while (levwava > 0 && !cp.diag && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwava - 1] == 0.f)) || (cp.CHmet != 2 && (levwava == 10 || (!cp.curv || cp.mulC[levwava - 1] == 0.f))))) && (!cp.opaRG || levwava == 10 || (cp.opaRG && cp.mulopaRG[levwava - 1] == 0.f)) && ((levwava == 10 || (cp.CHSLmet == 1 && cp.mulC[levwava - 1] == 0.f)))) { levwava--; } } - //printf("Levwava after: %d\n",levwava); if (levwava > 0) { const std::unique_ptr adecomp(new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwava, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); @@ -1074,14 +929,12 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const int levwavb = levwav; - //printf("Levwavb before: %d\n",levwavb); if (cp.chrores == 0.f && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels while (levwavb > 0 && !cp.diag && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwavb - 1] == 0.f)) || (cp.CHmet != 2 && (levwavb == 10 || (!cp.curv || cp.mulC[levwavb - 1] == 0.f))))) && (!cp.opaBY || levwavb == 10 || (cp.opaBY && cp.mulopaBY[levwavb - 1] == 0.f)) && ((levwavb == 10 || (cp.CHSLmet == 1 && cp.mulC[levwavb - 1] == 0.f)))) { levwavb--; } } - // printf("Levwavb after: %d\n",levwavb); if (levwavb > 0) { const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); @@ -1093,14 +946,12 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } else {// a and b int levwavab = levwav; - // printf("Levwavab before: %d\n",levwavab); if (cp.chrores == 0.f && !hhutili && params->wavelet.CLmethod == "all") { // no processing of residual ab => we probably can reduce the number of levels while (levwavab > 0 && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwavab - 1] == 0.f)) || (cp.CHmet != 2 && (levwavab == 10 || (!cp.curv || cp.mulC[levwavab - 1] == 0.f))))) && (!cp.opaRG || levwavab == 10 || (cp.opaRG && cp.mulopaRG[levwavab - 1] == 0.f)) && ((levwavab == 10 || (cp.CHSLmet == 1 && cp.mulC[levwavab - 1] == 0.f)))) { levwavab--; } } - // printf("Levwavab after: %d\n",levwavab); if (levwavab > 0) { const std::unique_ptr adecomp(new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); @@ -1758,7 +1609,6 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } - // printf("MAXmax0=%f MINmin0=%f\n",max0,min0); //tone mapping if (cp.tonemap && cp.contmet == 2 && cp.resena) { @@ -2400,7 +2250,6 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, const cont_params& cp, floa { int borderL = 2; -// printf("cpedth=%f\n",cp.eddetthr); if (cp.eddetthr < 30.f) { borderL = 1; @@ -3571,7 +3420,6 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f } if (cp.bam && cp.diag) { -//printf("OK Chroma\n"); if (cp.opaW && cp.BAmet == 2) { int iteration = cp.ite; int itplus = 7 + iteration; @@ -3901,7 +3749,6 @@ void ImProcFunctions::Compresslevels2(float **Source, int W_L, int H_L, float co float exponent; - // printf("maxp=%f maxn=%f\n", maxp, maxn); if (detailattenuator > 0.f && detailattenuator < 0.05f) { float betemp = expf(-(2.f - detailattenuator + 0.693147f)) - 1.f; //0.69315 = log(2) exponent = 1.2f * xlogf(-betemp); From d10ff9e816f6ad38d3fe7b6712576ca3ef627976 Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 27 Mar 2020 16:21:17 +0100 Subject: [PATCH 049/109] Wavelet Improvment to GUI Residual --- rtdata/languages/default | 4 +++- rtgui/wavelet.cc | 48 ++++++++++++++++++++++++++-------------- rtgui/wavelet.h | 2 ++ 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index cac1f6f12..5c29a9bd0 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2168,6 +2168,7 @@ TP_WAVELET_COMPGAMMA;Compression gamma TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram. TP_WAVELET_COMPTM;Tone mapping TP_WAVELET_CONTEDIT;'After' contrast curve +TP_WAVELET_CONTFRAME;Contrast - Compression TP_WAVELET_CONTR;Gamut TP_WAVELET_CONTRA;Contrast TP_WAVELET_CONTRAST_MINUS;Contrast - @@ -2254,7 +2255,7 @@ TP_WAVELET_NPLOW;Low TP_WAVELET_NPNONE;None TP_WAVELET_NPTYPE;Neighboring pixels TP_WAVELET_NPTYPE_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced. -TP_WAVELET_OLDSH;Old algorithm using negatives values +TP_WAVELET_OLDSH;Algorithm using negatives values TP_WAVELET_OPACITY;Opacity Blue-Yellow TP_WAVELET_OPACITYW;Contrast balance d/v-h curve TP_WAVELET_OPACITYWL;Final local contrast @@ -2274,6 +2275,7 @@ TP_WAVELET_RESID;Residual Image TP_WAVELET_SAT;Saturated chroma TP_WAVELET_SETTINGS;Wavelet Settings TP_WAVELET_SHA;Sharp mask +TP_WAVELET_SHFRAME;Shadows/Highlights TP_WAVELET_SHOWMASK;Show wavelet 'mask' TP_WAVELET_SIGMA;Sigma TP_WAVELET_SIGMA_TOOLTIP;Sigma acts on the relative amplitude of the signal width. The higher it is, the more the effect will be maximum and the more the unsightly effects will appear.\nLow values are recommended for creating tone-mapping in conjonction with usage Shadows/Highlights below diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 336aad4d5..5ad6fda55 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -151,6 +151,8 @@ Wavelet::Wavelet() : chanMixerHLFrame(Gtk::manage(new Gtk::Frame(M("TP_COLORTONING_HIGHLIGHT")))), chanMixerMidFrame(Gtk::manage(new Gtk::Frame(M("TP_COLORTONING_MIDTONES")))), chanMixerShadowsFrame(Gtk::manage(new Gtk::Frame(M("TP_COLORTONING_SHADOWS")))), + shFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_SHFRAME")))), + contFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_CONTFRAME")))), blurFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_BLURFRAME")))), chromaFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_CHROMAFRAME")))), wavLabels(Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER))), @@ -726,26 +728,33 @@ Wavelet::Wavelet() : ToolParamBlock* const resBox = Gtk::manage(new ToolParamBlock()); oldsh->set_active(true); oldshConn = oldsh->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::oldshToggled)); - resBox->pack_start(*oldsh); + rescon->setAdjusterListener(this); - resBox->pack_start(*rescon, Gtk::PACK_SHRINK); - resBox->pack_start(*thr); thr->setAdjusterListener(this); resconH->setAdjusterListener(this); - resBox->pack_start(*resconH, Gtk::PACK_SHRINK); thrH->setAdjusterListener(this); - resBox->pack_start(*thrH, Gtk::PACK_SHRINK); radius->setAdjusterListener(this); - resBox->pack_start(*radius, Gtk::PACK_SHRINK); + radius->hide(); + + shFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const shBox = Gtk::manage(new ToolParamBlock()); + shBox->pack_start(*oldsh); + shBox->pack_start(*rescon, Gtk::PACK_SHRINK); + shBox->pack_start(*thr); + shBox->pack_start(*resconH, Gtk::PACK_SHRINK); + shBox->pack_start(*thrH, Gtk::PACK_SHRINK); + shBox->pack_start(*radius, Gtk::PACK_SHRINK); + shFrame->add(*shBox); + resBox->pack_start(*shFrame); + contrast->set_tooltip_text(M("TP_WAVELET_CONTRA_TOOLTIP")); contrast->setAdjusterListener(this); - resBox->pack_start(*contrast); //keep the possibility to reinstall reschro->setAdjusterListener(this); resblur->setAdjusterListener(this); @@ -768,36 +777,42 @@ Wavelet::Wavelet() : Gtk::HBox* const ctboxTM = Gtk::manage(new Gtk::HBox()); ctboxTM->pack_start(*labmTM, Gtk::PACK_SHRINK, 1); - Gtk::HSeparator* const separatorR0 = Gtk::manage(new Gtk::HSeparator()); - resBox->pack_start(*separatorR0, Gtk::PACK_SHRINK, 2); +// Gtk::HSeparator* const separatorR0 = Gtk::manage(new Gtk::HSeparator()); +// resBox->pack_start(*separatorR0, Gtk::PACK_SHRINK, 2); TMmethod->append(M("TP_WAVELET_COMPCONT")); TMmethod->append(M("TP_WAVELET_COMPTM")); TMmethodconn = TMmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::TMmethodChanged)); ctboxTM->pack_start(*TMmethod); - resBox->pack_start(*ctboxTM); tmrs->set_tooltip_text(M("TP_WAVELET_TMSTRENGTH_TOOLTIP")); - resBox->pack_start(*tmrs); tmrs->setAdjusterListener(this); gamma->set_tooltip_text(M("TP_WAVELET_COMPGAMMA_TOOLTIP")); - resBox->pack_start(*gamma); gamma->setAdjusterListener(this); //edgs->set_tooltip_text(M("TP_WAVELET_TMEDGS_TOOLTIP")); - resBox->pack_start(*edgs); edgs->setAdjusterListener(this); //scale->set_tooltip_text(M("TP_WAVELET_TMSCALE_TOOLTIP")); - resBox->pack_start(*scale); scale->setAdjusterListener(this); - Gtk::HSeparator* const separatorR1 = Gtk::manage(new Gtk::HSeparator()); - resBox->pack_start(*separatorR1, Gtk::PACK_SHRINK, 2); + contFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const contBox = Gtk::manage(new ToolParamBlock()); + contBox->pack_start(*contrast); //keep the possibility to reinstall + contBox->pack_start(*ctboxTM); + contBox->pack_start(*tmrs); + contBox->pack_start(*gamma); + contBox->pack_start(*edgs); + contBox->pack_start(*scale); + contFrame->add(*contBox); + resBox->pack_start(*contFrame); + +// Gtk::HSeparator* const separatorR1 = Gtk::manage(new Gtk::HSeparator()); +// resBox->pack_start(*separatorR1, Gtk::PACK_SHRINK, 2); hueskin2->set_tooltip_markup(M("TP_WAVELET_HUESKY_TOOLTIP")); hueskin2->setBgGradient(milestones); @@ -1577,6 +1592,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) //BackmethodUpdateUI(); CLmethodUpdateUI(); lipstUpdateUI(); + oldshToggled(); //TilesmethodUpdateUI(); //daubcoeffmethodUpdateUI(); //DirmethodUpdateUI(); diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index 15ac97a84..635d8c7a7 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -277,6 +277,8 @@ private: Gtk::Frame* const chanMixerHLFrame; Gtk::Frame* const chanMixerMidFrame; Gtk::Frame* const chanMixerShadowsFrame; + Gtk::Frame* const shFrame; + Gtk::Frame* const contFrame; Gtk::Frame* const blurFrame; Gtk::Frame* const chromaFrame; From a61463447ab90b6602f89050125030870ef75865 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 28 Mar 2020 08:35:00 +0100 Subject: [PATCH 050/109] Improvment to Blur levels --- rtdata/languages/default | 6 +++--- rtengine/ipwavelet.cc | 16 +++++++++------- rtengine/procparams.cc | 8 ++++---- rtengine/procparams.h | 2 +- rtgui/paramsedited.cc | 8 ++++---- rtgui/paramsedited.h | 2 +- rtgui/wavelet.cc | 29 ++++++++++++++--------------- rtgui/wavelet.h | 4 ++-- 8 files changed, 38 insertions(+), 37 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 5c29a9bd0..a46f09a88 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -803,7 +803,7 @@ HISTORY_MSG_WAVSOFTRAD;Soft radius clarity HISTORY_MSG_WAVSOFTRADEND;Soft radius final HISTORY_MSG_WAVUSHAMET;Clarity method HISTORY_MSG_THRESWAV;Balance threshold -HISTORY_MSG_SOFTWAV;Soft radius +HISTORY_MSG_BLUWAV;Maximum blur HISTORY_MSG_WAVOLDSH;Old algorithm HISTORY_MSG_WAVOFFSET;Offset HISTORY_MSG_BLSHAPE;Blur by level @@ -2145,6 +2145,7 @@ TP_WAVELET_BASLI;Slider TP_WAVELET_BATYPE;Contrast balance method TP_WAVELET_BLCURVE;Blur by levels TP_WAVELET_BLURFRAME;Blur +TP_WAVELET_BLUWAV;Maximum Blur TP_WAVELET_CBENAB;Toning and Color Balance TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted TP_WAVELET_CCURVE;Local contrast @@ -2284,7 +2285,6 @@ TP_WAVELET_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are tr TP_WAVELET_SKY;Sky targetting/protection TP_WAVELET_SKY_TOOLTIP;At -100 sky-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 sky-tones are protected while all other tones are affected. TP_WAVELET_SOFTRAD;Soft Radius -TP_WAVELET_SOFWAV;Soft Radius TP_WAVELET_STREN;Strength TP_WAVELET_STRENGTH;Strength TP_WAVELET_SUPE;Extra @@ -2313,7 +2313,7 @@ TP_WAVELET_USHARP;Clarity method TP_WAVELET_USHARP_TOOLTIP;Origin : the source file is the file before Wavelet.\nWavelet : the source file is the file including wavelet threatment TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, wavelet settings will be automatically positioned :\nBackground=black, Process=below, level=3...you can change level between 1 and 4.\n\nIf you select Clarity, wavelet settings will be automatically positioned :\nBackground=residual, Process=above, level=7..you can change level between 5 and 10 and wavelet levels. TP_WAVELET_WAVOFFSET;Offset -TP_WAVELET_OFFSET_TOOLTIP;Offset acts on mean of signal.\nHigh values will favor action on the contrast of the highlights.\nLow values will favor action on the contrast of shadows +TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between shadows and highlights.\n High values will amplify the contrast increase of the highlights, while low values will amplify the contrast increase of the shadows. TP_WBALANCE_AUTO;Auto TP_WBALANCE_AUTOITCGREEN;Auto iterate temperature correlation TP_WBALANCE_AUTOOLD;Auto RGB grey diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index ede980ee6..99b915c65 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -67,6 +67,7 @@ struct cont_params { float conresH; float blurres; float blurcres; + float bluwav; float radius; float chrores; bool oldsh; @@ -399,6 +400,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.oldsh = waparams.oldsh; cp.blurres = waparams.resblur; cp.blurcres = waparams.resblurc; + cp.bluwav = 0.01f * waparams.bluwav; //cp.hueres=waparams.reshue; cp.hueres = 2.f; cp.th = float(waparams.thr); @@ -1766,7 +1768,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * //Blur luma if(cp.blurres != 0.f && cp.resena) { - float rad = cp.blurres / skip; + float rad = 0.7f * cp.blurres / skip; float * bef = new float[W_L * H_L]; float * aft = new float[W_L * H_L]; @@ -1951,7 +1953,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * ContAllL(koeLi, maxkoeLi, true, maxlvl, labco, varhue, varchrom, WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); //blur levels float klev = 1.f; - if(wavblcurve && wavcurvecomp && cp.blena) { + if(wavblcurve && wavcurvecomp && cp.blena && cp.bluwav > 0.f) { float * bef = new float[Wlvl_L * Hlvl_L]; float * aft = new float[Wlvl_L * Hlvl_L]; @@ -1961,7 +1963,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } klev = (wavblcurve[lvl * 55.5f]); - klev *= lvl * 50.f / skip; + klev *= cp.bluwav * lvl * 15.f / skip; boxblur(bef, aft, klev, Wlvl_L, Hlvl_L, false); for (int co = 0; co < Hlvl_L * Wlvl_L; co++) { @@ -2173,7 +2175,7 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float //Blur chroma if(cp.blurcres != 0.f && cp.resena) { - float rad = cp.blurcres / skip; + float rad = 0.7f * cp.blurcres / skip; float * bef = new float[W_L * H_L]; float * aft = new float[W_L * H_L]; @@ -2204,7 +2206,7 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float #ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif - + for (int dir = 1; dir < 4; dir++) { for (int lvl = 0; lvl < maxlvl; lvl++) { @@ -2214,7 +2216,7 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); ContAllAB(labco, maxlvl, varhue, varchrom, WavCoeffs_ab, WavCoeffs_ab0, lvl, dir, waOpacityCurveW, cp, Wlvl_ab, Hlvl_ab, useChannelA); - if(wavblcurve && wavcurvecomp && cp.blena && cp.chrwav > 0.f) { + if(wavblcurve && wavcurvecomp && cp.blena && cp.chrwav > 0.f && cp.bluwav > 0.f) { float * bef = new float[Wlvl_ab * Hlvl_ab]; float * aft = new float[Wlvl_ab * Hlvl_ab]; float klev; @@ -2223,7 +2225,7 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float } klev = (wavblcurve[lvl * 55.5f]); - klev *= cp.chrwav * lvl * 100.f / skip; + klev *= cp.bluwav * cp.chrwav * lvl * 25.f / skip; boxblur(bef, aft, klev, Wlvl_ab, Hlvl_ab, false); diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 574e4f3a2..20ae540f5 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2318,7 +2318,7 @@ WaveletParams::WaveletParams() : radius(40), skinprotect(0.0), chrwav(0.), - softwav(1.0), + bluwav(50.0), hueskin(-5, 25, 170, 120, false), hueskin2(-260, -250, -130, -140, false), hllev(50, 75, 100, 98, false), @@ -2433,7 +2433,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && radius == other.radius && skinprotect == other.skinprotect && chrwav == other.chrwav - && softwav == other.softwav + && bluwav == other.bluwav && hueskin == other.hueskin && hueskin2 == other.hueskin2 && hllev == other.hllev @@ -3588,7 +3588,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.lipst, "Wavelet", "Lipst", wavelet.lipst, keyFile); saveToKeyfile(!pedited || pedited->wavelet.skinprotect, "Wavelet", "Skinprotect", wavelet.skinprotect, keyFile); saveToKeyfile(!pedited || pedited->wavelet.chrwav, "Wavelet", "chrwav", wavelet.chrwav, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.softwav, "Wavelet", "Softwav", wavelet.softwav, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.bluwav, "Wavelet", "bluwav", wavelet.bluwav, keyFile); saveToKeyfile(!pedited || pedited->wavelet.hueskin, "Wavelet", "Hueskin", wavelet.hueskin.toVector(), keyFile); saveToKeyfile(!pedited || pedited->wavelet.edgrad, "Wavelet", "Edgrad", wavelet.edgrad, keyFile); saveToKeyfile(!pedited || pedited->wavelet.edgval, "Wavelet", "Edgval", wavelet.edgval, keyFile); @@ -4894,7 +4894,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "Skinprotect", pedited, wavelet.skinprotect, pedited->wavelet.skinprotect); assignFromKeyfile(keyFile, "Wavelet", "chrwav", pedited, wavelet.chrwav, pedited->wavelet.chrwav); - assignFromKeyfile(keyFile, "Wavelet", "Softwav", pedited, wavelet.softwav, pedited->wavelet.softwav); + assignFromKeyfile(keyFile, "Wavelet", "bluwav", pedited, wavelet.bluwav, pedited->wavelet.bluwav); assignFromKeyfile(keyFile, "Wavelet", "Expcontrast", pedited, wavelet.expcontrast, pedited->wavelet.expcontrast); assignFromKeyfile(keyFile, "Wavelet", "Expchroma", pedited, wavelet.expchroma, pedited->wavelet.expchroma); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 62ca88690..8ca3e5c29 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1277,7 +1277,7 @@ struct WaveletParams { int radius; double skinprotect; double chrwav; - double softwav; + double bluwav; Threshold hueskin; Threshold hueskin2; Threshold hllev; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 4dc81fc5f..b3c2b64d7 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -546,7 +546,7 @@ void ParamsEdited::set(bool v) wavelet.bllev = v; wavelet.edgcont = v; wavelet.chrwav = v; - wavelet.softwav = v; + wavelet.bluwav = v; wavelet.level0noise = v; wavelet.level1noise = v; wavelet.level2noise = v; @@ -1149,7 +1149,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.bllev = wavelet.bllev && p.wavelet.bllev == other.wavelet.bllev; wavelet.edgcont = wavelet.edgcont && p.wavelet.edgcont == other.wavelet.edgcont; wavelet.chrwav = wavelet.chrwav && p.wavelet.chrwav == other.wavelet.chrwav; - wavelet.softwav = wavelet.softwav && p.wavelet.softwav == other.wavelet.softwav; + wavelet.bluwav = wavelet.bluwav && p.wavelet.bluwav == other.wavelet.bluwav; wavelet.level0noise = wavelet.level0noise && p.wavelet.level0noise == other.wavelet.level0noise; wavelet.level1noise = wavelet.level1noise && p.wavelet.level1noise == other.wavelet.level1noise; wavelet.level2noise = wavelet.level2noise && p.wavelet.level2noise == other.wavelet.level2noise; @@ -3061,8 +3061,8 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.chrwav = mods.wavelet.chrwav; } - if (wavelet.softwav) { - toEdit.wavelet.softwav = mods.wavelet.softwav; + if (wavelet.bluwav) { + toEdit.wavelet.bluwav = mods.wavelet.bluwav; } if (wavelet.level0noise) { diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index de688d856..43254b015 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -562,7 +562,7 @@ struct WaveletParamsEdited { bool bllev; bool edgcont; bool chrwav; - bool softwav; + bool bluwav; bool level0noise; bool level1noise; bool level2noise; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 5ad6fda55..be7c74015 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -89,6 +89,7 @@ Wavelet::Wavelet() : reschro(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCHRO"), -100, 100, 1, 0))), resblur(Gtk::manage(new Adjuster(M("TP_WAVELET_RESBLUR"), 0, 100, 1, 0))), resblurc(Gtk::manage(new Adjuster(M("TP_WAVELET_RESBLURC"), 0, 100, 1, 0))), + bluwav(Gtk::manage(new Adjuster(M("TP_WAVELET_BLUWAV"), 0.0, 100.0, 0.5, 50.))), tmrs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMSTRENGTH"), -1.0, 2.0, 0.01, 0.0))), edgs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMEDGS"), 0.1, 4.0, 0.01, 1.4))), scale(Gtk::manage(new Adjuster(M("TP_WAVELET_TMSCALE"), 0.1, 10.0, 0.01, 1.0))), @@ -132,7 +133,6 @@ Wavelet::Wavelet() : softrad(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.5, 0.))), softradend(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.5, 0.))), chrwav(Gtk::manage(new Adjuster(M("TP_WAVELET_CHRWAV"), 0., 100., 0., 0.))), - softwav(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFWAV"), -10.0, 1000.0, 0.5, 1.))), Lmethod(Gtk::manage(new MyComboBoxText())), CHmethod(Gtk::manage(new MyComboBoxText())), CHSLmethod(Gtk::manage(new MyComboBoxText())), @@ -190,7 +190,7 @@ Wavelet::Wavelet() : EvWavchrwav = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_chrwav"); EvWavoldsh = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVOLDSH"); EvWavoffset = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVOFFSET"); - EvWavsoftwav = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SOFTWAV"); + EvWavbluwav = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLUWAV"); EvWavblshape = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLSHAPE"); EvWavresblur = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLURWAV"); EvWavresblurc = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLURCWAV"); @@ -663,15 +663,14 @@ Wavelet::Wavelet() : curveEditorbl->curveListComplete(); curveEditorbl->show(); + blBox->pack_start(*bluwav); + bluwav->setAdjusterListener(this); blBox->pack_start(*curveEditorbl, Gtk::PACK_SHRINK, 4); chrwav->setAdjusterListener(this); blBox->pack_start(*chrwav); - softwav->setLogScale(10, -10); - softwav->setAdjusterListener(this); -// blBox->pack_start(*softwav); // Gamut @@ -1357,7 +1356,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) satlev->setValue(pp->wavelet.satlev); edgcont->setValue(pp->wavelet.edgcont); chrwav->setValue(pp->wavelet.chrwav); - softwav->setValue(pp->wavelet.softwav); + bluwav->setValue(pp->wavelet.bluwav); greenlow->setValue(pp->wavelet.greenlow); bluelow->setValue(pp->wavelet.bluelow); @@ -1536,7 +1535,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) strength->setEditedState(pedited->wavelet.strength ? Edited : UnEdited); edgcont->setEditedState(pedited->wavelet.edgcont ? Edited : UnEdited); chrwav->setEditedState(pedited->wavelet.chrwav ? Edited : UnEdited); - softwav->setEditedState(pedited->wavelet.softwav ? Edited : UnEdited); + bluwav->setEditedState(pedited->wavelet.bluwav ? Edited : UnEdited); level0noise->setEditedState(pedited->wavelet.level0noise ? Edited : UnEdited); level1noise->setEditedState(pedited->wavelet.level1noise ? Edited : UnEdited); level2noise->setEditedState(pedited->wavelet.level2noise ? Edited : UnEdited); @@ -1712,7 +1711,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.bllev = bllev->getValue (); pp->wavelet.edgcont = edgcont->getValue (); pp->wavelet.chrwav = chrwav->getValue(); - pp->wavelet.softwav = softwav->getValue(); + pp->wavelet.bluwav = bluwav->getValue(); pp->wavelet.level0noise = level0noise->getValue (); pp->wavelet.level1noise = level1noise->getValue (); pp->wavelet.level2noise = level2noise->getValue (); @@ -1825,7 +1824,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.blcurve = !blshape->isUnChanged(); pedited->wavelet.edgcont = edgcont->getEditedState(); pedited->wavelet.chrwav = chrwav->getEditedState(); - pedited->wavelet.softwav = softwav->getEditedState(); + pedited->wavelet.bluwav = bluwav->getEditedState(); pedited->wavelet.level0noise = level0noise->getEditedState(); pedited->wavelet.level1noise = level1noise->getEditedState(); pedited->wavelet.level2noise = level2noise->getEditedState(); @@ -2070,7 +2069,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit satlev->setDefault (defParams->wavelet.satlev); edgcont->setDefault (defParams->wavelet.edgcont); chrwav->setDefault(defParams->wavelet.chrwav); - softwav->setDefault(defParams->wavelet.softwav); + bluwav->setDefault(defParams->wavelet.bluwav); level0noise->setDefault (defParams->wavelet.level0noise); level1noise->setDefault (defParams->wavelet.level1noise); level2noise->setDefault (defParams->wavelet.level2noise); @@ -2138,7 +2137,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit satlev->setDefaultEditedState(pedited->wavelet.satlev ? Edited : UnEdited); edgcont->setDefaultEditedState(pedited->wavelet.edgcont ? Edited : UnEdited); chrwav->setDefaultEditedState(pedited->wavelet.chrwav ? Edited : UnEdited); - softwav->setDefaultEditedState(pedited->wavelet.softwav ? Edited : UnEdited); + bluwav->setDefaultEditedState(pedited->wavelet.bluwav ? Edited : UnEdited); strength->setDefaultEditedState(pedited->wavelet.strength ? Edited : UnEdited); balance->setDefaultEditedState(pedited->wavelet.balance ? Edited : UnEdited); iter->setDefaultEditedState(pedited->wavelet.iter ? Edited : UnEdited); @@ -2192,7 +2191,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit bllev->setDefaultEditedState(Irrelevant); edgcont->setDefaultEditedState(Irrelevant); chrwav->setDefaultEditedState(Irrelevant); - softwav->setDefaultEditedState(Irrelevant); + bluwav->setDefaultEditedState(Irrelevant); level0noise->setDefaultEditedState(Irrelevant); level1noise->setDefaultEditedState(Irrelevant); level2noise->setDefaultEditedState(Irrelevant); @@ -2728,7 +2727,7 @@ void Wavelet::setBatchMode(bool batchMode) satlev->showEditedCB(); edgcont->showEditedCB(); chrwav->showEditedCB(); - softwav->showEditedCB(); + bluwav->showEditedCB(); strength->showEditedCB(); balance->showEditedCB(); iter->showEditedCB(); @@ -2899,8 +2898,8 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavbluelow, bluelow->getTextValue()); } else if (a == chrwav) { listener->panelChanged(EvWavchrwav, chrwav->getTextValue()); - } else if (a == softwav) { - listener->panelChanged(EvWavsoftwav, softwav->getTextValue()); + } else if (a == bluwav) { + listener->panelChanged(EvWavbluwav, bluwav->getTextValue()); } if ((a == correction[0] || a == correction[1] || a == correction[2] || a == correction[3] || a == correction[4] || a == correction[5] || a == correction[6] || a == correction[7] || a == correction[8])) { diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index 635d8c7a7..67a45b5ac 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -83,7 +83,7 @@ private: rtengine::ProcEvent EvWavchrwav; rtengine::ProcEvent EvWavoldsh; rtengine::ProcEvent EvWavoffset; - rtengine::ProcEvent EvWavsoftwav; + rtengine::ProcEvent EvWavbluwav; rtengine::ProcEvent EvWavblshape; rtengine::ProcEvent EvWavresblur; rtengine::ProcEvent EvWavresblurc; @@ -189,6 +189,7 @@ private: Adjuster* const reschro; Adjuster* const resblur; Adjuster* const resblurc; + Adjuster* const bluwav; Adjuster* const tmrs; Adjuster* const edgs; Adjuster* const scale; @@ -241,7 +242,6 @@ private: Adjuster* const softrad; Adjuster* const softradend; Adjuster* const chrwav; - Adjuster* const softwav; MyComboBoxText* const Lmethod; sigc::connection Lmethodconn; From fcc6306f9ea54dfadb5da6309f3b3d4aaf7e5666 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 28 Mar 2020 14:28:08 +0100 Subject: [PATCH 051/109] dcraw_matrix for FUJIFILM X100V --- rtengine/camconst.json | 1 + 1 file changed, 1 insertion(+) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 44e01ea99..73699b632 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1297,6 +1297,7 @@ Camera constants: { // Quality C "make_model": [ "FUJIFILM X100V" ], + "dcraw_matrix": [ 13426,-6334,-1177,-4244,12136,2371,-580,1303,5980 ], // DNG_v12.2 D65 "raw_crop": [ 0, 5, 6252, 4140 ] }, From 15204fa9bd4cee1a77e1b408245bbb08912f38ac Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 28 Mar 2020 16:34:10 +0100 Subject: [PATCH 052/109] dcraw_matrix for FUJIFILM X-T4 --- rtengine/camconst.json | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 73699b632..8bed22437 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1296,7 +1296,7 @@ Camera constants: }, { // Quality C - "make_model": [ "FUJIFILM X100V" ], + "make_model": [ "FUJIFILM X100V", "FUJIFILM X-T4" ], "dcraw_matrix": [ 13426,-6334,-1177,-4244,12136,2371,-580,1303,5980 ], // DNG_v12.2 D65 "raw_crop": [ 0, 5, 6252, 4140 ] }, @@ -1389,11 +1389,6 @@ Camera constants: "raw_crop": [ 0, 5, 6252, 4176] }, - { // Quality C, only raw crop - "make_model": [ "FUJIFILM X-T4" ], - "raw_crop": [ 0, 5, 6252, 4140] - }, - { // Quality B "make_model": "FUJIFILM X30", "dcraw_matrix": [ 12328,-5256,-1144,-4469,12927,1675,-87,1291,4351 ], // DNG_v8.7 D65 From 7d333198937102dbf6c7e437ecf9368b9d28eedd Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 29 Mar 2020 08:00:48 +0200 Subject: [PATCH 053/109] small change to blur - change label and tooltip --- rtdata/languages/default | 6 +++--- rtengine/ipwavelet.cc | 15 +++++++++++---- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index a46f09a88..d4fb356e0 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2278,8 +2278,8 @@ TP_WAVELET_SETTINGS;Wavelet Settings TP_WAVELET_SHA;Sharp mask TP_WAVELET_SHFRAME;Shadows/Highlights TP_WAVELET_SHOWMASK;Show wavelet 'mask' -TP_WAVELET_SIGMA;Sigma -TP_WAVELET_SIGMA_TOOLTIP;Sigma acts on the relative amplitude of the signal width. The higher it is, the more the effect will be maximum and the more the unsightly effects will appear.\nLow values are recommended for creating tone-mapping in conjonction with usage Shadows/Highlights below +TP_WAVELET_SIGMA;Effects +TP_WAVELET_SIGMA_TOOLTIP;This slider controls how wide the range of contrast values are that receive the maximum effect from the tool.\n The higher it is, the more contrast values will be strongly modified and the higher the risk to generate artifacts. The lower it is, the more pinpoint will the effect be applied to a certain range of contrast values 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_SKY;Sky targetting/protection @@ -2313,7 +2313,7 @@ TP_WAVELET_USHARP;Clarity method TP_WAVELET_USHARP_TOOLTIP;Origin : the source file is the file before Wavelet.\nWavelet : the source file is the file including wavelet threatment TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, wavelet settings will be automatically positioned :\nBackground=black, Process=below, level=3...you can change level between 1 and 4.\n\nIf you select Clarity, wavelet settings will be automatically positioned :\nBackground=residual, Process=above, level=7..you can change level between 5 and 10 and wavelet levels. TP_WAVELET_WAVOFFSET;Offset -TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between shadows and highlights.\n High values will amplify the contrast increase of the highlights, while low values will amplify the contrast increase of the shadows. +TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between shadows and highlights.\n High values will amplify the contrast enhancement of the highlights, while low values will amplify the contrast enhancement of the shadows. Along with a low Max. effect value will help you selecting the contrasts that will be enhanced TP_WBALANCE_AUTO;Auto TP_WBALANCE_AUTOITCGREEN;Auto iterate temperature correlation TP_WBALANCE_AUTOOLD;Auto RGB grey diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 99b915c65..125808336 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1951,7 +1951,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl); ContAllL(koeLi, maxkoeLi, true, maxlvl, labco, varhue, varchrom, WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); - //blur levels + //blur level float klev = 1.f; if(wavblcurve && wavcurvecomp && cp.blena && cp.bluwav > 0.f) { @@ -1962,8 +1962,11 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * bef[co] = WavCoeffs_L[dir][co]; } klev = (wavblcurve[lvl * 55.5f]); - - klev *= cp.bluwav * lvl * 15.f / skip; + float lvr = lvl; + if(lvr == 0) { + lvr = 1; + } + klev *= cp.bluwav * lvr * 10.f / skip; boxblur(bef, aft, klev, Wlvl_L, Hlvl_L, false); for (int co = 0; co < Hlvl_L * Wlvl_L; co++) { @@ -2224,8 +2227,12 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float bef[co] = WavCoeffs_ab[dir][co]; } klev = (wavblcurve[lvl * 55.5f]); + float lvr = lvl; + if(lvr == 0) { + lvr = 1; + } - klev *= cp.bluwav * cp.chrwav * lvl * 25.f / skip; + klev *= cp.bluwav * cp.chrwav * lvr * 20.f / skip; boxblur(bef, aft, klev, Wlvl_ab, Hlvl_ab, false); From 3f6ab0622227249f2c7b030d418a7f766f2dbfd4 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 29 Mar 2020 10:29:40 +0200 Subject: [PATCH 054/109] Change threshold from 5 to 32.7 in aver and sigma --- rtengine/ipwavelet.cc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 125808336..8c15f51c5 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -851,7 +851,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (cp.val > 0 || ref || contr) { //edge Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN); } - + //init for edge and denoise float vari[4]; @@ -1234,7 +1234,7 @@ void ImProcFunctions::Aver(float * RESTRICT DataList, int datalen, float &averag int countP = 0, countN = 0; double averaP = 0.0, averaN = 0.0; // use double precision for large summations - constexpr float thres = 5.f;//different fom zero to take into account only data large enough + constexpr float thres = 32.7f;//different fom zero to take into account only data large enough 32.7 = 0.1 in range 0..100 very low value max = 0.f; min = RT_INFINITY_F; #ifdef _OPENMP @@ -1286,7 +1286,7 @@ void ImProcFunctions::Sigma(float * RESTRICT DataList, int datalen, float avera { int countP = 0, countN = 0; double variP = 0.0, variN = 0.0; // use double precision for large summations - float thres = 5.f;//different fom zero to take into account only data large enough + float thres = 32.7f;//different fom zero to take into account only data large enough 32.7 = 0.1 in range 0..100 #ifdef _OPENMP #pragma omp parallel for reduction(+:variP,variN,countP,countN) num_threads(wavNestedLevels) if(wavNestedLevels>1) @@ -2580,6 +2580,10 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz scaleskip[sc] = scales[sc] / skip; } + if (settings->verbose) { + printf("level=%i mean=%f sigma=%f maxp=%f\n", level, mean[level], sigma[level], MaxP[level]); + } + constexpr float t_r = 40.f; constexpr float t_l = 10.f; constexpr float b_r = 75.f; From bdb7409d11a77b164f3a42e7fb18fdb93436094d Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 29 Mar 2020 13:29:37 +0200 Subject: [PATCH 055/109] Change extra slider in GUI --- rtgui/wavelet.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index be7c74015..2e444ff3d 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -348,6 +348,10 @@ Wavelet::Wavelet() : correction[i]->setAdjusterListener(this); levBox->pack_start(*correction[i]); } + levBox->pack_start(*sup); + sup->setAdjusterListener(this); + Gtk::HSeparator* const separatorcont = Gtk::manage(new Gtk::HSeparator()); + levBox->pack_start(*separatorcont); sigma->setAdjusterListener(this); levBox->pack_start(*sigma, Gtk::PACK_SHRINK); @@ -356,8 +360,6 @@ Wavelet::Wavelet() : sigma->set_tooltip_text(M("TP_WAVELET_SIGMA_TOOLTIP")); offset->set_tooltip_text(M("TP_WAVELET_OFFSET_TOOLTIP")); - levBox->pack_start(*sup); - sup->setAdjusterListener(this); wavLabels->show(); levBox->pack_start(*wavLabels); From bae1897b444b805a27be94745ff01fdbfed21014 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 29 Mar 2020 17:42:48 +0200 Subject: [PATCH 056/109] Fix segfault when using Colour Toning/Lab blending on very dark images --- rtengine/improcfun.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 9fe16769c..aa5515e79 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -1989,8 +1989,8 @@ void ImProcFunctions::moyeqt (Imagefloat* working, float &moyS, float &eqty) { BENCHFUN - int tHh = working->getHeight(); - int tWw = working->getWidth(); + const int height = working->getHeight(); + const int width = working->getWidth(); double moy = 0.0; double sqrs = 0.0; @@ -1998,17 +1998,17 @@ void ImProcFunctions::moyeqt (Imagefloat* working, float &moyS, float &eqty) #pragma omp parallel for reduction(+:moy,sqrs) schedule(dynamic,16) #endif - for (int i = 0; i < tHh; i++) { - for (int j = 0; j < tWw; j++) { - double s = Color::rgb2s (CLIP (working->r (i, j)), CLIP (working->g (i, j)), CLIP (working->b (i, j))); + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + const double s = Color::rgb2s(CLIP(working->r (i, j)), CLIP(working->g (i, j)), CLIP(working->b (i, j))); moy += s; sqrs += SQR(s); } } - moy /= (tHh * tWw); - sqrs /= (tHh * tWw); - eqty = sqrt (sqrs - SQR (moy)); + moy /= (height * width); + sqrs /= (height * width); + eqty = std::sqrt(std::max(sqrs - SQR(moy), 0.0)); moyS = moy; } From 0fa2ca79c2c347bd92d47d7174fd824c4f00a8de Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 30 Mar 2020 08:54:26 +0200 Subject: [PATCH 057/109] Improvment contrast to prevent texture and noise --- rtdata/languages/default | 3 ++ rtengine/ipwavelet.cc | 67 ++++++++++++++++++++++++++++------------ rtengine/procparams.cc | 4 +++ rtengine/procparams.h | 1 + rtgui/paramsedited.cc | 6 ++++ rtgui/paramsedited.h | 1 + rtgui/wavelet.cc | 15 +++++++++ rtgui/wavelet.h | 2 ++ 8 files changed, 80 insertions(+), 19 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index d4fb356e0..4a419e736 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -806,6 +806,7 @@ HISTORY_MSG_THRESWAV;Balance threshold HISTORY_MSG_BLUWAV;Maximum blur HISTORY_MSG_WAVOLDSH;Old algorithm HISTORY_MSG_WAVOFFSET;Offset +HISTORY_MSG_WAVLOWTHR;Threshold low contrast HISTORY_MSG_BLSHAPE;Blur by level HISTORY_MSG_WAVBL;Blur levels HISTORY_MSG_BLURWAV;Blur luminance @@ -2242,6 +2243,7 @@ TP_WAVELET_LEVZERO;Level 1 TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength TP_WAVELET_LIPST;Enhanced algoritm TP_WAVELET_LOWLIGHT;Shadow luminance range +TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise TP_WAVELET_MEDGREINF;First level TP_WAVELET_MEDI;Reduce artifacts in blue sky TP_WAVELET_MEDILEV;Edge detection @@ -2312,6 +2314,7 @@ TP_WAVELET_USH;None TP_WAVELET_USHARP;Clarity method TP_WAVELET_USHARP_TOOLTIP;Origin : the source file is the file before Wavelet.\nWavelet : the source file is the file including wavelet threatment TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, wavelet settings will be automatically positioned :\nBackground=black, Process=below, level=3...you can change level between 1 and 4.\n\nIf you select Clarity, wavelet settings will be automatically positioned :\nBackground=residual, Process=above, level=7..you can change level between 5 and 10 and wavelet levels. +TP_WAVELET_WAVLOWTHR;Low contrast threshold TP_WAVELET_WAVOFFSET;Offset TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between shadows and highlights.\n High values will amplify the contrast enhancement of the highlights, while low values will amplify the contrast enhancement of the shadows. Along with a low Max. effect value will help you selecting the contrasts that will be enhanced TP_WBALANCE_AUTO;Auto diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 8c15f51c5..d5b642aaa 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -3002,39 +3002,66 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz const float skinprotneg = -skinprot; const float factorHard = (1.f - skinprotneg / 100.f); const float offs = params->wavelet.offset; + const float lowthr = params->wavelet.lowthr; //to adjust increase contrast with local contrast //for each pixel and each level float beta; - float mea[9]; - float rap = offs * mean[level] - 2.f * cp.sigm * sigma[level]; + float mea[10]; + float rap = 0.f; + float sig = 1.f; + if(cp.sigm < 1.f) { + sig = cp.sigm; + } + if(cp.sigm <= 1.f) { + rap = offs * mean[level] - sig * sigma[level]; + } + if (rap > 0.f) { mea[0] = rap; } else { mea[0] = mean[level] / 6.f; } - rap = offs * mean[level] - cp.sigm * sigma[level]; + rap = 0.f; + if(cp.sigm <= 1.f) { + rap = offs * mean[level] - 0.5f * sig * sigma[level]; + } if (rap > 0.f) { mea[1] = rap; } else { - mea[1] = mean[level] / 2.f; + mea[1] = mean[level] / 4.f; + } + + rap = 0.f; + if(cp.sigm <= 1.f) { + rap = offs * mean[level] - 0.2f * sig * sigma[level]; } - mea[2] = offs * mean[level]; // 50% data - mea[3] = offs * mean[level] + cp.sigm * sigma[level] / 2.f; - mea[4] = offs * mean[level] + cp.sigm * sigma[level]; //66% - mea[5] = offs * mean[level] + cp.sigm * 1.2f * sigma[level]; - mea[6] = offs * mean[level] + cp.sigm * 1.5f * sigma[level]; // - mea[7] = offs * mean[level] + cp.sigm * 2.f * sigma[level]; //95% - mea[8] = offs * mean[level] + cp.sigm * 2.5f * sigma[level]; //99% + if (rap > 0.f) { + mea[2] = rap; + } else { + mea[2] = mean[level] / 2.f; + } + + mea[3] = offs * mean[level]; // 50% data + mea[4] = offs * mean[level] + cp.sigm * sigma[level] / 2.f; + mea[5] = offs * mean[level] + cp.sigm * sigma[level]; //66% + mea[6] = offs * mean[level] + cp.sigm * 1.2f * sigma[level]; + mea[7] = offs * mean[level] + cp.sigm * 1.5f * sigma[level]; // + mea[8] = offs * mean[level] + cp.sigm * 2.f * sigma[level]; //95% + mea[9] = offs * mean[level] + cp.sigm * 2.5f * sigma[level]; //99% bool useChromAndHue = (skinprot != 0.f || cp.HSmet); float modchro; + float red0 = 0.005f * (110.f - lowthr); + float red1 = 0.008f * (110.f - lowthr); + float red2 = 0.011f * (110.f - lowthr); + for (int i = 0; i < W_L * H_L; i++) { float kLlev = 1.f; @@ -3046,22 +3073,24 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz //reduction amplification: max action between mean / 2 and mean + sigma // arbitrary coefficient, we can add a slider !! if (WavCL < mea[0]) { - beta = 0.6f; //preserve very low contrast (sky...) + beta = 0.4f * red0;//preserve very low contrast (sky...) } else if (WavCL < mea[1]) { - beta = 0.8f; + beta = 0.5f * red1; } else if (WavCL < mea[2]) { - beta = 1.f; //standard + beta = 0.7f * red2; } else if (WavCL < mea[3]) { - beta = 1.f; + beta = 1.f; //standard } else if (WavCL < mea[4]) { - beta = 0.8f; //+sigma + beta = 1.f; } else if (WavCL < mea[5]) { - beta = 0.6f; + beta = 0.8f; //+sigma } else if (WavCL < mea[6]) { - beta = 0.4f; + beta = 0.6f; } else if (WavCL < mea[7]) { - beta = 0.2f; // + 2 sigma + beta = 0.4f; } else if (WavCL < mea[8]) { + beta = 0.2f; // + 2 sigma + } else if (WavCL < mea[9]) { beta = 0.1f; } else { beta = 0.0f; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 20ae540f5..66f2a4c19 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2288,6 +2288,7 @@ WaveletParams::WaveletParams() : HSmethod("with"), sigma(1.0), offset(1.0), + lowthr(40.0), rescon(0), resconH(0), reschro(0), @@ -2403,6 +2404,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && HSmethod == other.HSmethod && sigma == other.sigma && offset == other.offset + && lowthr == other.lowthr && rescon == other.rescon && resconH == other.resconH && reschro == other.reschro @@ -3599,6 +3601,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.tmr, "Wavelet", "TMr", wavelet.tmr, keyFile); saveToKeyfile(!pedited || pedited->wavelet.sigma, "Wavelet", "Sigma", wavelet.sigma, keyFile); saveToKeyfile(!pedited || pedited->wavelet.offset, "Wavelet", "Offset", wavelet.offset, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.lowthr, "Wavelet", "Lowthr", wavelet.lowthr, 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.thr, "Wavelet", "ThresholdResidShadow", wavelet.thr, keyFile); @@ -4722,6 +4725,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "DirMethod", pedited, wavelet.Dirmethod, pedited->wavelet.Dirmethod); assignFromKeyfile(keyFile, "Wavelet", "Sigma", pedited, wavelet.sigma, pedited->wavelet.sigma); assignFromKeyfile(keyFile, "Wavelet", "Offset", pedited, wavelet.offset, pedited->wavelet.offset); + assignFromKeyfile(keyFile, "Wavelet", "Lowthr", pedited, wavelet.lowthr, pedited->wavelet.lowthr); assignFromKeyfile(keyFile, "Wavelet", "ResidualcontShadow", pedited, wavelet.rescon, pedited->wavelet.rescon); assignFromKeyfile(keyFile, "Wavelet", "ResidualcontHighlight", pedited, wavelet.resconH, pedited->wavelet.resconH); assignFromKeyfile(keyFile, "Wavelet", "Residualchroma", pedited, wavelet.reschro, pedited->wavelet.reschro); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 8ca3e5c29..6dd5198ff 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1247,6 +1247,7 @@ struct WaveletParams { Glib::ustring HSmethod; double sigma; double offset; + double lowthr; int rescon; int resconH; int reschro; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index b3c2b64d7..0b06b9d92 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -512,6 +512,7 @@ void ParamsEdited::set(bool v) wavelet.sigma = v; wavelet.sigma = v; wavelet.offset = v; + wavelet.lowthr = v; wavelet.resconH = v; wavelet.reschro = v; wavelet.resblur = v; @@ -1115,6 +1116,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.Dirmethod = wavelet.Dirmethod && p.wavelet.Dirmethod == other.wavelet.Dirmethod; wavelet.sigma = wavelet.sigma && p.wavelet.sigma == other.wavelet.sigma; wavelet.offset = wavelet.offset && p.wavelet.offset == other.wavelet.offset; + wavelet.lowthr = wavelet.lowthr && p.wavelet.lowthr == other.wavelet.lowthr; wavelet.rescon = wavelet.rescon && p.wavelet.rescon == other.wavelet.rescon; wavelet.resconH = wavelet.resconH && p.wavelet.resconH == other.wavelet.resconH; wavelet.reschro = wavelet.reschro && p.wavelet.reschro == other.wavelet.reschro; @@ -3202,6 +3204,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.offset = mods.wavelet.offset; } + if (wavelet.lowthr) { + toEdit.wavelet.lowthr = mods.wavelet.lowthr; + } + if (wavelet.resblur) { toEdit.wavelet.resblur = mods.wavelet.resblur; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 43254b015..0b315583d 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -527,6 +527,7 @@ struct WaveletParamsEdited { bool Dirmethod; bool sigma; bool offset; + bool lowthr; bool rescon; bool resconH; bool reschro; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 2e444ff3d..b23143c6c 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -84,6 +84,7 @@ Wavelet::Wavelet() : neutralchButton(Gtk::manage(new Gtk::Button(M("TP_WAVELET_NEUTRAL")))), sigma(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMA"), 0.05, 2.5, 0.01, 1.))), offset(Gtk::manage(new Adjuster(M("TP_WAVELET_WAVOFFSET"), 0.33, 1.66, 0.01, 1., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), + lowthr(Gtk::manage(new Adjuster(M("TP_WAVELET_WAVLOWTHR"), 20., 100., 0.5, 40.))), rescon(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCON"), -100, 100, 1, 0))), resconH(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCONH"), -100, 100, 1, 0))), reschro(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCHRO"), -100, 100, 1, 0))), @@ -190,6 +191,7 @@ Wavelet::Wavelet() : EvWavchrwav = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_chrwav"); EvWavoldsh = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVOLDSH"); EvWavoffset = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVOFFSET"); + EvWavlowthr = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVLOWTHR"); EvWavbluwav = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLUWAV"); EvWavblshape = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLSHAPE"); EvWavresblur = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLURWAV"); @@ -359,6 +361,9 @@ Wavelet::Wavelet() : levBox->pack_start(*offset, Gtk::PACK_SHRINK); sigma->set_tooltip_text(M("TP_WAVELET_SIGMA_TOOLTIP")); offset->set_tooltip_text(M("TP_WAVELET_OFFSET_TOOLTIP")); + lowthr->setAdjusterListener(this); + lowthr->set_tooltip_text(M("TP_WAVELET_LOWTHR_TOOLTIP")); + levBox->pack_start(*lowthr, Gtk::PACK_SHRINK); wavLabels->show(); levBox->pack_start(*wavLabels); @@ -1321,6 +1326,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) lasttmr = pp->wavelet.tmr; sigma->setValue(pp->wavelet.sigma); offset->setValue(pp->wavelet.offset); + lowthr->setValue(pp->wavelet.lowthr); rescon->setValue(pp->wavelet.rescon); resconH->setValue(pp->wavelet.resconH); reschro->setValue(pp->wavelet.reschro); @@ -1481,6 +1487,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) rescon->setEditedState(pedited->wavelet.rescon ? Edited : UnEdited); sigma->setEditedState(pedited->wavelet.sigma ? Edited : UnEdited); offset->setEditedState(pedited->wavelet.offset ? Edited : UnEdited); + lowthr->setEditedState(pedited->wavelet.lowthr ? Edited : UnEdited); resconH->setEditedState(pedited->wavelet.resconH ? Edited : UnEdited); reschro->setEditedState(pedited->wavelet.reschro ? Edited : UnEdited); resblur->setEditedState(pedited->wavelet.resblur ? Edited : UnEdited); @@ -1672,6 +1679,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.tmr = tmr->get_active(); pp->wavelet.sigma = sigma->getValue(); pp->wavelet.offset = offset->getValue(); + pp->wavelet.lowthr = lowthr->getValue(); pp->wavelet.rescon = rescon->getValue(); pp->wavelet.resconH = resconH->getValue(); pp->wavelet.reschro = reschro->getValue(); @@ -1791,6 +1799,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.edgthresh = edgthresh->getEditedState(); pedited->wavelet.sigma = sigma->getEditedState(); pedited->wavelet.offset = offset->getEditedState(); + pedited->wavelet.lowthr = lowthr->getEditedState(); pedited->wavelet.rescon = rescon->getEditedState(); pedited->wavelet.resconH = resconH->getEditedState(); pedited->wavelet.reschro = reschro->getEditedState(); @@ -2035,6 +2044,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit iter->setDefault(defParams->wavelet.iter); sigma->setDefault(defParams->wavelet.sigma); offset->setDefault(defParams->wavelet.offset); + lowthr->setDefault(defParams->wavelet.lowthr); rescon->setDefault(defParams->wavelet.rescon); resconH->setDefault(defParams->wavelet.resconH); reschro->setDefault(defParams->wavelet.reschro); @@ -2102,6 +2112,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit sigma->setDefault(defParams->wavelet.sigma); offset->setDefault(defParams->wavelet.offset); + lowthr->setDefault(defParams->wavelet.lowthr); rescon->setDefault(defParams->wavelet.rescon); resconH->setDefault(defParams->wavelet.resconH); reschro->setDefault(defParams->wavelet.reschro); @@ -2158,6 +2169,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit } else { sigma->setDefaultEditedState(Irrelevant); offset->setDefaultEditedState(Irrelevant); + lowthr->setDefaultEditedState(Irrelevant); rescon->setDefaultEditedState(Irrelevant); resconH->setDefaultEditedState(Irrelevant); reschro->setDefaultEditedState(Irrelevant); @@ -2692,6 +2704,7 @@ void Wavelet::setBatchMode(bool batchMode) curveEditorGAM->setBatchMode(batchMode); sigma->showEditedCB(); offset->showEditedCB(); + lowthr->showEditedCB(); rescon->showEditedCB(); resconH->showEditedCB(); reschro->showEditedCB(); @@ -2781,6 +2794,8 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavsigma, sigma->getTextValue()); } else if (a == offset) { listener->panelChanged(EvWavoffset, offset->getTextValue()); + } else if (a == lowthr) { + listener->panelChanged(EvWavlowthr, lowthr->getTextValue()); } else if (a == resconH) { listener->panelChanged(EvWavresconH, resconH->getTextValue()); } else if (a == reschro) { diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index 67a45b5ac..609d3226c 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -83,6 +83,7 @@ private: rtengine::ProcEvent EvWavchrwav; rtengine::ProcEvent EvWavoldsh; rtengine::ProcEvent EvWavoffset; + rtengine::ProcEvent EvWavlowthr; rtengine::ProcEvent EvWavbluwav; rtengine::ProcEvent EvWavblshape; rtengine::ProcEvent EvWavresblur; @@ -184,6 +185,7 @@ private: Adjuster* correctionch[9]; Adjuster* const sigma; Adjuster* const offset; + Adjuster* const lowthr; Adjuster* const rescon; Adjuster* const resconH; Adjuster* const reschro; From 5102c82c11a5f2d46972602857dc89bff78ca3e3 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 31 Mar 2020 10:04:16 +0200 Subject: [PATCH 058/109] Improve blur with effect --- rtdata/languages/default | 4 +- rtengine/improcfun.h | 4 +- rtengine/ipwavelet.cc | 205 +++++++++++++++++++++++++++------------ rtgui/wavelet.cc | 2 +- 4 files changed, 150 insertions(+), 65 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 4a419e736..ec2e32d95 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -803,7 +803,7 @@ HISTORY_MSG_WAVSOFTRAD;Soft radius clarity HISTORY_MSG_WAVSOFTRADEND;Soft radius final HISTORY_MSG_WAVUSHAMET;Clarity method HISTORY_MSG_THRESWAV;Balance threshold -HISTORY_MSG_BLUWAV;Maximum blur +HISTORY_MSG_BLUWAV;Effects HISTORY_MSG_WAVOLDSH;Old algorithm HISTORY_MSG_WAVOFFSET;Offset HISTORY_MSG_WAVLOWTHR;Threshold low contrast @@ -2146,7 +2146,7 @@ TP_WAVELET_BASLI;Slider TP_WAVELET_BATYPE;Contrast balance method TP_WAVELET_BLCURVE;Blur by levels TP_WAVELET_BLURFRAME;Blur -TP_WAVELET_BLUWAV;Maximum Blur +TP_WAVELET_BLUWAV;Effects TP_WAVELET_CBENAB;Toning and Color Balance TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted TP_WAVELET_CCURVE;Local contrast diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 424084b8c..affa33640 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -208,7 +208,7 @@ public: struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili); void WaveletcontAllLfinal(const wavelet_decomposition &WaveletCoeffs_L, const cont_params &cp, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL); void WaveletcontAllAB(LabImage * lab, float **varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_a, const Wavblcurve & wavblcurve, const WavOpacityCurveW & waOpacityCurveW, - struct cont_params &cp, const bool useChannelA, int skip); + struct cont_params &cp, const bool useChannelA, int skip, float *meanab, float *sigmaab); void WaveletAandBAllAB(const wavelet_decomposition &WaveletCoeffs_a, const wavelet_decomposition &WaveletCoeffs_b, const cont_params &cp, FlatCurve* hhcurve, bool hhutili); void ContAllL(float **koeLi, float *maxkoeLi, bool lipschitz, int maxlvl, LabImage * lab, float **varhue, float **varchrom, float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp, @@ -222,6 +222,8 @@ public: void Eval2(float ** WavCoeffs_L, int level, int W_L, int H_L, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN); + void calceffect(int level, float *mean, float *sigma, float *mea, float effect, float offs); + void Aver(float * HH_Coeffs, int datalen, float &averagePlus, float &averageNeg, float &max, float &min); void Sigma(float * HH_Coeffs, int datalen, float averagePlus, float averageNeg, float &sigmaPlus, float &sigmaNeg); void calckoe(float ** WavCoeffs_LL, const cont_params& cp, float ** koeLi, int level, int dir, int W_L, int H_L, float edd, float *maxkoeLi, float **tmC = nullptr); diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index d5b642aaa..e7f6083e6 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -400,7 +400,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.oldsh = waparams.oldsh; cp.blurres = waparams.resblur; cp.blurcres = waparams.resblurc; - cp.bluwav = 0.01f * waparams.bluwav; + cp.bluwav = waparams.bluwav; //cp.hueres=waparams.reshue; cp.hueres = 2.f; cp.th = float(waparams.thr); @@ -643,6 +643,13 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const float MaxP[10]; float MaxN[10]; + float meanab[10]; + float meanNab[10]; + float sigmaab[10]; + float sigmaNab[10]; + float MaxPab[10]; + float MaxNab[10]; + array2D varchro(tilewidth, tileheight); float** varhue = new float*[tileheight]; @@ -924,7 +931,8 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr adecomp(new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwava, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!adecomp->memoryAllocationFailed) { - WaveletcontAllAB(labco, varhue, varchro, *adecomp, wavblcurve, waOpacityCurveW, cp, true, skip); + Evaluate2(*adecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); + WaveletcontAllAB(labco, varhue, varchro, *adecomp, wavblcurve, waOpacityCurveW, cp, true, skip, meanab, sigmaab); adecomp->reconstruct(labco->data + datalen, cp.strength); } } @@ -941,7 +949,8 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!bdecomp->memoryAllocationFailed) { - WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip); + Evaluate2(*bdecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); + WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip, meanab, sigmaab); bdecomp->reconstruct(labco->data + 2 * datalen, cp.strength); } } @@ -959,8 +968,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!adecomp->memoryAllocationFailed && !bdecomp->memoryAllocationFailed) { - WaveletcontAllAB(labco, varhue, varchro, *adecomp,wavblcurve, waOpacityCurveW, cp, true, skip); - WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip); + Evaluate2(*adecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); + WaveletcontAllAB(labco, varhue, varchro, *adecomp,wavblcurve, waOpacityCurveW, cp, true, skip, meanab, sigmaab); + Evaluate2(*bdecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); + WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip, meanab, sigmaab); WaveletAandBAllAB(*adecomp, *bdecomp, cp, hhCurve, hhutili); adecomp->reconstruct(labco->data + datalen, cp.strength); @@ -1227,6 +1238,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } + void ImProcFunctions::Aver(float * RESTRICT DataList, int datalen, float &averagePlus, float &averageNeg, float &max, float &min) { @@ -1333,6 +1345,56 @@ void ImProcFunctions::Evaluate2(const wavelet_decomposition &WaveletCoeffs_L, } } + +void ImProcFunctions::calceffect(int level, float *mean, float *sigma, float *mea, float effect, float offs) +{ + float rap = 0.f; + float sig = 1.f; + if(effect < 1.f) { + sig = effect; + } + + if(effect <= 1.f) { + rap = offs * mean[level] - sig * sigma[level]; + } + + if (rap > 0.f) { + mea[0] = rap; + } else { + mea[0] = mean[level] / 6.f; + } + + rap = 0.f; + if(effect <= 1.f) { + rap = offs * mean[level] - 0.5f * sig * sigma[level]; + } + + if (rap > 0.f) { + mea[1] = rap; + } else { + mea[1] = mean[level] / 4.f; + } + + rap = 0.f; + if(effect <= 1.f) { + rap = offs * mean[level] - 0.2f * sig * sigma[level]; + } + + if (rap > 0.f) { + mea[2] = rap; + } else { + mea[2] = mean[level] / 2.f; + } + + mea[3] = offs * mean[level]; // 50% data + mea[4] = offs * mean[level] + effect * sigma[level] / 2.f; + mea[5] = offs * mean[level] + effect * sigma[level]; //66% + mea[6] = offs * mean[level] + effect * 1.2f * sigma[level]; + mea[7] = offs * mean[level] + effect * 1.5f * sigma[level]; // + mea[8] = offs * mean[level] + effect * 2.f * sigma[level]; //95% + mea[9] = offs * mean[level] + effect * 2.5f * sigma[level]; //99% +} + void ImProcFunctions::Eval2(float ** WavCoeffs_L, int level, int W_L, int H_L, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN) { @@ -1953,20 +2015,53 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * ContAllL(koeLi, maxkoeLi, true, maxlvl, labco, varhue, varchrom, WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); //blur level float klev = 1.f; - if(wavblcurve && wavcurvecomp && cp.blena && cp.bluwav > 0.f) { + if(wavblcurve && wavcurvecomp && cp.blena) { + float mea[10]; + float effect = cp.bluwav; + float beta = 0.f; + float offs = 1.f; + + calceffect(lvl, mean, sigma, mea, effect, offs); float * bef = new float[Wlvl_L * Hlvl_L]; float * aft = new float[Wlvl_L * Hlvl_L]; for (int co = 0; co < Hlvl_L * Wlvl_L; co++) { - bef[co] = WavCoeffs_L[dir][co]; + bef[co] = WavCoeffs_L[dir][co]; + float WavCL = std::fabs(WavCoeffs_L[dir][co]); + + if (WavCL < mea[0]) { + beta = 0.05f; + } else if (WavCL < mea[1]) { + beta = 0.2f; + } else if (WavCL < mea[2]) { + beta = 0.7f; + } else if (WavCL < mea[3]) { + beta = 1.f; //standard + } else if (WavCL < mea[4]) { + beta = 1.f; + } else if (WavCL < mea[5]) { + beta = 0.8f; //+sigma + } else if (WavCL < mea[6]) { + beta = 0.6f; + } else if (WavCL < mea[7]) { + beta = 0.4f; + } else if (WavCL < mea[8]) { + beta = 0.2f; // + 2 sigma + } else if (WavCL < mea[9]) { + beta = 0.1f; + } else { + beta = 0.0f; + } + + } klev = (wavblcurve[lvl * 55.5f]); float lvr = lvl; if(lvr == 0) { lvr = 1; } - klev *= cp.bluwav * lvr * 10.f / skip; + klev *= beta * lvr * 100.f / skip; boxblur(bef, aft, klev, Wlvl_L, Hlvl_L, false); for (int co = 0; co < Hlvl_L * Wlvl_L; co++) { @@ -2053,7 +2148,7 @@ void ImProcFunctions::WaveletAandBAllAB(const wavelet_decomposition &WaveletCoef } void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_ab, const Wavblcurve & wavblcurve, const WavOpacityCurveW & waOpacityCurveW, - struct cont_params &cp, const bool useChannelA, int skip) + struct cont_params &cp, const bool useChannelA, int skip, float *meanab, float *sigmaab) { int maxlvl = WaveletCoeffs_ab.maxlevel(); @@ -2219,20 +2314,54 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); ContAllAB(labco, maxlvl, varhue, varchrom, WavCoeffs_ab, WavCoeffs_ab0, lvl, dir, waOpacityCurveW, cp, Wlvl_ab, Hlvl_ab, useChannelA); - if(wavblcurve && wavcurvecomp && cp.blena && cp.chrwav > 0.f && cp.bluwav > 0.f) { + if(wavblcurve && wavcurvecomp && cp.blena && cp.chrwav > 0.f) { + float mea[10]; + float effect = cp.bluwav; + float beta = 0.f; + float offs = 1.f; + + calceffect(lvl, meanab, sigmaab, mea, effect, offs); + float * bef = new float[Wlvl_ab * Hlvl_ab]; float * aft = new float[Wlvl_ab * Hlvl_ab]; float klev; for (int co = 0; co < Hlvl_ab * Wlvl_ab; co++) { bef[co] = WavCoeffs_ab[dir][co]; + float WavCab = std::fabs(WavCoeffs_ab[dir][co]); + + if (WavCab < mea[0]) { + beta = 0.05f; + } else if (WavCab < mea[1]) { + beta = 0.2f; + } else if (WavCab < mea[2]) { + beta = 0.7f; + } else if (WavCab < mea[3]) { + beta = 1.f; //standard + } else if (WavCab < mea[4]) { + beta = 1.f; + } else if (WavCab < mea[5]) { + beta = 0.8f; //+sigma + } else if (WavCab < mea[6]) { + beta = 0.6f; + } else if (WavCab < mea[7]) { + beta = 0.4f; + } else if (WavCab < mea[8]) { + beta = 0.2f; // + 2 sigma + } else if (WavCab < mea[9]) { + beta = 0.1f; + } else { + beta = 0.0f; + } + + } klev = (wavblcurve[lvl * 55.5f]); float lvr = lvl; if(lvr == 0) { lvr = 1; } - - klev *= cp.bluwav * cp.chrwav * lvr * 20.f / skip; + + klev *= beta * cp.chrwav * lvr * 200.f / skip; boxblur(bef, aft, klev, Wlvl_ab, Hlvl_ab, false); @@ -3003,57 +3132,11 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz const float factorHard = (1.f - skinprotneg / 100.f); const float offs = params->wavelet.offset; const float lowthr = params->wavelet.lowthr; - - //to adjust increase contrast with local contrast - - //for each pixel and each level - float beta; float mea[10]; - float rap = 0.f; - float sig = 1.f; - if(cp.sigm < 1.f) { - sig = cp.sigm; - } + float effect = cp.sigm; + float beta; - if(cp.sigm <= 1.f) { - rap = offs * mean[level] - sig * sigma[level]; - } - - if (rap > 0.f) { - mea[0] = rap; - } else { - mea[0] = mean[level] / 6.f; - } - - rap = 0.f; - if(cp.sigm <= 1.f) { - rap = offs * mean[level] - 0.5f * sig * sigma[level]; - } - - if (rap > 0.f) { - mea[1] = rap; - } else { - mea[1] = mean[level] / 4.f; - } - - rap = 0.f; - if(cp.sigm <= 1.f) { - rap = offs * mean[level] - 0.2f * sig * sigma[level]; - } - - if (rap > 0.f) { - mea[2] = rap; - } else { - mea[2] = mean[level] / 2.f; - } - - mea[3] = offs * mean[level]; // 50% data - mea[4] = offs * mean[level] + cp.sigm * sigma[level] / 2.f; - mea[5] = offs * mean[level] + cp.sigm * sigma[level]; //66% - mea[6] = offs * mean[level] + cp.sigm * 1.2f * sigma[level]; - mea[7] = offs * mean[level] + cp.sigm * 1.5f * sigma[level]; // - mea[8] = offs * mean[level] + cp.sigm * 2.f * sigma[level]; //95% - mea[9] = offs * mean[level] + cp.sigm * 2.5f * sigma[level]; //99% + calceffect(level, mean, sigma, mea, effect, offs); bool useChromAndHue = (skinprot != 0.f || cp.HSmet); float modchro; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index b23143c6c..afedf750c 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -90,7 +90,7 @@ Wavelet::Wavelet() : reschro(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCHRO"), -100, 100, 1, 0))), resblur(Gtk::manage(new Adjuster(M("TP_WAVELET_RESBLUR"), 0, 100, 1, 0))), resblurc(Gtk::manage(new Adjuster(M("TP_WAVELET_RESBLURC"), 0, 100, 1, 0))), - bluwav(Gtk::manage(new Adjuster(M("TP_WAVELET_BLUWAV"), 0.0, 100.0, 0.5, 50.))), + bluwav(Gtk::manage(new Adjuster(M("TP_WAVELET_BLUWAV"), 0.05, 2.5, 0.01, 1.))), tmrs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMSTRENGTH"), -1.0, 2.0, 0.01, 0.0))), edgs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMEDGS"), 0.1, 4.0, 0.01, 1.4))), scale(Gtk::manage(new Adjuster(M("TP_WAVELET_TMSCALE"), 0.1, 10.0, 0.01, 1.0))), From b8749f708cfdc4bdb2b177a455b2025f0b3e241c Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 31 Mar 2020 14:24:17 +0200 Subject: [PATCH 059/109] Added effect to edge sharpness --- rtdata/languages/default | 3 +++ rtengine/ipwavelet.cc | 44 +++++++++++++++++++++++++++++++++++++++- rtengine/procparams.cc | 4 ++++ rtengine/procparams.h | 1 + rtgui/paramsedited.cc | 6 ++++++ rtgui/paramsedited.h | 1 + rtgui/wavelet.cc | 19 +++++++++++++++-- rtgui/wavelet.h | 2 ++ 8 files changed, 77 insertions(+), 3 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index ec2e32d95..ad98e3e71 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -811,6 +811,7 @@ HISTORY_MSG_BLSHAPE;Blur by level HISTORY_MSG_WAVBL;Blur levels HISTORY_MSG_BLURWAV;Blur luminance HISTORY_MSG_BLURCWAV;Blur chroma +HISTORY_MSG_EDGEFFECT;Edge Effect HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -2205,6 +2206,8 @@ TP_WAVELET_EDGEDETECTTHR;Threshold low (noise) TP_WAVELET_EDGEDETECTTHR2;Threshold high (detection) TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This adjuster lets you target edge detection for example to avoid applying edge sharpness to fine details, such as noise in the sky. TP_WAVELET_EDGEDETECT_TOOLTIP;Moving the slider to the right increases edge sensitivity. This affects local contrast, edge settings and noise. +TP_WAVELET_EDEFFECT;Effect +TP_WAVELET_EDEFFECT_TOOLTIP;This slider controls how wide the range of contrast values are that receive the maximum effect from the tool.\nMaximum value (2.5) disabled the tool TP_WAVELET_EDGESENSI;Edge sensitivity TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. TP_WAVELET_EDGTHRESH;Detail diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index e7f6083e6..53f685826 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -82,6 +82,7 @@ struct cont_params { float b_lpast, t_lpast, b_rpast, t_rpast; float b_lsat, t_lsat, b_rsat, t_rsat; int rad; + float eff; int val; int til; int numlevH, numlevS; @@ -392,6 +393,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.rad = waparams.edgrad; cp.val = waparams.edgval; cp.til = waparams.edgthresh; + cp.eff = waparams.edgeffect; cp.conres = waparams.rescon; cp.conresH = waparams.resconH; @@ -2721,7 +2723,47 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz constexpr float aedstr = (eddstrength - 1.f) / 90.f; constexpr float bedstr = 1.f - 10.f * aedstr; + float mea[10]; + float beta = 1.f; + if(cp.eff < 2.5f) { + float effect = cp.eff; + float offs = 1.f; + + calceffect(level, mean, sigma, mea, effect, offs); + for (int co = 0; co < H_L * W_L; co++) { + float WavCL = std::fabs(WavCoeffs_L[dir][co]); + + if (WavCL < mea[0]) { + beta = 0.05f; + } else if (WavCL < mea[1]) { + beta = 0.2f; + } else if (WavCL < mea[2]) { + beta = 0.7f; + } else if (WavCL < mea[3]) { + beta = 1.f; //standard + } else if (WavCL < mea[4]) { + beta = 1.f; + } else if (WavCL < mea[5]) { + beta = 0.8f; //+sigma + } else if (WavCL < mea[6]) { + beta = 0.6f; + } else if (WavCL < mea[7]) { + beta = 0.4f; + } else if (WavCL < mea[8]) { + beta = 0.2f; // + 2 sigma + } else if (WavCL < mea[9]) { + beta = 0.1f; + } else { + beta = 0.0f; + } + + } + } + + if (cp.val > 0 && cp.edgeena) { + + float * koe = nullptr; float maxkoe = 0.f; @@ -2810,7 +2852,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz float atten01234 = 0.80f; value *= (atten01234 * scaleskip[1]); //for zoom < 100% reduce strength...I choose level 1...but!! } - + value *= beta; float edge = 1.f; float lim0 = 20.f; //arbitrary limit for low radius and level between 2 or 3 to 30 maxi float lev = float (level); diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 66f2a4c19..ae5b6b465 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2312,6 +2312,7 @@ WaveletParams::WaveletParams() : edgeampli(10), contrast(0), edgrad(15), + edgeffect(1.0), edgval(0), edgthresh(10), thr(30), @@ -2428,6 +2429,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && edgeampli == other.edgeampli && contrast == other.contrast && edgrad == other.edgrad + && edgeffect == other.edgeffect && edgval == other.edgval && edgthresh == other.edgthresh && thr == other.thr @@ -3593,6 +3595,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.bluwav, "Wavelet", "bluwav", wavelet.bluwav, keyFile); saveToKeyfile(!pedited || pedited->wavelet.hueskin, "Wavelet", "Hueskin", wavelet.hueskin.toVector(), keyFile); saveToKeyfile(!pedited || pedited->wavelet.edgrad, "Wavelet", "Edgrad", wavelet.edgrad, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgeffect, "Wavelet", "Edgeffect", wavelet.edgeffect, keyFile); saveToKeyfile(!pedited || pedited->wavelet.edgval, "Wavelet", "Edgval", wavelet.edgval, keyFile); saveToKeyfile(!pedited || pedited->wavelet.edgthresh, "Wavelet", "ThrEdg", wavelet.edgthresh, keyFile); saveToKeyfile(!pedited || pedited->wavelet.avoid, "Wavelet", "AvoidColorShift", wavelet.avoid, keyFile); @@ -4749,6 +4752,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "ChromaLink", pedited, wavelet.chro, pedited->wavelet.chro); assignFromKeyfile(keyFile, "Wavelet", "Contrast", pedited, wavelet.contrast, pedited->wavelet.contrast); assignFromKeyfile(keyFile, "Wavelet", "Edgrad", pedited, wavelet.edgrad, pedited->wavelet.edgrad); + assignFromKeyfile(keyFile, "Wavelet", "Edgeffect", pedited, wavelet.edgeffect, pedited->wavelet.edgeffect); assignFromKeyfile(keyFile, "Wavelet", "Edgval", pedited, wavelet.edgval, pedited->wavelet.edgval); assignFromKeyfile(keyFile, "Wavelet", "ThrEdg", pedited, wavelet.edgthresh, pedited->wavelet.edgthresh); assignFromKeyfile(keyFile, "Wavelet", "ThresholdResidShadow", pedited, wavelet.thr, pedited->wavelet.thr); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 6dd5198ff..7174dfb3c 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1271,6 +1271,7 @@ struct WaveletParams { int edgeampli; int contrast; int edgrad; + double edgeffect; int edgval; int edgthresh; int thr; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 0b06b9d92..87c405d42 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -535,6 +535,7 @@ void ParamsEdited::set(bool v) wavelet.chro = v; wavelet.contrast = v; wavelet.edgrad = v; + wavelet.edgeffect = v; wavelet.edgval = v; wavelet.edgthresh = v; wavelet.thr = v; @@ -1140,6 +1141,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.chro = wavelet.chro && p.wavelet.chro == other.wavelet.chro; wavelet.contrast = wavelet.contrast && p.wavelet.contrast == other.wavelet.contrast; wavelet.edgrad = wavelet.edgrad && p.wavelet.edgrad == other.wavelet.edgrad; + wavelet.edgeffect = wavelet.edgeffect && p.wavelet.edgeffect == other.wavelet.edgeffect; wavelet.edgval = wavelet.edgval && p.wavelet.edgval == other.wavelet.edgval; wavelet.edgthresh = wavelet.edgthresh && p.wavelet.edgthresh == other.wavelet.edgthresh; wavelet.thr = wavelet.thr && p.wavelet.thr == other.wavelet.thr; @@ -3212,6 +3214,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.resblur = mods.wavelet.resblur; } + if (wavelet.edgeffect) { + toEdit.wavelet.edgeffect = mods.wavelet.edgeffect; + } + if (wavelet.resblurc) { toEdit.wavelet.resblurc = mods.wavelet.resblurc; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 0b315583d..f117163dd 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -551,6 +551,7 @@ struct WaveletParamsEdited { bool chroma; bool contrast; bool edgrad; + bool edgeffect; bool edgval; bool edgthresh; bool thr; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index afedf750c..89e05346a 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -90,7 +90,7 @@ Wavelet::Wavelet() : reschro(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCHRO"), -100, 100, 1, 0))), resblur(Gtk::manage(new Adjuster(M("TP_WAVELET_RESBLUR"), 0, 100, 1, 0))), resblurc(Gtk::manage(new Adjuster(M("TP_WAVELET_RESBLURC"), 0, 100, 1, 0))), - bluwav(Gtk::manage(new Adjuster(M("TP_WAVELET_BLUWAV"), 0.05, 2.5, 0.01, 1.))), + bluwav(Gtk::manage(new Adjuster(M("TP_WAVELET_BLUWAV"), 0.05, 2.5, 0.5, 50.))), tmrs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMSTRENGTH"), -1.0, 2.0, 0.01, 0.0))), edgs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMEDGS"), 0.1, 4.0, 0.01, 1.4))), scale(Gtk::manage(new Adjuster(M("TP_WAVELET_TMSCALE"), 0.1, 10.0, 0.01, 1.0))), @@ -106,6 +106,7 @@ Wavelet::Wavelet() : radius(Gtk::manage(new Adjuster(M("TP_WAVELET_RADIUS"), 0, 100, 1, 40))), skinprotect(Gtk::manage(new Adjuster(M("TP_WAVELET_SKIN"), -100, 100, 1, 0.))), edgrad(Gtk::manage(new Adjuster(M("TP_WAVELET_EDRAD"), 0, 100, 1, 15))), + edgeffect(Gtk::manage(new Adjuster(M("TP_WAVELET_EDEFFECT"), 0.05, 2.5, 0.01, 1.))), edgval(Gtk::manage(new Adjuster(M("TP_WAVELET_EDVAL"), 0, 100, 1, 0))), edgthresh(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGTHRESH"), -50, 100, 1, 10))), strength(Gtk::manage(new Adjuster(M("TP_WAVELET_STRENGTH"), 0, 100, 1, 100))), @@ -196,7 +197,7 @@ Wavelet::Wavelet() : EvWavblshape = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLSHAPE"); EvWavresblur = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLURWAV"); EvWavresblurc = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLURCWAV"); - + EvWavedgeffect = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_EDGEFFECT"); expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings)); expcontrast->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expcontrast)); @@ -546,10 +547,14 @@ Wavelet::Wavelet() : // Edge Sharpness ToolParamBlock* const edgBox = Gtk::manage(new ToolParamBlock()); + edgeffect->setAdjusterListener(this); + edgBox->pack_start(*edgeffect); + edgeffect->set_tooltip_markup(M("TP_WAVELET_EDEFFECT_TOOLTIP")); edgval->setAdjusterListener(this); edgBox->pack_start(*edgval); + edgrad->setAdjusterListener(this); edgBox->pack_start(*edgrad); edgrad->set_tooltip_markup(M("TP_WAVELET_EDRAD_TOOLTIP")); @@ -1343,6 +1348,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) chro->setValue(pp->wavelet.chro); contrast->setValue(pp->wavelet.contrast); edgrad->setValue(pp->wavelet.edgrad); + edgeffect->setValue(pp->wavelet.edgeffect); edgval->setValue(pp->wavelet.edgval); edgthresh->setValue(pp->wavelet.edgthresh); thr->setValue(pp->wavelet.thr); @@ -1530,6 +1536,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) lipst->set_inconsistent(!pedited->wavelet.lipst); contrast->setEditedState(pedited->wavelet.contrast ? Edited : UnEdited); edgrad->setEditedState(pedited->wavelet.edgrad ? Edited : UnEdited); + edgeffect->setEditedState(pedited->wavelet.edgeffect ? Edited : UnEdited); edgval->setEditedState(pedited->wavelet.edgval ? Edited : UnEdited); thr->setEditedState(pedited->wavelet.thr ? Edited : UnEdited); thrH->setEditedState(pedited->wavelet.thrH ? Edited : UnEdited); @@ -1702,6 +1709,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.lipst = lipst->get_active(); pp->wavelet.contrast = contrast->getValue(); pp->wavelet.edgrad = edgrad->getValue(); + pp->wavelet.edgeffect = edgeffect->getValue(); pp->wavelet.edgval = edgval->getValue(); pp->wavelet.edgthresh = edgthresh->getValue(); pp->wavelet.thr = thr->getValue(); @@ -1823,6 +1831,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.chro = chro->getEditedState(); pedited->wavelet.contrast = contrast->getEditedState(); pedited->wavelet.edgrad = edgrad->getEditedState(); + pedited->wavelet.edgeffect = edgeffect->getEditedState(); pedited->wavelet.edgval = edgval->getEditedState(); pedited->wavelet.thr = thr->getEditedState(); pedited->wavelet.thrH = thrH->getEditedState(); @@ -2068,6 +2077,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit chro->setDefault(defParams->wavelet.chro); contrast->setDefault(defParams->wavelet.contrast); edgrad->setDefault(defParams->wavelet.edgrad); + edgeffect->setDefault(defParams->wavelet.edgeffect); edgval->setDefault(defParams->wavelet.edgval); edgthresh->setDefault(defParams->wavelet.edgthresh); thr->setDefault(defParams->wavelet.thr); @@ -2136,6 +2146,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit chro->setDefaultEditedState(pedited->wavelet.chro ? Edited : UnEdited); contrast->setDefaultEditedState(pedited->wavelet.contrast ? Edited : UnEdited); edgrad->setDefaultEditedState(pedited->wavelet.edgrad ? Edited : UnEdited); + edgeffect->setDefaultEditedState(pedited->wavelet.edgeffect ? Edited : UnEdited); edgval->setDefaultEditedState(pedited->wavelet.edgval ? Edited : UnEdited); edgthresh->setDefault(defParams->wavelet.edgthresh); thr->setDefaultEditedState(pedited->wavelet.thr ? Edited : UnEdited); @@ -2193,6 +2204,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit chro->setDefaultEditedState(Irrelevant); contrast->setDefaultEditedState(Irrelevant); edgrad->setDefaultEditedState(Irrelevant); + edgeffect->setDefaultEditedState(Irrelevant); edgval->setDefaultEditedState(Irrelevant); edgthresh->setDefaultEditedState(Irrelevant); thr->setDefaultEditedState(Irrelevant); @@ -2728,6 +2740,7 @@ void Wavelet::setBatchMode(bool batchMode) chro->showEditedCB(); contrast->showEditedCB(); edgrad->showEditedCB(); + edgeffect->showEditedCB(); edgval->showEditedCB(); edgthresh->showEditedCB(); thr->showEditedCB(); @@ -2856,6 +2869,8 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavedgeampli, edgeampli->getTextValue()); } else if (a == edgrad) { listener->panelChanged(EvWavedgrad, edgrad->getTextValue()); + } else if (a == edgeffect) { + listener->panelChanged(EvWavedgeffect, edgeffect->getTextValue()); } else if (a == edgval) { listener->panelChanged(EvWavedgval, edgval->getTextValue()); } else if (a == thres) { diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index 609d3226c..b73339973 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -88,6 +88,7 @@ private: rtengine::ProcEvent EvWavblshape; rtengine::ProcEvent EvWavresblur; rtengine::ProcEvent EvWavresblurc; + rtengine::ProcEvent EvWavedgeffect; void foldAllButMe(GdkEventButton* event, MyExpander *expander); @@ -207,6 +208,7 @@ private: Adjuster* const radius; Adjuster* const skinprotect; Adjuster* const edgrad; + Adjuster* const edgeffect; Adjuster* const edgval; Adjuster* const edgthresh; Adjuster* const strength; From 29596bb45747f50f54655e5fd42e6c00bb0bde07 Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 1 Apr 2020 10:16:24 +0200 Subject: [PATCH 060/109] change reset value slider bluwav to 1 --- rtgui/wavelet.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 89e05346a..5d2de1a02 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -90,7 +90,7 @@ Wavelet::Wavelet() : reschro(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCHRO"), -100, 100, 1, 0))), resblur(Gtk::manage(new Adjuster(M("TP_WAVELET_RESBLUR"), 0, 100, 1, 0))), resblurc(Gtk::manage(new Adjuster(M("TP_WAVELET_RESBLURC"), 0, 100, 1, 0))), - bluwav(Gtk::manage(new Adjuster(M("TP_WAVELET_BLUWAV"), 0.05, 2.5, 0.5, 50.))), + bluwav(Gtk::manage(new Adjuster(M("TP_WAVELET_BLUWAV"), 0.05, 2.5, 0.5, 1.))), tmrs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMSTRENGTH"), -1.0, 2.0, 0.01, 0.0))), edgs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMEDGS"), 0.1, 4.0, 0.01, 1.4))), scale(Gtk::manage(new Adjuster(M("TP_WAVELET_TMSCALE"), 0.1, 10.0, 0.01, 1.0))), From ed57e3163efb47e6ae9d699640fd7590a93cf853 Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 2 Apr 2020 09:10:33 +0200 Subject: [PATCH 061/109] Prepare ftblockdn to chroma denoise --- rtdata/languages/default | 8 +- rtengine/FTblockDN.cc | 285 +++++++++++++++++++++++++++++++-------- rtengine/improcfun.h | 23 +++- rtengine/ipwavelet.cc | 2 +- 4 files changed, 248 insertions(+), 70 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index ad98e3e71..2a90be072 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -803,7 +803,7 @@ HISTORY_MSG_WAVSOFTRAD;Soft radius clarity HISTORY_MSG_WAVSOFTRADEND;Soft radius final HISTORY_MSG_WAVUSHAMET;Clarity method HISTORY_MSG_THRESWAV;Balance threshold -HISTORY_MSG_BLUWAV;Effects +HISTORY_MSG_BLUWAV;Damper HISTORY_MSG_WAVOLDSH;Old algorithm HISTORY_MSG_WAVOFFSET;Offset HISTORY_MSG_WAVLOWTHR;Threshold low contrast @@ -2147,7 +2147,7 @@ TP_WAVELET_BASLI;Slider TP_WAVELET_BATYPE;Contrast balance method TP_WAVELET_BLCURVE;Blur by levels TP_WAVELET_BLURFRAME;Blur -TP_WAVELET_BLUWAV;Effects +TP_WAVELET_BLUWAV;Damper TP_WAVELET_CBENAB;Toning and Color Balance TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted TP_WAVELET_CCURVE;Local contrast @@ -2206,7 +2206,7 @@ TP_WAVELET_EDGEDETECTTHR;Threshold low (noise) TP_WAVELET_EDGEDETECTTHR2;Threshold high (detection) TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This adjuster lets you target edge detection for example to avoid applying edge sharpness to fine details, such as noise in the sky. TP_WAVELET_EDGEDETECT_TOOLTIP;Moving the slider to the right increases edge sensitivity. This affects local contrast, edge settings and noise. -TP_WAVELET_EDEFFECT;Effect +TP_WAVELET_EDEFFECT;Damper TP_WAVELET_EDEFFECT_TOOLTIP;This slider controls how wide the range of contrast values are that receive the maximum effect from the tool.\nMaximum value (2.5) disabled the tool TP_WAVELET_EDGESENSI;Edge sensitivity TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. @@ -2283,7 +2283,7 @@ TP_WAVELET_SETTINGS;Wavelet Settings TP_WAVELET_SHA;Sharp mask TP_WAVELET_SHFRAME;Shadows/Highlights TP_WAVELET_SHOWMASK;Show wavelet 'mask' -TP_WAVELET_SIGMA;Effects +TP_WAVELET_SIGMA;Damper TP_WAVELET_SIGMA_TOOLTIP;This slider controls how wide the range of contrast values are that receive the maximum effect from the tool.\n The higher it is, the more contrast values will be strongly modified and the higher the risk to generate artifacts. The lower it is, the more pinpoint will the effect be applied to a certain range of contrast values 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. diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 9120fe0ad..34e7351b8 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -63,8 +63,8 @@ namespace rtengine { -// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* Structure of the algorithm: @@ -483,7 +483,6 @@ enum nrquality {QUALITY_STANDARD, QUALITY_HIGH}; void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & noiseLCurve, const NoiseCurve & noiseCCurve, float &nresi, float &highresi) { BENCHFUN - //#ifdef _DEBUG MyTime t1e, t2e; t1e.set(); @@ -1183,6 +1182,7 @@ BENCHFUN } else { madL[lvl][dir - 1] = SQR(MadRgb(WavCoeffs_L[dir], Wlvl_L * Hlvl_L)); } + } } } @@ -1200,16 +1200,16 @@ BENCHFUN if (!memoryAllocationFailed) { if (nrQuality == QUALITY_STANDARD) { - if (!WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb)) { //enhance mode + if (!WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, nullptr, 0, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb, denoiseNestedLevels)) { //enhance mode memoryAllocationFailed = true; } } else { /*if (nrQuality==QUALITY_HIGH)*/ - if (!WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb)) { //enhance mode + if (!WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, nullptr, 0, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb, denoiseNestedLevels)) { //enhance mode memoryAllocationFailed = true; } if (!memoryAllocationFailed) { - if (!WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb)) { + if (!WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, nullptr, 0, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb, denoiseNestedLevels)) { memoryAllocationFailed = true; } } @@ -1237,16 +1237,16 @@ BENCHFUN if (!memoryAllocationFailed) { if (nrQuality == QUALITY_STANDARD) { - if (!WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb)) { //enhance mode + if (!WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, nullptr, 0, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb, denoiseNestedLevels)) { //enhance mode memoryAllocationFailed = true; } } else { /*if (nrQuality==QUALITY_HIGH)*/ - if (!WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb)) { //enhance mode + if (!WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, nullptr, 0, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb, denoiseNestedLevels)) { //enhance mode memoryAllocationFailed = true; } if (!memoryAllocationFailed) { - if (!WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb)) { + if (!WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, nullptr, 0, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb, denoiseNestedLevels)) { memoryAllocationFailed = true; } } @@ -1273,16 +1273,16 @@ BENCHFUN int edge = 0; if (nrQuality == QUALITY_STANDARD) { - if (!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, nullptr, edge)) { //enhance mode + if (!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, nullptr, edge, denoiseNestedLevels)) { //enhance mode memoryAllocationFailed = true; } } else { /*if (nrQuality==QUALITY_HIGH)*/ - if (!WaveletDenoiseAll_BiShrinkL(*Ldecomp, noisevarlum, madL)) { //enhance mode + if (!WaveletDenoiseAll_BiShrinkL(*Ldecomp, noisevarlum, madL, nullptr, edge, denoiseNestedLevels)) { //enhance mode memoryAllocationFailed = true; } if (!memoryAllocationFailed) { - if (!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, nullptr, edge)) { + if (!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, nullptr, edge, denoiseNestedLevels)) { memoryAllocationFailed = true; } } @@ -1354,9 +1354,11 @@ BENCHFUN #else int subThread = 0; #endif +// float blurbuffer[TS * TS] ALIGNED64; float *Lblox = LbloxArray[subThread]; float *fLblox = fLbloxArray[subThread]; float pBuf[width + TS + 2 * blkrad * offset] ALIGNED16; +// float nbrwt[TS * TS] ALIGNED64; #ifdef _OPENMP #pragma omp for #endif @@ -1432,6 +1434,7 @@ BENCHFUN for (int hblk = 0; hblk < numblox_W; ++hblk) { RGBtile_denoise(fLblox, hblk, noisevar_Ldetail); + // RGBtile_denoise(fLblox, hblk, noisevar_Ldetail, nbrwt, blurbuffer); }//end of horizontal block loop //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1448,8 +1451,14 @@ BENCHFUN //add row of blocks to output image tile RGBoutput_tile_row(Lblox, Ldetail, tilemask_out, height, width, topproc); + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + }//end of vertical block loop + + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + } + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #ifdef _OPENMP #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) @@ -2036,6 +2045,13 @@ BENCHFUN }//end of main RGB_denoise + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +//void ImProcFunctions::RGBtile_denoise(float * fLblox, int hblproc, float noisevar_Ldetail, float * nbrwt, float * blurbuffer) //for DCT void ImProcFunctions::RGBtile_denoise(float* fLblox, int hblproc, float noisevar_Ldetail) //for DCT { float nbrwt[TS * TS] ALIGNED64; @@ -2062,6 +2078,10 @@ void ImProcFunctions::RGBtile_denoise(float* fLblox, int hblproc, float noisevar } + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + void ImProcFunctions::RGBoutput_tile_row(float *bloxrow_L, float ** Ldetail, float ** tilemask_out, int height, int width, int top) { const int numblox_W = ceil((static_cast(width)) / (offset)); @@ -2189,11 +2209,19 @@ void ImProcFunctions::Noise_residualAB(const wavelet_decomposition &WaveletCoeff chmaxresid = maxresid; } -bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3]) +bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge, int denoiseNestedLevels) { int maxlvl = min(WaveletCoeffs_L.maxlevel(), 5); const float eps = 0.01f; + if (edge == 1 || edge == 3) { + maxlvl = 4; //for refine denoise edge wavelet + } + + if (edge == 2) { + maxlvl = 7; //for locallab denoise + } + int maxWL = 0, maxHL = 0; for (int lvl = 0; lvl < maxlvl; ++lvl) { @@ -2204,6 +2232,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W if (WaveletCoeffs_L.level_H(lvl) > maxHL) { maxHL = WaveletCoeffs_L.level_H(lvl); } + } bool memoryAllocationFailed = false; @@ -2234,14 +2263,52 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl); if (lvl == maxlvl - 1) { - int edge = 0; - ShrinkAllL(WaveletCoeffs_L, buffer, lvl, dir, noisevarlum, madL[lvl], nullptr, edge); - } else { + // int edge = 0; + ShrinkAllL(WaveletCoeffs_L, buffer, lvl, dir, noisevarlum, madL[lvl], vari, edge); + } else { //simple wavelet shrinkage float * sfave = buffer[0] + 32; float * sfaved = buffer[2] + 96; float mad_Lr = madL[lvl][dir - 1]; + /* + if ((edge == 1 || edge == 2 || edge == 3) && vari) { + noisevarlum = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer + + for (int i = 0; i < Wlvl_L * Hlvl_L; ++i) { + noisevarlum[i] = vari[lvl]; + } + } + */ + float *nvl = nullptr; + nvl = new float[Hlvl_L * Wlvl_L]; + + for (int i = 0; i < Hlvl_L * Wlvl_L; ++i) { + nvl[i] = 0.f; + } + if ((edge == 1 || edge == 2 || edge == 3) && vari) { + // nvl = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer + if ((edge == 1 || edge == 3)) { + for (int i = 0; i < Hlvl_L * Wlvl_L; ++i) { + nvl[i] = vari[lvl]; + } + } + + if (edge == 2) { + for (int i = 0; i < Hlvl_L * Wlvl_L; ++i) { + nvl[i] = vari[lvl] * SQR(noisevarlum[i]); + } + } + + } + + else { + for (int i = 0; i < Hlvl_L * Wlvl_L; ++i) { + nvl[i] = noisevarlum[i]; + } + + } + float levelFactor = mad_Lr * 5.f / (lvl + 1); #ifdef __SSE2__ @@ -2253,14 +2320,14 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W int coeffloc_L; for (coeffloc_L = 0; coeffloc_L < Hlvl_L * Wlvl_L - 3; coeffloc_L += 4) { - mad_Lv = LVFU(noisevarlum[coeffloc_L]) * levelFactorv; + mad_Lv = LVFU(nvl[coeffloc_L]) * levelFactorv; mag_Lv = SQRV(LVFU(WavCoeffs_L[dir][coeffloc_L])); STVFU(sfave[coeffloc_L], mag_Lv / (mag_Lv + mad_Lv * xexpf(-mag_Lv / (mad_Lv * ninev)) + epsv)); } for (; coeffloc_L < Hlvl_L * Wlvl_L; ++coeffloc_L) { float mag_L = SQR(WavCoeffs_L[dir][coeffloc_L]); - sfave[coeffloc_L] = mag_L / (mag_L + levelFactor * noisevarlum[coeffloc_L] * xexpf(-mag_L / (9.f * levelFactor * noisevarlum[coeffloc_L])) + eps); + sfave[coeffloc_L] = mag_L / (mag_L + levelFactor * nvl[coeffloc_L] * xexpf(-mag_L / (9.f * levelFactor * nvl[coeffloc_L])) + eps); } #else @@ -2270,12 +2337,13 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W int coeffloc_L = i * Wlvl_L + j; float mag_L = SQR(WavCoeffs_L[dir][coeffloc_L]); - sfave[coeffloc_L] = mag_L / (mag_L + levelFactor * noisevarlum[coeffloc_L] * xexpf(-mag_L / (9.f * levelFactor * noisevarlum[coeffloc_L])) + eps); + sfave[coeffloc_L] = mag_L / (mag_L + levelFactor * nvl[coeffloc_L] * xexpf(-mag_L / (9.f * levelFactor * nvl[coeffloc_L])) + eps); } } #endif boxblur(sfave, sfaved, lvl + 2, Wlvl_L, Hlvl_L, false); //increase smoothness by locally averaging shrinkage + #ifdef __SSE2__ vfloat sfavev; vfloat sf_Lv; @@ -2306,7 +2374,9 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W } #endif + delete [] nvl; } + } } } @@ -2321,11 +2391,20 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W return (!memoryAllocationFailed); } -bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, - float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb) + +bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float *variC, int local, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, int denoiseNestedLevels) + { int maxlvl = WaveletCoeffs_L.maxlevel(); + if (local == 2) { + maxlvl = 7; //for local denoise + } + + if (local == 3) { + maxlvl = 4; //for shape detection + } + if (autoch && noisevar_ab <= 0.001f) { noisevar_ab = 0.02f; } @@ -2393,14 +2472,36 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition & float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); if (lvl == maxlvl - 1) { - ShrinkAllAB(WaveletCoeffs_L, WaveletCoeffs_ab, buffer, lvl, dir, noisevarchrom, noisevar_ab, useNoiseCCurve, autoch, denoiseMethodRgb, madL[lvl], madab[lvl], true); + ShrinkAllAB(WaveletCoeffs_L, WaveletCoeffs_ab, buffer, lvl, dir, noisevarchrom, noisevar_ab, useNoiseCCurve, autoch, denoiseMethodRgb, madL[lvl], nullptr, 0, madab[lvl], true); } else { //simple wavelet shrinkage + float noisevarfc; float mad_Lr = madL[lvl][dir - 1]; - float mad_abr = useNoiseCCurve ? noisevar_ab * madab[lvl][dir - 1] : SQR(noisevar_ab) * madab[lvl][dir - 1]; + float *nvc = nullptr; + nvc = new float[Hlvl_ab * Wlvl_ab]; - if (noisevar_ab > 0.001f) { + if ((local == 2 || local == 3) && variC && useNoiseCCurve) { + noisevarfc = variC[lvl]; + + for (int p = 0; p < Hlvl_ab * Wlvl_ab; p++) { + nvc[p] = 10.f * sqrt(variC[lvl]) * SQR(1.f + 4.f * noisevarchrom[p]); + } + + } else { + noisevarfc = noisevar_ab; + + for (int p = 0; p < Hlvl_ab * Wlvl_ab; p++) { + nvc[p] = noisevarchrom[p]; + } + + } + + + // float mad_abr = useNoiseCCurve ? noisevar_ab * madab[lvl][dir - 1] : SQR(noisevar_ab) * madab[lvl][dir - 1]; + float mad_abr = useNoiseCCurve ? noisevarfc * madab[lvl][dir - 1] : SQR(noisevarfc) * madab[lvl][dir - 1]; + + if (noisevarfc > 0.001f) { #ifdef __SSE2__ vfloat onev = F2V(1.f); @@ -2412,7 +2513,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition & int coeffloc_ab; for (coeffloc_ab = 0; coeffloc_ab < Hlvl_ab * Wlvl_ab - 3; coeffloc_ab += 4) { - mad_abv = LVFU(noisevarchrom[coeffloc_ab]) * mad_abrv; + mad_abv = LVFU(nvc[coeffloc_ab]) * mad_abrv; tempabv = LVFU(WavCoeffs_ab[dir][coeffloc_ab]); mag_Lv = LVFU(WavCoeffs_L[dir][coeffloc_ab]); @@ -2425,7 +2526,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition & for (; coeffloc_ab < Hlvl_ab * Wlvl_ab; ++coeffloc_ab) { float mag_L = SQR(WavCoeffs_L[dir][coeffloc_ab ]); float mag_ab = SQR(WavCoeffs_ab[dir][coeffloc_ab]); - WavCoeffs_ab[dir][coeffloc_ab] *= SQR(1.f - xexpf(-(mag_ab / (noisevarchrom[coeffloc_ab] * mad_abr)) - (mag_L / (9.f * mad_Lr)))/*satfactor_a*/); + WavCoeffs_ab[dir][coeffloc_ab] *= SQR(1.f - xexpf(-(mag_ab / (nvc[coeffloc_ab] * mad_abr)) - (mag_L / (9.f * mad_Lr)))/*satfactor_a*/); }//now chrominance coefficients are denoised #else @@ -2437,7 +2538,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition & float mag_L = SQR(WavCoeffs_L[dir][coeffloc_ab ]); float mag_ab = SQR(WavCoeffs_ab[dir][coeffloc_ab]); - WavCoeffs_ab[dir][coeffloc_ab] *= SQR(1.f - xexpf(-(mag_ab / (noisevarchrom[coeffloc_ab] * mad_abr)) - (mag_L / (9.f * mad_Lr)))/*satfactor_a*/); + WavCoeffs_ab[dir][coeffloc_ab] *= SQR(1.f - xexpf(-(mag_ab / (nvc[coeffloc_ab] * mad_abr)) - (mag_L / (9.f * mad_Lr)))/*satfactor_a*/); } }//now chrominance coefficients are denoised @@ -2445,9 +2546,12 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition & #endif } + delete [] nvc; + } } } + } for (int i = 2; i >= 0; i--) { @@ -2459,16 +2563,20 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition & } -bool ImProcFunctions::WaveletDenoiseAllL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge)//mod JD +bool ImProcFunctions::WaveletDenoiseAllL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge, int denoiseNestedLevels)//mod JD { int maxlvl = min(WaveletCoeffs_L.maxlevel(), 5); - if (edge == 1) { + if (edge == 1 || edge == 3) { maxlvl = 4; //for refine denoise edge wavelet } + if (edge == 2) { + maxlvl = 7; //for locallab denoise + } + int maxWL = 0, maxHL = 0; for (int lvl = 0; lvl < maxlvl; ++lvl) { @@ -2517,11 +2625,20 @@ bool ImProcFunctions::WaveletDenoiseAllL(const wavelet_decomposition &WaveletCoe bool ImProcFunctions::WaveletDenoiseAllAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, - float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb)//mod JD + float *noisevarchrom, float madL[8][3], float *variC, int local, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, int denoiseNestedLevels)//mod JD { int maxlvl = WaveletCoeffs_L.maxlevel(); + + if (local == 2) { + maxlvl = 7; //for local denoise + } + + if (local == 3) { + maxlvl = 4; //for shape detection + } + int maxWL = 0, maxHL = 0; for (int lvl = 0; lvl < maxlvl; ++lvl) { @@ -2555,7 +2672,7 @@ bool ImProcFunctions::WaveletDenoiseAllAB(const wavelet_decomposition &WaveletCo for (int lvl = 0; lvl < maxlvl; ++lvl) { for (int dir = 1; dir < 4; ++dir) { - ShrinkAllAB(WaveletCoeffs_L, WaveletCoeffs_ab, buffer, lvl, dir, noisevarchrom, noisevar_ab, useNoiseCCurve, autoch, denoiseMethodRgb, madL[lvl]); + ShrinkAllAB(WaveletCoeffs_L, WaveletCoeffs_ab, buffer, lvl, dir, noisevarchrom, noisevar_ab, useNoiseCCurve, autoch, denoiseMethodRgb, madL[lvl], variC, local, nullptr, 0); } } } @@ -2569,8 +2686,6 @@ bool ImProcFunctions::WaveletDenoiseAllAB(const wavelet_decomposition &WaveletCo return (!memoryAllocationFailed); } -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% void ImProcFunctions::ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir, @@ -2582,7 +2697,7 @@ void ImProcFunctions::ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, f float * sfave = buffer[0] + 32; float * sfaved = buffer[1] + 64; - float * blurBuffer = buffer[2] + 96; +// float * blurBuffer = buffer[2] + 96; const int W_L = WaveletCoeffs_L.level_W(level); const int H_L = WaveletCoeffs_L.level_H(level); @@ -2591,30 +2706,54 @@ void ImProcFunctions::ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, f const float mad_L = madL[dir - 1] ; const float levelFactor = mad_L * 5.f / static_cast(level + 1); - if (edge == 1 && vari) { - noisevarlum = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer + float *nvl = nullptr; + nvl = new float[ H_L * W_L]; - for (int i = 0; i < W_L * H_L; ++i) { - noisevarlum[i] = vari[level]; - } + for (int i = 0; i < W_L * H_L; ++i) { + nvl[i] = 0.f; } + if ((edge == 1 || edge == 2 || edge == 3) && vari) { + // nvl = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer + if ((edge == 1 || edge == 3)) { + for (int i = 0; i < W_L * H_L; ++i) { + nvl[i] = vari[level]; //* SQR(1.f + 4.f * noisevarchrom[p]); + } + } + + if (edge == 2) { + for (int i = 0; i < W_L * H_L; ++i) { + nvl[i] = vari[level] * SQR(noisevarlum[i]); + } + } + + } + + else { + for (int i = 0; i < W_L * H_L; ++i) { + nvl[i] = noisevarlum[i]; + } + + } int i = 0; #ifdef __SSE2__ const vfloat levelFactorv = F2V(levelFactor); const vfloat ninev = F2V(9.f); const vfloat epsv = F2V(eps); - for (; i < W_L * H_L - 3; i += 4) { - const vfloat mad_Lv = LVFU(noisevarlum[i]) * levelFactorv; + + for (i = 0; i < W_L * H_L - 3; i += 4) { + // const vfloat mad_Lv = LVFU(noisevarlum[i]) * levelFactorv; + const vfloat mad_Lv = LVFU(nvl[i]) * levelFactorv; const vfloat magv = SQRV(LVFU(WavCoeffs_L[dir][i])); STVFU(sfave[i], magv / (magv + mad_Lv * xexpf(-magv / (ninev * mad_Lv)) + epsv)); } + #endif // few remaining pixels for (; i < W_L * H_L; ++i) { - const float mag = SQR(WavCoeffs_L[dir][i]); - sfave[i] = mag / (mag + levelFactor * noisevarlum[i] * xexpf(-mag / (9 * levelFactor * noisevarlum[i])) + eps); + float mag = SQR(WavCoeffs_L[dir][i]); + sfave[i] = mag / (mag + levelFactor * nvl[i] * xexpf(-mag / (9 * levelFactor * nvl[i])) + eps); } boxblur(sfave, sfaved, level + 2, W_L, H_L, false); //increase smoothness by locally averaging shrinkage @@ -2634,12 +2773,15 @@ void ImProcFunctions::ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, f //use smoothed shrinkage unless local shrinkage is much less WavCoeffs_L[dir][i] *= (SQR(sfaved[i]) + SQR(sf)) / (sfaved[i] + sf + eps); }//now luminance coefficients are denoised + + delete [] nvl; + } -void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float **buffer, int level, int dir, - float *noisevarchrom, float noisevar_ab, const bool useNoiseCCurve, bool autoch, - bool denoiseMethodRgb, float * madL, float * madaab, bool madCalculated) +void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition & WaveletCoeffs_L, const wavelet_decomposition & WaveletCoeffs_ab, float **buffer, int level, int dir, + float * noisevarchrom, float noisevar_ab, const bool useNoiseCCurve, bool autoch, + bool denoiseMethodRgb, float * madL, float * variC, int local, float * madaab, bool madCalculated) { //simple wavelet shrinkage @@ -2651,6 +2793,7 @@ void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, float * sfaveab = buffer[0] + 32; float * sfaveabd = buffer[1] + 64; + // float * blurBuffer = buffer[2] + 96; int W_ab = WaveletCoeffs_ab.level_W(level); int H_ab = WaveletCoeffs_ab.level_H(level); @@ -2670,9 +2813,30 @@ void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, madab = SQR(MadRgb(WavCoeffs_ab[dir], W_ab * H_ab)); } } + float noisevarfc; - if (noisevar_ab > 0.001f) { - madab = useNoiseCCurve ? madab : madab * noisevar_ab; + float *nvc = nullptr; + nvc = new float[ H_ab * W_ab]; + + if ((local == 2 || local == 3) && variC && useNoiseCCurve) { + noisevarfc = variC[level]; + for (int p = 0; p < H_ab * W_ab; p++) { + nvc[p] = 10.f * sqrt(variC[level]) * SQR(1.f + 4.f * noisevarchrom[p]); + } + + } else { + noisevarfc = noisevar_ab; + + for (int p = 0; p < H_ab * W_ab; p++) { + nvc[p] = noisevarchrom[p]; + } + + } + + // printf("varfc=%f nvc0=%f nvc1=%f nvc2=%f\n", noisevarfc, nvc[10], nvc[H_ab * W_ab /3], nvc[H_ab * W_ab /2]); + if (noisevarfc > 0.001f) {//noisevar_ab + //madab = useNoiseCCurve ? madab : madab * noisevar_ab; + madab = useNoiseCCurve ? madab : madab * noisevarfc; #ifdef __SSE2__ vfloat onev = F2V(1.f); vfloat mad_abrv = F2V(madab); @@ -2680,10 +2844,11 @@ void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, vfloat rmadLm9v = onev / F2V(mad_L * 9.f); vfloat mad_abv ; vfloat mag_Lv, mag_abv; + int coeffloc_ab; for (coeffloc_ab = 0; coeffloc_ab < H_ab * W_ab - 3; coeffloc_ab += 4) { - mad_abv = LVFU(noisevarchrom[coeffloc_ab]) * mad_abrv; + mad_abv = LVFU(nvc[coeffloc_ab]) * mad_abrv; mag_Lv = LVFU(WavCoeffs_L[dir][coeffloc_ab]); mag_abv = SQRV(LVFU(WavCoeffs_ab[dir][coeffloc_ab])); @@ -2695,7 +2860,7 @@ void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, for (; coeffloc_ab < H_ab * W_ab; ++coeffloc_ab) { float mag_L = SQR(WavCoeffs_L[dir][coeffloc_ab]); float mag_ab = SQR(WavCoeffs_ab[dir][coeffloc_ab]); - sfaveab[coeffloc_ab] = (1.f - xexpf(-(mag_ab / (noisevarchrom[coeffloc_ab] * madab)) - (mag_L / (9.f * mad_L)))); + sfaveab[coeffloc_ab] = (1.f - xexpf(-(mag_ab / (nvc[coeffloc_ab] * madab)) - (mag_L / (9.f * mad_L)))); }//now chrominance coefficients are denoised #else @@ -2705,13 +2870,14 @@ void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, int coeffloc_ab = i * W_ab + j; float mag_L = SQR(WavCoeffs_L[dir][coeffloc_ab]); float mag_ab = SQR(WavCoeffs_ab[dir][coeffloc_ab]); - sfaveab[coeffloc_ab] = (1.f - xexpf(-(mag_ab / (noisevarchrom[coeffloc_ab] * madab)) - (mag_L / (9.f * mad_L)))); + sfaveab[coeffloc_ab] = (1.f - xexpf(-(mag_ab / (nvc[coeffloc_ab] * madab)) - (mag_L / (9.f * mad_L)))); } }//now chrominance coefficients are denoised #endif - boxblur(sfaveab, sfaveabd, level + 2, W_ab, H_ab, false); //increase smoothness by locally averaging shrinkage + +// boxblur(sfaveab, sfaveabd, blurBuffer, level + 2, level + 2, W_ab, H_ab); //increase smoothness by locally averaging shrinkage #ifdef __SSE2__ vfloat epsv = F2V(eps); vfloat sfabv; @@ -2749,12 +2915,13 @@ void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, #endif } + delete [] nvc; } void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** WavCoeffs_b, - int W_ab, int H_ab, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut, - float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, int schoice, int lvl, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, - float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb) + int W_ab, int H_ab, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float & chaut, int &Nb, float & redaut, float & blueaut, + float & maxredaut, float & maxblueaut, float & minredaut, float & minblueaut, int schoice, int lvl, float & chromina, float & sigma, float & lumema, float & sigma_L, float & redyel, float & skinc, float & nsknc, + float & maxchred, float & maxchblue, float & minchred, float & minchblue, int &nb, float & chau, float & chred, float & chblue, bool denoiseMethodRgb) { //simple wavelet shrinkage @@ -2869,9 +3036,9 @@ void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** WavCoeffs_b, } -void ImProcFunctions::WaveletDenoiseAll_info(int levwav, const wavelet_decomposition &WaveletCoeffs_a, - const wavelet_decomposition &WaveletCoeffs_b, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, int schoice, - float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb) +void ImProcFunctions::WaveletDenoiseAll_info(int levwav, const wavelet_decomposition & WaveletCoeffs_a, + const wavelet_decomposition & WaveletCoeffs_b, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float & chaut, int &Nb, float & redaut, float & blueaut, float & maxredaut, float & maxblueaut, float & minredaut, float & minblueaut, int schoice, + float & chromina, float & sigma, float & lumema, float & sigma_L, float & redyel, float & skinc, float & nsknc, float & maxchred, float & maxchblue, float & minchred, float & minchblue, int &nb, float & chau, float & chred, float & chblue, bool denoiseMethodRgb) { int maxlvl = levwav; @@ -2914,7 +3081,7 @@ void ImProcFunctions::RGB_denoise_infoGamCurve(const procparams::DirPyrDenoisePa } } -void ImProcFunctions::calcautodn_info(float &chaut, float &delta, int Nb, int levaut, float maxmax, float lumema, float chromina, int mode, int lissage, float redyel, float skinc, float nsknc) +void ImProcFunctions::calcautodn_info(float & chaut, float & delta, int Nb, int levaut, float maxmax, float lumema, float chromina, int mode, int lissage, float redyel, float skinc, float nsknc) { float reducdelta = 1.f; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index affa33640..3513efd92 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -238,18 +238,29 @@ public: void RGB_denoise_info(Imagefloat * src, Imagefloat * provicalc, bool isRAW, const LUTf &gamcurve, float gam, float gamthresh, float gamslope, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float & maxblueaut, float &minredaut, float & minblueaut, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, bool multiThread = false); void RGBtile_denoise(float * fLblox, int hblproc, float noisevar_Ldetail); //for DCT void RGBoutput_tile_row(float *bloxrow_L, float ** Ldetail, float ** tilemask_out, int height, int width, int top); - bool WaveletDenoiseAllL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge); - bool WaveletDenoiseAllAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb); +// bool WaveletDenoiseAllL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge); +// bool WaveletDenoiseAllAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb); void WaveletDenoiseAll_info(int levwav, const wavelet_decomposition &WaveletCoeffs_a, const wavelet_decomposition &WaveletCoeffs_b, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float & minblueaut, int schoice, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb); - bool WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3]); - bool WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab, - const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb); + bool WaveletDenoiseAllL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge, int denoiseNestedLevels); + bool WaveletDenoiseAllAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float *variC, int local, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, int denoiseNestedLevels); + bool WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float *variC, int local, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, int denoiseNestedLevels); + + bool WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge, int denoiseNestedLevels); +// bool WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3]); +// bool WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab, +// const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb); + void ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir, float *noisevarlum, float * madL, float * vari, int edge); void ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float **buffer, int level, int dir, - float *noisevarchrom, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, float * madL, float * madaab = nullptr, bool madCalculated = false); + float *noisevarchrom, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, float * madL, float * variC, int local, float * madaab = nullptr, bool madCalculated = false); + + +// void ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir, float *noisevarlum, float * madL, float * vari, int edge); +// void ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float **buffer, int level, int dir, +// float *noisevarchrom, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, float * madL, float * madaab = nullptr, bool madCalculated = false); void ShrinkAll_info(float ** WavCoeffs_a, float ** WavCoeffs_b, int W_ab, int H_ab, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, int schoice, int lvl, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb); diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 53f685826..848451090 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -877,7 +877,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const vari[3] = rtengine::max(0.0001f, vari[3]); float* noisevarlum = nullptr; // we need a dummy to pass it to WaveletDenoiseAllL - WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, vari, edge); + WaveletDenoiseAllL (*Ldecomp, noisevarlum, madL, vari, edge, 1); } //Flat curve for Contrast=f(H) in levels From 61c6b19533f4a2207371d7ec8169fc0b7405cd21 Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 2 Apr 2020 12:32:29 +0200 Subject: [PATCH 062/109] GUI for wavelt denoise chroma --- rtdata/languages/default | 7 ++++++ rtengine/procparams.cc | 12 ++++++++++ rtengine/procparams.h | 3 +++ rtgui/paramsedited.cc | 18 +++++++++++++++ rtgui/paramsedited.h | 3 +++ rtgui/wavelet.cc | 48 ++++++++++++++++++++++++++++++++++++++++ rtgui/wavelet.h | 7 ++++++ 7 files changed, 98 insertions(+) diff --git a/rtdata/languages/default b/rtdata/languages/default index 2a90be072..94f1e691c 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -791,6 +791,9 @@ HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength HISTORY_MSG_TEMPOUT;CAM02 automatic temperature HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor HISTORY_MSG_TRANS_Method;Geometry - Method +HISTORY_MSG_WAVBALCHROM;Balance chroma +HISTORY_MSG_WAVCHROMFI;Chroma fine +HISTORY_MSG_WAVCHROMCO;Chroma coarse HISTORY_MSG_WAVCLARI;Clarity HISTORY_MSG_WAVEDGS;Edge stopping HISTORY_MSG_WAVMERGEC;Merge C @@ -2142,6 +2145,7 @@ TP_WAVELET_BALANCE;Contrast balance d/v-h TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the wavelet directions: vertical-horizontal and diagonal.\nIf contrast, chroma or residual tone mapping are activated, the effect due to balance is amplified. TP_WAVELET_BALCHRO;Chroma balance TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance. +TP_WAVELET_BALCHROM;Chroma balance TP_WAVELET_BANONE;None TP_WAVELET_BASLI;Slider TP_WAVELET_BATYPE;Contrast balance method @@ -2157,7 +2161,10 @@ TP_WAVELET_CH3;Link contrast levels TP_WAVELET_CHCU;Curve TP_WAVELET_CHR;Chroma-contrast link strength TP_WAVELET_CHRO;Saturated/pastel threshold +TP_WAVELET_CHROFRAME;Denoise Chroma TP_WAVELET_CHROMAFRAME;Chroma +TP_WAVELET_CHROMCO;Chroma Coarse +TP_WAVELET_CHROMFI;Chroma Fine TP_WAVELET_CHRO_TOOLTIP;Sets the wavelet level which will be the threshold between saturated and pastel colors.\n1-x: saturated\nx-9: pastel\n\nIf the value exceeds the amount of wavelet levels you are using then it will be ignored. TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of "contrast levels" and "chroma-contrast link strength" TP_WAVELET_CHRWAV;Blur chroma diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index ae5b6b465..270e28a6a 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2248,6 +2248,9 @@ WaveletParams::WaveletParams() : bluemed(0), greenhigh(0), bluehigh(0), + balchrom(0.), + chromfi(0.), + chromco(0.), mergeL(40.), mergeC(20.), softrad(0.), @@ -2358,6 +2361,9 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && bluemed == other.bluemed && greenhigh == other.greenhigh && bluehigh == other.bluehigh + && balchrom == other.balchrom + && chromfi == other.chromfi + && chromco == other.chromco && mergeL == other.mergeL && mergeC == other.mergeC && softrad == other.softrad @@ -3520,6 +3526,9 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.bluehigh, "Wavelet", "CBbluehigh", wavelet.bluehigh, keyFile); saveToKeyfile(!pedited || pedited->wavelet.bluemed, "Wavelet", "CBbluemed", wavelet.bluemed, keyFile); saveToKeyfile(!pedited || pedited->wavelet.bluelow, "Wavelet", "CBbluelow", wavelet.bluelow, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.balchrom, "Wavelet", "Balchrom", wavelet.balchrom, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.chromfi, "Wavelet", "Chromfine", wavelet.chromfi, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.chromco, "Wavelet", "Chromcoarse", wavelet.chromco, keyFile); saveToKeyfile(!pedited || pedited->wavelet.mergeL, "Wavelet", "MergeL", wavelet.mergeL, keyFile); saveToKeyfile(!pedited || pedited->wavelet.mergeC, "Wavelet", "MergeC", wavelet.mergeC, keyFile); saveToKeyfile(!pedited || pedited->wavelet.softrad, "Wavelet", "Softrad", wavelet.softrad, keyFile); @@ -4690,6 +4699,9 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "CBbluehigh", pedited, wavelet.bluehigh, pedited->wavelet.bluehigh); assignFromKeyfile(keyFile, "Wavelet", "CBbluemed", pedited, wavelet.bluemed, pedited->wavelet.bluemed); assignFromKeyfile(keyFile, "Wavelet", "CBbluelow", pedited, wavelet.bluelow, pedited->wavelet.bluelow); + assignFromKeyfile(keyFile, "Wavelet", "Balchrom", pedited, wavelet.balchrom, pedited->wavelet.balchrom); + assignFromKeyfile(keyFile, "Wavelet", "Chromfine", pedited, wavelet.chromfi, pedited->wavelet.chromfi); + assignFromKeyfile(keyFile, "Wavelet", "Chromcoarse", pedited, wavelet.chromco, pedited->wavelet.chromco); assignFromKeyfile(keyFile, "Wavelet", "MergeL", pedited, wavelet.mergeL, pedited->wavelet.mergeL); assignFromKeyfile(keyFile, "Wavelet", "MergeC", pedited, wavelet.mergeC, pedited->wavelet.mergeC); assignFromKeyfile(keyFile, "Wavelet", "Softrad", pedited, wavelet.softrad, pedited->wavelet.softrad); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 7174dfb3c..a6147ccc5 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1205,6 +1205,9 @@ struct WaveletParams { int bluemed; int greenhigh; int bluehigh; + double balchrom; + double chromfi; + double chromco; double mergeL; double mergeC; double softrad; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 87c405d42..0685e1471 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -486,6 +486,9 @@ void ParamsEdited::set(bool v) wavelet.bluemed = v; wavelet.bluelow = v; wavelet.lipst = v; + wavelet.balchrom = v; + wavelet.chromfi = v; + wavelet.chromco = v; wavelet.mergeL = v; wavelet.mergeC = v; wavelet.softrad = v; @@ -1093,6 +1096,9 @@ void ParamsEdited::initFrom(const std::vector& wavelet.bluelow = wavelet.bluelow && p.wavelet.bluelow == other.wavelet.bluelow; wavelet.lipst = wavelet.lipst && p.wavelet.lipst == other.wavelet.lipst; wavelet.bluehigh = wavelet.bluehigh && p.wavelet.bluehigh == other.wavelet.bluehigh; + wavelet.balchrom = wavelet.balchrom && p.wavelet.balchrom == other.wavelet.balchrom; + wavelet.chromfi = wavelet.chromfi && p.wavelet.chromfi == other.wavelet.chromfi; + wavelet.chromco = wavelet.chromco && p.wavelet.chromco == other.wavelet.chromco; wavelet.mergeL = wavelet.mergeL && p.wavelet.mergeL == other.wavelet.mergeL; wavelet.mergeC = wavelet.mergeC && p.wavelet.mergeC == other.wavelet.mergeC; wavelet.softrad = wavelet.softrad && p.wavelet.softrad == other.wavelet.softrad; @@ -2929,6 +2935,18 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.bluelow = mods.wavelet.bluelow; } + if (wavelet.balchrom) { + toEdit.wavelet.balchrom = mods.wavelet.balchrom; + } + + if (wavelet.chromfi) { + toEdit.wavelet.chromfi = mods.wavelet.chromfi; + } + + if (wavelet.chromco) { + toEdit.wavelet.chromco = mods.wavelet.chromco; + } + if (wavelet.mergeL) { toEdit.wavelet.mergeL = mods.wavelet.mergeL; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index f117163dd..4465d15b4 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -586,6 +586,9 @@ struct WaveletParamsEdited { bool bluemed; bool greenhigh; bool bluehigh; + bool balchrom; + bool chromfi; + bool chromco; bool mergeL; bool mergeC; bool softrad; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 5d2de1a02..836cdfe1f 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -130,6 +130,9 @@ Wavelet::Wavelet() : edgedetectthr2(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGEDETECTTHR2"), -10, 100, 1, 0))), edgesensi(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGESENSI"), 0, 100, 1, 60))), edgeampli(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGEAMPLI"), 0, 100, 1, 10))), + balchrom(Gtk::manage(new Adjuster(M("TP_WAVELET_BALCHROM"), -100., 100., 1., 0., Gtk::manage(new RTImage("circle-blue-small.png")), Gtk::manage(new RTImage("circle-red-small.png"))))), + chromfi(Gtk::manage(new Adjuster(M("TP_WAVELET_CHROMFI"), 0, 100, 1, 0))), + chromco(Gtk::manage(new Adjuster(M("TP_WAVELET_CHROMCO"), 0, 100, 1, 0))), mergeL(Gtk::manage(new Adjuster(M("TP_WAVELET_MERGEL"), -50, 100, 1, 40))), mergeC(Gtk::manage(new Adjuster(M("TP_WAVELET_MERGEC"), -50, 100, 1, 20))), softrad(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.5, 0.))), @@ -157,6 +160,7 @@ Wavelet::Wavelet() : contFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_CONTFRAME")))), blurFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_BLURFRAME")))), chromaFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_CHROMAFRAME")))), + chroFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_CHROFRAME")))), wavLabels(Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER))), labmC(Gtk::manage(new Gtk::Label(M("TP_WAVELET_CTYPE") + ":"))), labmNP(Gtk::manage(new Gtk::Label(M("TP_WAVELET_NPTYPE") + ":"))), @@ -179,6 +183,9 @@ Wavelet::Wavelet() : auto m = ProcEventMapper::getInstance(); EvWavenaclari = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVCLARI"); EvWavushamet = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVUSHAMET"); + EvWavbalchrom = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVBALCHROM"); + EvWavchromfi = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVCHROMFI"); + EvWavchromco = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVCHROMCO"); EvWavmergeL = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVMERGEL"); EvWavmergeC = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVMERGEC"); EvWavsoftrad = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSOFTRAD"); @@ -523,6 +530,22 @@ Wavelet::Wavelet() : noiseBox->pack_start(*level2noise, Gtk::PACK_SHRINK, 0); noiseBox->pack_start(*level3noise, Gtk::PACK_SHRINK, 0); + balchrom->setAdjusterListener(this); +// noiseBox->pack_start(*balchrom, Gtk::PACK_SHRINK, 0); + chromfi->setAdjusterListener(this); +// noiseBox->pack_start(*chromfi, Gtk::PACK_SHRINK, 0); + chromco->setAdjusterListener(this); +// noiseBox->pack_start(*chromco, Gtk::PACK_SHRINK, 0); + + chroFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const chroBox = Gtk::manage(new ToolParamBlock()); + chroBox->pack_start(*balchrom); + chroBox->pack_start(*chromfi); + chroBox->pack_start(*chromco); + chroFrame->add(*chroBox); + noiseBox->pack_start(*chroFrame); + + //Clarity mergeL->setAdjusterListener(this); mergeC->setAdjusterListener(this); @@ -1383,6 +1406,9 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) softrad->setValue(pp->wavelet.softrad); softradend->setValue(pp->wavelet.softradend); + balchrom->setValue(pp->wavelet.balchrom); + chromfi->setValue(pp->wavelet.chromfi); + chromco->setValue(pp->wavelet.chromco); level0noise->setValue(pp->wavelet.level0noise); level1noise->setValue(pp->wavelet.level1noise); level2noise->setValue(pp->wavelet.level2noise); @@ -1528,6 +1554,10 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) softrad->setEditedState(pedited->wavelet.softrad ? Edited : UnEdited); softradend->setEditedState(pedited->wavelet.softradend ? Edited : UnEdited); + balchrom->setEditedState(pedited->wavelet.balchrom ? Edited : UnEdited); + chromfi->setEditedState(pedited->wavelet.chromfi ? Edited : UnEdited); + chromco->setEditedState(pedited->wavelet.chromco ? Edited : UnEdited); + median->set_inconsistent(!pedited->wavelet.median); medianlev->set_inconsistent(!pedited->wavelet.medianlev); linkedg->set_inconsistent(!pedited->wavelet.linkedg); @@ -1746,6 +1776,9 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.satlev = satlev->getValue (); pp->wavelet.strength = (int) strength->getValue(); pp->wavelet.balance = (int) balance->getValue(); + pp->wavelet.balchrom = balchrom->getValue(); + pp->wavelet.chromfi = chromfi->getValue(); + pp->wavelet.chromco = chromco->getValue(); pp->wavelet.greenlow = greenlow->getValue(); pp->wavelet.bluelow = bluelow->getValue(); @@ -1865,6 +1898,9 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.bluemed = bluemed->getEditedState(); pedited->wavelet.greenhigh = greenhigh->getEditedState(); pedited->wavelet.bluehigh = bluehigh->getEditedState(); + pedited->wavelet.balchrom = balchrom->getEditedState(); + pedited->wavelet.chromfi = chromfi->getEditedState(); + pedited->wavelet.chromco = chromco->getEditedState(); pedited->wavelet.mergeL = mergeL->getEditedState(); pedited->wavelet.mergeC = mergeC->getEditedState(); pedited->wavelet.softrad = softrad->getEditedState(); @@ -2096,6 +2132,9 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit level1noise->setDefault (defParams->wavelet.level1noise); level2noise->setDefault (defParams->wavelet.level2noise); level3noise->setDefault (defParams->wavelet.level3noise); + balchrom->setDefault(defParams->wavelet.balchrom); + chromfi->setDefault(defParams->wavelet.chromfi); + chromco->setDefault(defParams->wavelet.chromco); greenlow->setDefault(defParams->wavelet.greenlow); bluelow->setDefault(defParams->wavelet.bluelow); @@ -2119,6 +2158,9 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit mergeC->setDefaultEditedState(pedited->wavelet.mergeC ? Edited : UnEdited); softrad->setDefaultEditedState(pedited->wavelet.softrad ? Edited : UnEdited); softradend->setDefaultEditedState(pedited->wavelet.softradend ? Edited : UnEdited); + balchrom->setDefaultEditedState(pedited->wavelet.balchrom ? Edited : UnEdited); + chromfi->setDefaultEditedState(pedited->wavelet.chromfi ? Edited : UnEdited); + chromco->setDefaultEditedState(pedited->wavelet.chromco ? Edited : UnEdited); sigma->setDefault(defParams->wavelet.sigma); offset->setDefault(defParams->wavelet.offset); @@ -2912,6 +2954,12 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavgreenhigh, greenhigh->getTextValue()); } else if (a == bluehigh) { listener->panelChanged(EvWavbluehigh, bluehigh->getTextValue()); + } else if (a == balchrom) { + listener->panelChanged(EvWavbalchrom, balchrom->getTextValue()); + } else if (a == chromfi) { + listener->panelChanged(EvWavchromfi, chromfi->getTextValue()); + } else if (a == chromco) { + listener->panelChanged(EvWavchromco, chromco->getTextValue()); } else if (a == mergeL) { listener->panelChanged(EvWavmergeL, mergeL->getTextValue()); } else if (a == mergeC) { diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index b73339973..07d2432ac 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -70,6 +70,9 @@ public: private: rtengine::ProcEvent EvWavenaclari; rtengine::ProcEvent EvWavushamet; + rtengine::ProcEvent EvWavbalchrom; + rtengine::ProcEvent EvWavchromfi; + rtengine::ProcEvent EvWavchromco; rtengine::ProcEvent EvWavmergeL; rtengine::ProcEvent EvWavmergeC; rtengine::ProcEvent EvWavsoftrad; @@ -241,6 +244,9 @@ private: Adjuster* const edgedetectthr2; Adjuster* const edgesensi; Adjuster* const edgeampli; + Adjuster* const balchrom; + Adjuster* const chromfi; + Adjuster* const chromco; Adjuster* const mergeL; Adjuster* const mergeC; Adjuster* const softrad; @@ -285,6 +291,7 @@ private: Gtk::Frame* const contFrame; Gtk::Frame* const blurFrame; Gtk::Frame* const chromaFrame; + Gtk::Frame* const chroFrame; Gtk::Label* const wavLabels; Gtk::Label* const labmC; From 8886402e93461cf1ddf1d144298399b1f2eba7f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 2 Apr 2020 13:23:57 +0200 Subject: [PATCH 063/109] Fix Clang-10 warnings --- rtengine/iccstore.cc | 2 +- rtengine/ipwavelet.cc | 16 ++++++++-------- rtgui/editorpanel.cc | 2 +- rtgui/preferences.cc | 4 ++-- rtgui/profilestorecombobox.cc | 4 ++-- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/rtengine/iccstore.cc b/rtengine/iccstore.cc index 9d7024bff..6b2be1713 100644 --- a/rtengine/iccstore.cc +++ b/rtengine/iccstore.cc @@ -635,7 +635,7 @@ public: MyMutex::MyLock lock(mutex); - for (const auto profile : fileProfiles) { + for (const auto& profile : fileProfiles) { if ( ( type == ICCStore::ProfileType::MONITOR diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 53f685826..fa82db28b 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1845,8 +1845,8 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * WavCoeffs_L0[i] = aft[i]; } - delete bef; - delete aft; + delete[] bef; + delete[] aft; } // #ifdef _OPENMP @@ -2070,8 +2070,8 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * WavCoeffs_L[dir][co] = aft[co]; } - delete bef; - delete aft; + delete[] bef; + delete[] aft; } } } @@ -2288,8 +2288,8 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float WavCoeffs_ab0[i] = aft[i]; } - delete bef; - delete aft; + delete[] bef; + delete[] aft; } @@ -2371,8 +2371,8 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float WavCoeffs_ab[dir][co] = aft[co]; } - delete bef; - delete aft; + delete[] bef; + delete[] aft; } diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 6a0d41878..1a82c4a94 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -172,7 +172,7 @@ private: const std::vector profiles = rtengine::ICCStore::getInstance()->getProfiles (rtengine::ICCStore::ProfileType::MONITOR); - for (const auto profile : profiles) { + for (const auto& profile : profiles) { profileBox.append (profile); } diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 083444342..5268948cc 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -778,7 +778,7 @@ Gtk::Widget* Preferences::getColorManPanel () const std::vector profiles = rtengine::ICCStore::getInstance ()->getProfiles (rtengine::ICCStore::ProfileType::MONITOR); - for (const auto profile : profiles) { + for (const auto& profile : profiles) { if (profile.find("file:") != 0) { std::string fileis_RTv4 = profile.substr(0, 4); @@ -847,7 +847,7 @@ Gtk::Widget* Preferences::getColorManPanel () const std::vector prtprofiles = rtengine::ICCStore::getInstance ()->getProfiles (rtengine::ICCStore::ProfileType::PRINTER); - for (const auto prtprofile : prtprofiles) { + for (const auto& prtprofile : prtprofiles) { prtProfile->append (prtprofile); } diff --git a/rtgui/profilestorecombobox.cc b/rtgui/profilestorecombobox.cc index bb294189f..a6085e7a9 100644 --- a/rtgui/profilestorecombobox.cc +++ b/rtgui/profilestorecombobox.cc @@ -182,7 +182,7 @@ Gtk::TreeIter ProfileStoreComboBox::findRowFromEntry (const ProfileStoreEntry *p Gtk::TreeIter ProfileStoreComboBox::findRowFromFullPath_ (Gtk::TreeModel::Children childs, int parentFolderId, const Glib::ustring &name) const { - for (const auto iter : childs) { + for (const auto& iter : childs) { const Gtk::TreeModel::Row row = *iter; // Hombre: is there a smarter way of knowing if this row has childs? const ProfileStoreEntry *pse = row[methodColumns.profileStoreEntry]; @@ -309,7 +309,7 @@ Gtk::TreeIter ProfileStoreComboBox::getRowFromLabel (const Glib::ustring &name) const Gtk::TreeModel::Children childs = refTreeModel->children(); if (!name.empty()) { - for (const auto iter : childs) { + for (const auto& iter : childs) { const Gtk::TreeModel::Row currRow = *iter; const ProfileStoreEntry *pse = currRow[methodColumns.profileStoreEntry]; From ac0d54ef3e79c390211ba7a78bd6f7696959fe32 Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 3 Apr 2020 07:37:16 +0200 Subject: [PATCH 064/109] Display pyramid mea[] --- rtengine/ipwavelet.cc | 609 ++++++++++++++++++++++++++++++------------ rtgui/wavelet.cc | 2 +- 2 files changed, 433 insertions(+), 178 deletions(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 848451090..2b741a89b 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -138,6 +138,9 @@ struct cont_params { float edgampl; int neigh; bool lipp; + float balchrom; + float chromfi; + float chromco; }; int wavNestedLevels = 1; @@ -196,6 +199,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (params->wavelet.BAmethod != "none") { cp.bam = true; + if (params->wavelet.BAmethod == "sli") { cp.BAmet = 1; } else if (params->wavelet.BAmethod == "cur") { @@ -260,7 +264,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const DaubLen = 8; } else if (params->wavelet.daubcoeffmethod == "10_") { DaubLen = 12; - } else /* if (params->wavelet.daubcoeffmethod == "14_") */{ + } else { /* if (params->wavelet.daubcoeffmethod == "14_") */ DaubLen = 16; } @@ -394,6 +398,9 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.val = waparams.edgval; cp.til = waparams.edgthresh; cp.eff = waparams.edgeffect; + cp.balchrom = waparams.balchrom; + cp.chromfi = waparams.chromfi; + cp.chromco = waparams.chromco; cp.conres = waparams.rescon; cp.conresH = waparams.resconH; @@ -860,7 +867,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (cp.val > 0 || ref || contr) { //edge Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN); } - + //init for edge and denoise float vari[4]; @@ -877,7 +884,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const vari[3] = rtengine::max(0.0001f, vari[3]); float* noisevarlum = nullptr; // we need a dummy to pass it to WaveletDenoiseAllL - WaveletDenoiseAllL (*Ldecomp, noisevarlum, madL, vari, edge, 1); + WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, vari, edge, 1); } //Flat curve for Contrast=f(H) in levels @@ -906,6 +913,213 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } + + /* + float variC[7]; + float variCb[7]; + + float noisecfr = cp.chromfi; + float noiseccr = cp.chromco; + + if (cp.balchrom > 0.f) { + noisecfr = cp.chromfi * ((100.f + cp.balchrom) / 10.f); + noiseccr = cp.chromco + ((100.f + cp.balchrom) / 10.f); + } + + float noisecfb = cp.chromfi; + float noiseccb = cp.chromco; + + if (cp.balchrom < 0.f) { + noisecfb = cp.chromfi * ((100.f - cp.balchrom) / 10.f); + noiseccb = cp.chromco * ((100.f - cp.balchrom) / 10.f); + } + + + if (noisecfr < 0.f) { + noisecfr = 0.0001f; + } + + if (noiseccr < 0.f) { + noiseccr = 0.0001f; + } + + if (noisecfb < 0.f) { + noisecfb = 0.0001f; + } + + if (noiseccb < 0.f) { + noiseccb = 0.0001f; + } + + int edge = 2; + variC[0] = SQR(noisecfr); + variC[1] = SQR(noisecfr); + variC[2] = SQR(noisecfr); + + variC[3] = SQR(noisecfr); + variC[4] = SQR(noisecfr); + variC[5] = SQR(noiseccr); + variC[6] = SQR(noiseccr); + + variCb[0] = SQR(noisecfb); + variCb[1] = SQR(noisecfb); + variCb[2] = SQR(noisecfb); + + variCb[3] = SQR(noisecfb); + variCb[4] = SQR(noisecfb); + variCb[5] = SQR(noiseccb); + variCb[6] = SQR(noiseccb); + + float k1 = 0.f; + float k2 = 0.f; + float k3 = 0.f; + + if (cp.chromfi) { + k1 = 0.f; + k2 = 0.f; + k3 = 0.f; + } else if (cp.chromfi < 0.3f) { + k1 = 0.1f; + k2 = 0.0f; + k3 = 0.f; + } else if (cp.chromfi < 0.5f) { + k1 = 0.2f; + k2 = 0.1f; + k3 = 0.f; + } else if (cp.chromfi < 0.8f) { + k1 = 0.3f; + k2 = 0.25f; + k3 = 0.f; + } else if (cp.chromfi < 1.f) { + k1 = 0.4f; + k2 = 0.25f; + k3 = 0.1f; + } else if (cp.chromfi < 2.f) { + k1 = 0.5f; + k2 = 0.3f; + k3 = 0.15f; + } else if (cp.chromfi < 3.f) { + k1 = 0.6f; + k2 = 0.45f; + k3 = 0.3f; + } else if (cp.chromfi < 4.f) { + k1 = 0.7f; + k2 = 0.5f; + k3 = 0.4f; + } else if (cp.chromfi < 5.f) { + k1 = 0.8f; + k2 = 0.6f; + k3 = 0.5f; + } else if (cp.chromfi < 10.f) { + k1 = 0.85f; + k2 = 0.7f; + k3 = 0.6f; + } else if (cp.chromfi < 20.f) { + k1 = 0.9f; + k2 = 0.8f; + k3 = 0.7f; + } else if (cp.chromfi < 50.f) { + k1 = 1.f; + k2 = 1.f; + k3 = 0.9f; + + } else { + k1 = 1.f; + k2 = 1.f; + k3 = 1.f; + } + + float minic = 0.0001f; + variC[0] = max(minic, variC[0]); + variC[1] = max(minic, k1 * variC[1]); + variC[2] = max(minic, k2 * variC[2]); + variC[3] = max(minic, k3 * variC[3]); + + variCb[0] = max(minic, variCb[0]); + variCb[1] = max(minic, k1 * variCb[1]); + variCb[2] = max(minic, k2 * variCb[2]); + variCb[3] = max(minic, k3 * variCb[3]); + + float k4 = 0.f; + float k5 = 0.f; + float k6 = 0.f; + + if (cp.chromco == 0.01f) { + k4 = 0.f; + k5 = 0.0f; + } else if (cp.chromco < 0.2f) { + k4 = 0.1f; + k5 = 0.0f; + } else if (cp.chromco < 0.5f) { + k4 = 0.15f; + k5 = 0.0f; + } else if (cp.chromco < 1.f) { + k4 = 0.15f; + k5 = 0.1f; + } else if (cp.chromco < 3.f) { + k4 = 0.3f; + k5 = 0.15f; + } else if (cp.chromco < 4.f) { + k4 = 0.6f; + k5 = 0.4f; + } else if (cp.chromco < 6.f) { + k4 = 0.8f; + k5 = 0.6f; + } else { + k4 = 1.f; + k5 = 1.f; + } + + variC[4] = max(0.0001f, k4 * variC[4]); + variC[5] = max(0.0001f, k5 * variC[5]); + variCb[4] = max(0.0001f, k4 * variCb[4]); + variCb[5] = max(0.0001f, k5 * variCb[5]); + + if (cp.chromco < 4.f) { + k6 = 0.f; + } else if (cp.chromco < 5.f) { + k6 = 0.4f; + } else if (cp.chromco < 6.f) { + k6 = 0.7f; + } else { + k6 = 1.f; + } + + variC[6] = max(0.0001f, k6 * variC[6]); + variCb[6] = max(0.0001f, k6 * variCb[6]); + float nvch = 0.6f;//high value + float nvcl = 0.1f;//low value + + if (cp.chromco > 100.f) { + nvch = 0.8f; + nvcl = 0.4f; + } + + float seuil = 4000.f;//low + float seuil2 = 15000.f;//high + //ac and bc for transition + float ac = (nvch - nvcl) / (seuil - seuil2); + float bc = nvch - seuil * ac; + int GW = labco->W; + int GH = labco->H; + float* noisevarchrom = new float[GH * GW]; + //noisevarchrom in function chroma + int GW2 = (GW + 1) / 2; + float noisevarab_r = 100.f; //SQR(lp.noisecc / 10.0); + for (int ir = 0; ir < GH; ir++) + for (int jr = 0; jr < GW; jr++) { + float cN = sqrt(SQR(labco->a[ir][jr]) + SQR(labco->b[ir][jr])); + + if (cN < seuil) { + noisevarchrom[(ir >> 1)*GW2 + (jr >> 1)] = nvch; + } else if (cN < seuil2) { + noisevarchrom[(ir >> 1)*GW2 + (jr >> 1)] = ac * cN + bc; + } else { + noisevarchrom[(ir >> 1)*GW2 + (jr >> 1)] = nvcl; + } + } + */ + //Flat curve for H=f(H) in residual image FlatCurve* hhCurve = new FlatCurve(params->wavelet.hhcurve); //curve H=f(H) bool hhutili = false; @@ -971,7 +1185,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (!adecomp->memoryAllocationFailed && !bdecomp->memoryAllocationFailed) { Evaluate2(*adecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); - WaveletcontAllAB(labco, varhue, varchro, *adecomp,wavblcurve, waOpacityCurveW, cp, true, skip, meanab, sigmaab); + WaveletcontAllAB(labco, varhue, varchro, *adecomp, wavblcurve, waOpacityCurveW, cp, true, skip, meanab, sigmaab); Evaluate2(*bdecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip, meanab, sigmaab); WaveletAandBAllAB(*adecomp, *bdecomp, cp, hhCurve, hhutili); @@ -983,6 +1197,8 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } + // delete[] noisevarchrom; + if (hhCurve) { delete hhCurve; } @@ -1248,7 +1464,7 @@ void ImProcFunctions::Aver(float * RESTRICT DataList, int datalen, float &averag int countP = 0, countN = 0; double averaP = 0.0, averaN = 0.0; // use double precision for large summations - constexpr float thres = 32.7f;//different fom zero to take into account only data large enough 32.7 = 0.1 in range 0..100 very low value + constexpr float thres = 32.7f;//different fom zero to take into account only data large enough 32.7 = 0.1 in range 0..100 very low value max = 0.f; min = RT_INFINITY_F; #ifdef _OPENMP @@ -1350,51 +1566,54 @@ void ImProcFunctions::Evaluate2(const wavelet_decomposition &WaveletCoeffs_L, void ImProcFunctions::calceffect(int level, float *mean, float *sigma, float *mea, float effect, float offs) { - float rap = 0.f; - float sig = 1.f; - if(effect < 1.f) { - sig = effect; - } + float rap = 0.f; + float sig = 1.f; - if(effect <= 1.f) { - rap = offs * mean[level] - sig * sigma[level]; - } - - if (rap > 0.f) { - mea[0] = rap; - } else { - mea[0] = mean[level] / 6.f; - } + if (effect < 1.f) { + sig = effect; + } - rap = 0.f; - if(effect <= 1.f) { - rap = offs * mean[level] - 0.5f * sig * sigma[level]; - } + if (effect <= 1.f) { + rap = offs * mean[level] - sig * sigma[level]; + } - if (rap > 0.f) { - mea[1] = rap; - } else { - mea[1] = mean[level] / 4.f; - } + if (rap > 0.f) { + mea[0] = rap; + } else { + mea[0] = mean[level] / 6.f; + } - rap = 0.f; - if(effect <= 1.f) { - rap = offs * mean[level] - 0.2f * sig * sigma[level]; - } - - if (rap > 0.f) { - mea[2] = rap; - } else { - mea[2] = mean[level] / 2.f; - } - - mea[3] = offs * mean[level]; // 50% data - mea[4] = offs * mean[level] + effect * sigma[level] / 2.f; - mea[5] = offs * mean[level] + effect * sigma[level]; //66% - mea[6] = offs * mean[level] + effect * 1.2f * sigma[level]; - mea[7] = offs * mean[level] + effect * 1.5f * sigma[level]; // - mea[8] = offs * mean[level] + effect * 2.f * sigma[level]; //95% - mea[9] = offs * mean[level] + effect * 2.5f * sigma[level]; //99% + rap = 0.f; + + if (effect <= 1.f) { + rap = offs * mean[level] - 0.5f * sig * sigma[level]; + } + + if (rap > 0.f) { + mea[1] = rap; + } else { + mea[1] = mean[level] / 4.f; + } + + rap = 0.f; + + if (effect <= 1.f) { + rap = offs * mean[level] - 0.2f * sig * sigma[level]; + } + + if (rap > 0.f) { + mea[2] = rap; + } else { + mea[2] = mean[level] / 2.f; + } + + mea[3] = offs * mean[level]; // 50% data + mea[4] = offs * mean[level] + effect * sigma[level] / 2.f; + mea[5] = offs * mean[level] + effect * sigma[level]; //66% + mea[6] = offs * mean[level] + effect * 1.2f * sigma[level]; + mea[7] = offs * mean[level] + effect * 1.5f * sigma[level]; // + mea[8] = offs * mean[level] + effect * 2.f * sigma[level]; //95% + mea[9] = offs * mean[level] + effect * 2.5f * sigma[level]; //99% } void ImProcFunctions::Eval2(float ** WavCoeffs_L, int level, @@ -1725,7 +1944,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif { - if(contrast != 0.f && cp.resena && max0 > 0.f) { // contrast = 0.f means that all will be multiplied by 1.f, so we can skip this step + if (contrast != 0.f && cp.resena && max0 > 0.f) { // contrast = 0.f means that all will be multiplied by 1.f, so we can skip this step { #ifdef _OPENMP @@ -1784,71 +2003,76 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } #ifdef _OPENMP - #pragma omp barrier + #pragma omp barrier #endif - if((cp.conres != 0.f || cp.conresH != 0.f) && cp.resena && cp.oldsh) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step + if ((cp.conres != 0.f || cp.conresH != 0.f) && cp.resena && cp.oldsh) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step #ifdef _OPENMP - #pragma omp for nowait + #pragma omp for nowait #endif - for (int i = 0; i < W_L * H_L; i++) { - float LL = WavCoeffs_L0[i]; - float LL100 = LL / 327.68f; - float tran = 5.f;//transition - //shadow - float alp = 3.f; //increase contrast sahdow in lowlights between 1 and ?? + for (int i = 0; i < W_L * H_L; i++) { + float LL = WavCoeffs_L0[i]; + float LL100 = LL / 327.68f; + float tran = 5.f;//transition + //shadow + float alp = 3.f; //increase contrast sahdow in lowlights between 1 and ?? - if(cp.th > (100.f - tran)) { - tran = 100.f - cp.th; - } + if (cp.th > (100.f - tran)) { + tran = 100.f - cp.th; + } - if(LL100 < cp.th) { - float aalp = (1.f - alp) / cp.th; //no changes for LL100 = cp.th - float kk = aalp * LL100 + alp; - WavCoeffs_L0[i] *= (1.f + kk * cp.conres / 200.f); - } else if(LL100 < cp.th + tran) { - float ath = -cp.conres / tran; - float bth = cp.conres - ath * cp.th; - WavCoeffs_L0[i] *= (1.f + (LL100 * ath + bth) / 200.f); - } + if (LL100 < cp.th) { + float aalp = (1.f - alp) / cp.th; //no changes for LL100 = cp.th + float kk = aalp * LL100 + alp; + WavCoeffs_L0[i] *= (1.f + kk * cp.conres / 200.f); + } else if (LL100 < cp.th + tran) { + float ath = -cp.conres / tran; + float bth = cp.conres - ath * cp.th; + WavCoeffs_L0[i] *= (1.f + (LL100 * ath + bth) / 200.f); + } - //highlight - tran = 5.f; + //highlight + tran = 5.f; - if(cp.thH < (tran)) { - tran = cp.thH; - } + if (cp.thH < (tran)) { + tran = cp.thH; + } - if(LL100 > cp.thH) { - WavCoeffs_L0[i] *= (1.f + cp.conresH / 200.f); - } else if(LL100 > (cp.thH - tran)) { - float athH = cp.conresH / tran; - float bthH = cp.conresH - athH * cp.thH; - WavCoeffs_L0[i] *= (1.f + (LL100 * athH + bthH) / 200.f); - } + if (LL100 > cp.thH) { + WavCoeffs_L0[i] *= (1.f + cp.conresH / 200.f); + } else if (LL100 > (cp.thH - tran)) { + float athH = cp.conresH / tran; + float bthH = cp.conresH - athH * cp.thH; + WavCoeffs_L0[i] *= (1.f + (LL100 * athH + bthH) / 200.f); } } + } //Blur luma - if(cp.blurres != 0.f && cp.resena) { + if (cp.blurres != 0.f && cp.resena) { float rad = 0.7f * cp.blurres / skip; float * bef = new float[W_L * H_L]; float * aft = new float[W_L * H_L]; for (int i = 0; i < H_L * W_L; i++) { - bef[i] = WavCoeffs_L0[i]; + bef[i] = WavCoeffs_L0[i]; } + boxblur(bef, aft, rad, W_L, H_L, false); for (int i = 0; i < H_L * W_L; i++) { WavCoeffs_L0[i] = aft[i]; } - delete bef; - delete aft; + delete[] bef; + delete[] aft; } + // + int n0, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n32; + n0 = n1 = n2 = n3 = n4 = n5 = n6 = n7 = n8 = n9 = n10 = n32 = 0; + #ifdef _OPENMP #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif @@ -1992,6 +2216,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * // end } + bool wavcurvecomp = false;//not enable if 0.75 if (wavblcurve) { @@ -2003,7 +2228,8 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } #ifdef _OPENMP - #pragma omp for schedule(dynamic) collapse(2) + // #pragma omp for schedule(dynamic) collapse(2) + #pragma omp for reduction(+:n0, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n32) schedule(dynamic) collapse(2) #endif for (int dir = 1; dir < 4; dir++) { @@ -2017,12 +2243,13 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * ContAllL(koeLi, maxkoeLi, true, maxlvl, labco, varhue, varchrom, WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); //blur level float klev = 1.f; - if(wavblcurve && wavcurvecomp && cp.blena) { + + if (wavblcurve && wavcurvecomp && cp.blena) { float mea[10]; float effect = cp.bluwav; float beta = 0.f; float offs = 1.f; - + calceffect(lvl, mean, sigma, mea, effect, offs); float * bef = new float[Wlvl_L * Hlvl_L]; @@ -2032,37 +2259,58 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * bef[co] = WavCoeffs_L[dir][co]; float WavCL = std::fabs(WavCoeffs_L[dir][co]); - if (WavCL < mea[0]) { - beta = 0.05f; - } else if (WavCL < mea[1]) { - beta = 0.2f; - } else if (WavCL < mea[2]) { - beta = 0.7f; - } else if (WavCL < mea[3]) { - beta = 1.f; //standard - } else if (WavCL < mea[4]) { - beta = 1.f; - } else if (WavCL < mea[5]) { - beta = 0.8f; //+sigma - } else if (WavCL < mea[6]) { - beta = 0.6f; - } else if (WavCL < mea[7]) { - beta = 0.4f; - } else if (WavCL < mea[8]) { - beta = 0.2f; // + 2 sigma - } else if (WavCL < mea[9]) { - beta = 0.1f; - } else { - beta = 0.0f; + if (WavCL < mea[0]) { + beta = 0.05f; + n0++; + + if (WavCL < 32.7) { + n32++; } - - + } else if (WavCL < mea[1]) { + beta = 0.2f; + n1++; + } else if (WavCL < mea[2]) { + beta = 0.7f; + n2++; + } else if (WavCL < mea[3]) { + beta = 1.f; //standard + n3++; + } else if (WavCL < mea[4]) { + beta = 1.f; + n4++; + } else if (WavCL < mea[5]) { + beta = 0.8f; //+sigma + n5++; + } else if (WavCL < mea[6]) { + beta = 0.6f; + n6++; + } else if (WavCL < mea[7]) { + beta = 0.4f; + n7++; + } else if (WavCL < mea[8]) { + beta = 0.2f; // + 2 sigma + n8++; + } else if (WavCL < mea[9]) { + beta = 0.1f; + n9++; + } else { + beta = 0.01f; + n10++; + } + + + } + + if (settings->verbose) { + printf("lvl=%i n0=%i n32=%i n1=%i n2=%i n3=%i n4=%i n5=%i n6=%i n7=%i n8=%i n9=%i n10=%i\n", lvl, n0, n0 - n32, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10); } klev = (wavblcurve[lvl * 55.5f]); float lvr = lvl; - if(lvr == 0) { + + if (lvr == 0) { lvr = 1; } + klev *= beta * lvr * 100.f / skip; boxblur(bef, aft, klev, Wlvl_L, Hlvl_L, false); @@ -2070,8 +2318,8 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * WavCoeffs_L[dir][co] = aft[co]; } - delete bef; - delete aft; + delete[] bef; + delete[] aft; } } } @@ -2272,41 +2520,42 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float } } } - + //Blur chroma - if(cp.blurcres != 0.f && cp.resena) { - float rad = 0.7f * cp.blurcres / skip; - float * bef = new float[W_L * H_L]; - float * aft = new float[W_L * H_L]; + if (cp.blurcres != 0.f && cp.resena) { + float rad = 0.7f * cp.blurcres / skip; + float * bef = new float[W_L * H_L]; + float * aft = new float[W_L * H_L]; - for (int i = 0; i < H_L * W_L; i++) { - bef[i] = WavCoeffs_ab0[i]; - } - boxblur(bef, aft, rad, W_L, H_L, false); + for (int i = 0; i < H_L * W_L; i++) { + bef[i] = WavCoeffs_ab0[i]; + } - for (int i = 0; i < H_L * W_L; i++) { - WavCoeffs_ab0[i] = aft[i]; + boxblur(bef, aft, rad, W_L, H_L, false); + + for (int i = 0; i < H_L * W_L; i++) { + WavCoeffs_ab0[i] = aft[i]; + } + + delete[] bef; + delete[] aft; } - delete bef; - delete aft; - } + bool wavcurvecomp = false;//not enable if 0.75 - bool wavcurvecomp = false;//not enable if 0.75 - - if (wavblcurve) { - for (int i = 0; i < 500; i++) { - if (wavblcurve[i] != 0.) { - wavcurvecomp = true; + if (wavblcurve) { + for (int i = 0; i < 500; i++) { + if (wavblcurve[i] != 0.) { + wavcurvecomp = true; + } } } - } #ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif - + for (int dir = 1; dir < 4; dir++) { for (int lvl = 0; lvl < maxlvl; lvl++) { @@ -2316,63 +2565,66 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); ContAllAB(labco, maxlvl, varhue, varchrom, WavCoeffs_ab, WavCoeffs_ab0, lvl, dir, waOpacityCurveW, cp, Wlvl_ab, Hlvl_ab, useChannelA); - if(wavblcurve && wavcurvecomp && cp.blena && cp.chrwav > 0.f) { + if (wavblcurve && wavcurvecomp && cp.blena && cp.chrwav > 0.f) { float mea[10]; float effect = cp.bluwav; float beta = 0.f; float offs = 1.f; - + calceffect(lvl, meanab, sigmaab, mea, effect, offs); - + float * bef = new float[Wlvl_ab * Hlvl_ab]; float * aft = new float[Wlvl_ab * Hlvl_ab]; float klev; + for (int co = 0; co < Hlvl_ab * Wlvl_ab; co++) { bef[co] = WavCoeffs_ab[dir][co]; - float WavCab = std::fabs(WavCoeffs_ab[dir][co]); + float WavCab = std::fabs(WavCoeffs_ab[dir][co]); + + if (WavCab < mea[0]) { + beta = 0.05f; + } else if (WavCab < mea[1]) { + beta = 0.2f; + } else if (WavCab < mea[2]) { + beta = 0.7f; + } else if (WavCab < mea[3]) { + beta = 1.f; //standard + } else if (WavCab < mea[4]) { + beta = 1.f; + } else if (WavCab < mea[5]) { + beta = 0.8f; //+sigma + } else if (WavCab < mea[6]) { + beta = 0.6f; + } else if (WavCab < mea[7]) { + beta = 0.4f; + } else if (WavCab < mea[8]) { + beta = 0.2f; // + 2 sigma + } else if (WavCab < mea[9]) { + beta = 0.1f; + } else { + beta = 0.0f; + } + - if (WavCab < mea[0]) { - beta = 0.05f; - } else if (WavCab < mea[1]) { - beta = 0.2f; - } else if (WavCab < mea[2]) { - beta = 0.7f; - } else if (WavCab < mea[3]) { - beta = 1.f; //standard - } else if (WavCab < mea[4]) { - beta = 1.f; - } else if (WavCab < mea[5]) { - beta = 0.8f; //+sigma - } else if (WavCab < mea[6]) { - beta = 0.6f; - } else if (WavCab < mea[7]) { - beta = 0.4f; - } else if (WavCab < mea[8]) { - beta = 0.2f; // + 2 sigma - } else if (WavCab < mea[9]) { - beta = 0.1f; - } else { - beta = 0.0f; - } - - } - klev = (wavblcurve[lvl * 55.5f]); + + klev = (wavblcurve[lvl * 55.5f]); float lvr = lvl; - if(lvr == 0) { + + if (lvr == 0) { lvr = 1; } klev *= beta * cp.chrwav * lvr * 200.f / skip; - + boxblur(bef, aft, klev, Wlvl_ab, Hlvl_ab, false); for (int co = 0; co < Hlvl_ab * Wlvl_ab; co++) { WavCoeffs_ab[dir][co] = aft[co]; } - delete bef; - delete aft; + delete[] bef; + delete[] aft; } @@ -2725,11 +2977,13 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz float mea[10]; float beta = 1.f; - if(cp.eff < 2.5f) { + + if (cp.eff < 2.5f) { float effect = cp.eff; float offs = 1.f; calceffect(level, mean, sigma, mea, effect, offs); + for (int co = 0; co < H_L * W_L; co++) { float WavCL = std::fabs(WavCoeffs_L[dir][co]); @@ -2756,14 +3010,14 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz } else { beta = 0.0f; } - + } } if (cp.val > 0 && cp.edgeena) { - - + + float * koe = nullptr; float maxkoe = 0.f; @@ -2852,6 +3106,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz float atten01234 = 0.80f; value *= (atten01234 * scaleskip[1]); //for zoom < 100% reduce strength...I choose level 1...but!! } + value *= beta; float edge = 1.f; float lim0 = 20.f; //arbitrary limit for low radius and level between 2 or 3 to 30 maxi @@ -2862,8 +3117,8 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz if (cp.reinforce != 2) { const float brepart = cp.reinforce == 1 - ? 3.f - : 0.5f; + ? 3.f + : 0.5f; const float arepart = -(brepart - 1.f) / (lim0 / 60.f); if (rad < lim0 / 60.f) { @@ -3186,7 +3441,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz float red0 = 0.005f * (110.f - lowthr); float red1 = 0.008f * (110.f - lowthr); float red2 = 0.011f * (110.f - lowthr); - + for (int i = 0; i < W_L * H_L; i++) { float kLlev = 1.f; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 836cdfe1f..21507ce05 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -543,7 +543,7 @@ Wavelet::Wavelet() : chroBox->pack_start(*chromfi); chroBox->pack_start(*chromco); chroFrame->add(*chroBox); - noiseBox->pack_start(*chroFrame); +// noiseBox->pack_start(*chroFrame); //Clarity From d00ec5a1b24683f7f760e53850d99545c75a4686 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 4 Apr 2020 08:32:34 +0200 Subject: [PATCH 065/109] Change tooltip and history msg damper --- rtdata/languages/default | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 94f1e691c..b545b2b7d 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -801,7 +801,7 @@ HISTORY_MSG_WAVMERGEL;Merge L HISTORY_MSG_WAVRADIUS;Radius Shadows-Highlight HISTORY_MSG_WAVSCALE;Scale HISTORY_MSG_WAVSHOWMASK;Show wavelet mask -HISTORY_MSG_WAVSIGMA;Sigma +HISTORY_MSG_WAVSIGMA;Damper HISTORY_MSG_WAVSOFTRAD;Soft radius clarity HISTORY_MSG_WAVSOFTRADEND;Soft radius final HISTORY_MSG_WAVUSHAMET;Clarity method @@ -2291,7 +2291,7 @@ TP_WAVELET_SHA;Sharp mask TP_WAVELET_SHFRAME;Shadows/Highlights TP_WAVELET_SHOWMASK;Show wavelet 'mask' TP_WAVELET_SIGMA;Damper -TP_WAVELET_SIGMA_TOOLTIP;This slider controls how wide the range of contrast values are that receive the maximum effect from the tool.\n The higher it is, the more contrast values will be strongly modified and the higher the risk to generate artifacts. The lower it is, the more pinpoint will the effect be applied to a certain range of contrast values +TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n The lower it is, the more pinpoint will the effect be applied to a narrow range of contrast values. 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_SKY;Sky targetting/protection From 7d8e0abd2f733415c35fd165aafd9daa219cca10 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 4 Apr 2020 15:37:22 +0200 Subject: [PATCH 066/109] Clean code and change default values --- rtengine/procparams.cc | 2 +- rtgui/wavelet.cc | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 270e28a6a..b398cc729 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2323,7 +2323,7 @@ WaveletParams::WaveletParams() : radius(40), skinprotect(0.0), chrwav(0.), - bluwav(50.0), + bluwav(1.0), hueskin(-5, 25, 170, 120, false), hueskin2(-260, -250, -130, -140, false), hllev(50, 75, 100, 98, false), diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 21507ce05..bc99d0d57 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -531,11 +531,8 @@ Wavelet::Wavelet() : noiseBox->pack_start(*level3noise, Gtk::PACK_SHRINK, 0); balchrom->setAdjusterListener(this); -// noiseBox->pack_start(*balchrom, Gtk::PACK_SHRINK, 0); chromfi->setAdjusterListener(this); -// noiseBox->pack_start(*chromfi, Gtk::PACK_SHRINK, 0); chromco->setAdjusterListener(this); -// noiseBox->pack_start(*chromco, Gtk::PACK_SHRINK, 0); chroFrame->set_label_align(0.025, 0.5); ToolParamBlock* const chroBox = Gtk::manage(new ToolParamBlock()); From d0e65ec93c3cf57afe0bfc2860a795fc13592fb4 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 5 Apr 2020 06:59:17 +0200 Subject: [PATCH 067/109] Change history_msg --- rtdata/languages/default | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index b545b2b7d..515e35b43 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -814,7 +814,7 @@ HISTORY_MSG_BLSHAPE;Blur by level HISTORY_MSG_WAVBL;Blur levels HISTORY_MSG_BLURWAV;Blur luminance HISTORY_MSG_BLURCWAV;Blur chroma -HISTORY_MSG_EDGEFFECT;Edge Effect +HISTORY_MSG_EDGEFFECT;Edge Damper HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot From 2d52fbdcefdb886b60515962d26f013ef9adbe71 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 5 Apr 2020 10:28:45 +0200 Subject: [PATCH 068/109] Improve wavelet levels with denoise chroma --- rtdata/languages/default | 2 +- rtengine/ipwavelet.cc | 641 +++++++++++++++++++++------------------ rtgui/wavelet.cc | 16 +- 3 files changed, 352 insertions(+), 307 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 515e35b43..4a181324d 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2307,7 +2307,7 @@ TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels between 9 and 9 minus the value will b TP_WAVELET_THRESHOLD_TOOLTIP;Only levels beyond the chosen value will be affected by the highlight luminance range. Other levels will be fully treated. The chosen value here limits the highest possible value of the shadow levels. TP_WAVELET_THRESWAV;Balance Threshold TP_WAVELET_THRH;Highlights threshold -TP_WAVELET_TILESBIG;Big tiles +TP_WAVELET_TILESBIG;Tiles TP_WAVELET_TILESFULL;Full image TP_WAVELET_TILESIZE;Tiling method TP_WAVELET_TILESLIT;Little tiles diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index e58ad3733..79302c452 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -399,8 +399,8 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.til = waparams.edgthresh; cp.eff = waparams.edgeffect; cp.balchrom = waparams.balchrom; - cp.chromfi = waparams.chromfi; - cp.chromco = waparams.chromco; + cp.chromfi = 0.1f * waparams.chromfi; + cp.chromco = 0.1f * waparams.chromco; cp.conres = waparams.rescon; cp.conresH = waparams.resconH; @@ -522,11 +522,11 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (params->wavelet.Tilesmethod == "big") { realtile = 22; } - +/* if (params->wavelet.Tilesmethod == "lit") { realtile = 12; } - +*/ int tilesize = 128 * realtile; int overlap = (int) tilesize * 0.125f; int numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip; @@ -667,6 +667,8 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const varhue[i] = new float[tilewidth]; } + + #ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -825,21 +827,28 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } + if (cp.chromfi > 0.f || cp.chromco > 0.f) { + if (levwavL < 7) { + levwavL = 7; + } + } + if (levwavL < 4) { levwavL = 4; //to allow edge => I always allocate 3 (4) levels..because if user select wavelet it is to do something !! } if (levwavL > 0) { const std::unique_ptr Ldecomp(new wavelet_decomposition(labco->data, labco->W, labco->H, levwavL, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); + float madL[8][3]; if (!Ldecomp->memoryAllocationFailed) { - float madL[8][3]; + // float madL[8][3]; #ifdef _OPENMP #pragma omp parallel for schedule(dynamic) collapse(2) num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif - for (int lvl = 0; lvl < 4; lvl++) { + for (int lvl = 0; lvl < levwavL; lvl++) { for (int dir = 1; dir < 4; dir++) { int Wlvl_L = Ldecomp->level_W(lvl); int Hlvl_L = Ldecomp->level_H(lvl); @@ -908,301 +917,336 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const WaveletcontAllLfinal(*Ldecomp, cp, mean, sigma, MaxP, waOpacityCurveWL); //Evaluate2(*Ldecomp, cp, ind, mean, meanN, sigma, sigmaN, MaxP, MaxN, madL); + /* + Ldecomp->reconstruct(labco->data, cp.strength); + } + } + */ + + + float variC[7]; + float variCb[7]; + + float noisecfr = cp.chromfi; + float noiseccr = cp.chromco; + + if (cp.balchrom > 0.f) { + noisecfr = cp.chromfi * ((100.f + cp.balchrom) / 10.f); + noiseccr = cp.chromco + ((100.f + cp.balchrom) / 10.f); + } + + float noisecfb = cp.chromfi; + float noiseccb = cp.chromco; + + if (cp.balchrom < 0.f) { + noisecfb = cp.chromfi * ((100.f - cp.balchrom) / 10.f); + noiseccb = cp.chromco * ((100.f - cp.balchrom) / 10.f); + } + + + if (noisecfr < 0.f) { + noisecfr = 0.0001f; + } + + if (noiseccr < 0.f) { + noiseccr = 0.0001f; + } + + if (noisecfb < 0.f) { + noisecfb = 0.0001f; + } + + if (noiseccb < 0.f) { + noiseccb = 0.0001f; + } + + int edge = 2; + variC[0] = SQR(noisecfr); + variC[1] = SQR(noisecfr); + variC[2] = SQR(noisecfr); + + variC[3] = SQR(noisecfr); + variC[4] = SQR(noisecfr); + variC[5] = SQR(noiseccr); + variC[6] = SQR(noiseccr); + + variCb[0] = SQR(noisecfb); + variCb[1] = SQR(noisecfb); + variCb[2] = SQR(noisecfb); + + variCb[3] = SQR(noisecfb); + variCb[4] = SQR(noisecfb); + variCb[5] = SQR(noiseccb); + variCb[6] = SQR(noiseccb); + + float k1 = 0.f; + float k2 = 0.f; + float k3 = 0.f; + + if (cp.chromfi < 0.2f) { + k1 = 0.f; + k2 = 0.f; + k3 = 0.f; + } else if (cp.chromfi < 0.3f) { + k1 = 0.1f; + k2 = 0.0f; + k3 = 0.f; + } else if (cp.chromfi < 0.5f) { + k1 = 0.2f; + k2 = 0.1f; + k3 = 0.f; + } else if (cp.chromfi < 0.8f) { + k1 = 0.3f; + k2 = 0.25f; + k3 = 0.f; + } else if (cp.chromfi < 1.f) { + k1 = 0.4f; + k2 = 0.25f; + k3 = 0.1f; + } else if (cp.chromfi < 2.f) { + k1 = 0.5f; + k2 = 0.3f; + k3 = 0.15f; + } else if (cp.chromfi < 3.f) { + k1 = 0.6f; + k2 = 0.45f; + k3 = 0.3f; + } else if (cp.chromfi < 4.f) { + k1 = 0.7f; + k2 = 0.5f; + k3 = 0.4f; + } else if (cp.chromfi < 5.f) { + k1 = 0.8f; + k2 = 0.6f; + k3 = 0.5f; + } else if (cp.chromfi < 6.f) { + k1 = 0.85f; + k2 = 0.7f; + k3 = 0.6f; + } else if (cp.chromfi < 8.f) { + k1 = 0.9f; + k2 = 0.8f; + k3 = 0.7f; + } else if (cp.chromfi < 10.f) { + k1 = 1.f; + k2 = 1.f; + k3 = 0.9f; + + } else { + k1 = 1.f; + k2 = 1.f; + k3 = 1.f; + } + + float minic = 0.0001f; + variC[0] = max(minic, variC[0]); + variC[1] = max(minic, k1 * variC[1]); + variC[2] = max(minic, k2 * variC[2]); + variC[3] = max(minic, k3 * variC[3]); + + variCb[0] = max(minic, variCb[0]); + variCb[1] = max(minic, k1 * variCb[1]); + variCb[2] = max(minic, k2 * variCb[2]); + variCb[3] = max(minic, k3 * variCb[3]); + + float k4 = 0.f; + float k5 = 0.f; + float k6 = 0.f; + + if (cp.chromco == 0.01f) { + k4 = 0.f; + k5 = 0.0f; + } else if (cp.chromco < 0.2f) { + k4 = 0.1f; + k5 = 0.0f; + } else if (cp.chromco < 0.5f) { + k4 = 0.15f; + k5 = 0.0f; + } else if (cp.chromco < 1.f) { + k4 = 0.15f; + k5 = 0.1f; + } else if (cp.chromco < 3.f) { + k4 = 0.3f; + k5 = 0.15f; + } else if (cp.chromco < 4.f) { + k4 = 0.6f; + k5 = 0.4f; + } else if (cp.chromco < 6.f) { + k4 = 0.8f; + k5 = 0.6f; + } else { + k4 = 1.f; + k5 = 1.f; + } + + variC[4] = max(0.0001f, k4 * variC[4]); + variC[5] = max(0.0001f, k5 * variC[5]); + variCb[4] = max(0.0001f, k4 * variCb[4]); + variCb[5] = max(0.0001f, k5 * variCb[5]); + + if (cp.chromco < 4.f) { + k6 = 0.f; + } else if (cp.chromco < 5.f) { + k6 = 0.4f; + } else if (cp.chromco < 6.f) { + k6 = 0.7f; + } else { + k6 = 1.f; + } + + variC[6] = max(0.0001f, k6 * variC[6]); + variCb[6] = max(0.0001f, k6 * variCb[6]); +/* + for (int y = 0; y < 7; y++) { + printf("y=%i madL=%f varia=%f variab=%f\n", y, madL[y][1], variC[y], variCb[y]); + } +*/ + float nvch = 0.6f;//high value + float nvcl = 0.1f;//low value + + if (cp.chromco > 30.f) { + nvch = 0.8f; + nvcl = 0.4f; + } + + float seuil = 4000.f;//low + float seuil2 = 15000.f;//high + //ac and bc for transition + float ac = (nvch - nvcl) / (seuil - seuil2); + float bc = nvch - seuil * ac; + int GW = labco->W; + int GH = labco->H; + float* noisevarchrom = new float[GH * GW]; + //noisevarchrom in function chroma + int GW2 = (GW + 1) / 2; + float noisevarab_r = 100.f; + + for (int ir = 0; ir < GH; ir++) + for (int jr = 0; jr < GW; jr++) { + float cN = sqrt(SQR(labco->a[ir][jr]) + SQR(labco->b[ir][jr])); + + if (cN < seuil) { + noisevarchrom[(ir >> 1)*GW2 + (jr >> 1)] = nvch; + } else if (cN < seuil2) { + noisevarchrom[(ir >> 1)*GW2 + (jr >> 1)] = ac * cN + bc; + } else { + noisevarchrom[(ir >> 1)*GW2 + (jr >> 1)] = nvcl; + } + } + + + //Flat curve for H=f(H) in residual image + FlatCurve* hhCurve = new FlatCurve(params->wavelet.hhcurve); //curve H=f(H) + bool hhutili = false; + + if (!hhCurve || hhCurve->isIdentity()) { + if (hhCurve) { + delete hhCurve; + hhCurve = nullptr; + } + } else { + hhutili = true; + } + + + if (!hhutili) { //always a or b + int levwava = levwav; + + if (cp.chrores == 0.f && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels + while (levwava > 0 && !cp.diag && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwava - 1] == 0.f)) || (cp.CHmet != 2 && (levwava == 10 || (!cp.curv || cp.mulC[levwava - 1] == 0.f))))) && (!cp.opaRG || levwava == 10 || (cp.opaRG && cp.mulopaRG[levwava - 1] == 0.f)) && ((levwava == 10 || (cp.CHSLmet == 1 && cp.mulC[levwava - 1] == 0.f)))) { + levwava--; + } + } + + if (cp.chromfi > 0.f || cp.chromco > 0.f) { + if (levwava < 7) { + levwava = 7; + } + } + + if (levwava > 0) { + const std::unique_ptr adecomp(new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwava, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); + + if (!adecomp->memoryAllocationFailed) { + WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); + WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); + Evaluate2(*adecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); + WaveletcontAllAB(labco, varhue, varchro, *adecomp, wavblcurve, waOpacityCurveW, cp, true, skip, meanab, sigmaab); + adecomp->reconstruct(labco->data + datalen, cp.strength); + } + } + + int levwavb = levwav; + + if (cp.chrores == 0.f && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels + while (levwavb > 0 && !cp.diag && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwavb - 1] == 0.f)) || (cp.CHmet != 2 && (levwavb == 10 || (!cp.curv || cp.mulC[levwavb - 1] == 0.f))))) && (!cp.opaBY || levwavb == 10 || (cp.opaBY && cp.mulopaBY[levwavb - 1] == 0.f)) && ((levwavb == 10 || (cp.CHSLmet == 1 && cp.mulC[levwavb - 1] == 0.f)))) { + levwavb--; + } + } + + if (cp.chromfi > 0.f || cp.chromco > 0.f) { + if (levwavb < 7) { + levwavb = 7; + } + } + + if (levwavb > 0) { + const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); + + if (!bdecomp->memoryAllocationFailed) { + WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); + WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); + Evaluate2(*bdecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); + WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip, meanab, sigmaab); + bdecomp->reconstruct(labco->data + 2 * datalen, cp.strength); + } + } + } else {// a and b + int levwavab = levwav; + + if (cp.chrores == 0.f && !hhutili && params->wavelet.CLmethod == "all") { // no processing of residual ab => we probably can reduce the number of levels + while (levwavab > 0 && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwavab - 1] == 0.f)) || (cp.CHmet != 2 && (levwavab == 10 || (!cp.curv || cp.mulC[levwavab - 1] == 0.f))))) && (!cp.opaRG || levwavab == 10 || (cp.opaRG && cp.mulopaRG[levwavab - 1] == 0.f)) && ((levwavab == 10 || (cp.CHSLmet == 1 && cp.mulC[levwavab - 1] == 0.f)))) { + levwavab--; + } + } + if (cp.chromfi > 0.f || cp.chromco > 0.f) { + if (levwavab < 7) { + levwavab = 7; + } + } + + if (levwavab > 0) { + const std::unique_ptr adecomp(new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); + const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); + + if (!adecomp->memoryAllocationFailed && !bdecomp->memoryAllocationFailed) { + WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); + WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); + Evaluate2(*adecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); + WaveletcontAllAB(labco, varhue, varchro, *adecomp, wavblcurve, waOpacityCurveW, cp, true, skip, meanab, sigmaab); + WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); + WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); + Evaluate2(*bdecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); + WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip, meanab, sigmaab); + WaveletAandBAllAB(*adecomp, *bdecomp, cp, hhCurve, hhutili); + + adecomp->reconstruct(labco->data + datalen, cp.strength); + bdecomp->reconstruct(labco->data + 2 * datalen, cp.strength); + + } + } + } + + delete[] noisevarchrom; + + if (hhCurve) { + delete hhCurve; + } Ldecomp->reconstruct(labco->data, cp.strength); } } - - /* - float variC[7]; - float variCb[7]; - - float noisecfr = cp.chromfi; - float noiseccr = cp.chromco; - - if (cp.balchrom > 0.f) { - noisecfr = cp.chromfi * ((100.f + cp.balchrom) / 10.f); - noiseccr = cp.chromco + ((100.f + cp.balchrom) / 10.f); - } - - float noisecfb = cp.chromfi; - float noiseccb = cp.chromco; - - if (cp.balchrom < 0.f) { - noisecfb = cp.chromfi * ((100.f - cp.balchrom) / 10.f); - noiseccb = cp.chromco * ((100.f - cp.balchrom) / 10.f); - } - - - if (noisecfr < 0.f) { - noisecfr = 0.0001f; - } - - if (noiseccr < 0.f) { - noiseccr = 0.0001f; - } - - if (noisecfb < 0.f) { - noisecfb = 0.0001f; - } - - if (noiseccb < 0.f) { - noiseccb = 0.0001f; - } - - int edge = 2; - variC[0] = SQR(noisecfr); - variC[1] = SQR(noisecfr); - variC[2] = SQR(noisecfr); - - variC[3] = SQR(noisecfr); - variC[4] = SQR(noisecfr); - variC[5] = SQR(noiseccr); - variC[6] = SQR(noiseccr); - - variCb[0] = SQR(noisecfb); - variCb[1] = SQR(noisecfb); - variCb[2] = SQR(noisecfb); - - variCb[3] = SQR(noisecfb); - variCb[4] = SQR(noisecfb); - variCb[5] = SQR(noiseccb); - variCb[6] = SQR(noiseccb); - - float k1 = 0.f; - float k2 = 0.f; - float k3 = 0.f; - - if (cp.chromfi) { - k1 = 0.f; - k2 = 0.f; - k3 = 0.f; - } else if (cp.chromfi < 0.3f) { - k1 = 0.1f; - k2 = 0.0f; - k3 = 0.f; - } else if (cp.chromfi < 0.5f) { - k1 = 0.2f; - k2 = 0.1f; - k3 = 0.f; - } else if (cp.chromfi < 0.8f) { - k1 = 0.3f; - k2 = 0.25f; - k3 = 0.f; - } else if (cp.chromfi < 1.f) { - k1 = 0.4f; - k2 = 0.25f; - k3 = 0.1f; - } else if (cp.chromfi < 2.f) { - k1 = 0.5f; - k2 = 0.3f; - k3 = 0.15f; - } else if (cp.chromfi < 3.f) { - k1 = 0.6f; - k2 = 0.45f; - k3 = 0.3f; - } else if (cp.chromfi < 4.f) { - k1 = 0.7f; - k2 = 0.5f; - k3 = 0.4f; - } else if (cp.chromfi < 5.f) { - k1 = 0.8f; - k2 = 0.6f; - k3 = 0.5f; - } else if (cp.chromfi < 10.f) { - k1 = 0.85f; - k2 = 0.7f; - k3 = 0.6f; - } else if (cp.chromfi < 20.f) { - k1 = 0.9f; - k2 = 0.8f; - k3 = 0.7f; - } else if (cp.chromfi < 50.f) { - k1 = 1.f; - k2 = 1.f; - k3 = 0.9f; - - } else { - k1 = 1.f; - k2 = 1.f; - k3 = 1.f; - } - - float minic = 0.0001f; - variC[0] = max(minic, variC[0]); - variC[1] = max(minic, k1 * variC[1]); - variC[2] = max(minic, k2 * variC[2]); - variC[3] = max(minic, k3 * variC[3]); - - variCb[0] = max(minic, variCb[0]); - variCb[1] = max(minic, k1 * variCb[1]); - variCb[2] = max(minic, k2 * variCb[2]); - variCb[3] = max(minic, k3 * variCb[3]); - - float k4 = 0.f; - float k5 = 0.f; - float k6 = 0.f; - - if (cp.chromco == 0.01f) { - k4 = 0.f; - k5 = 0.0f; - } else if (cp.chromco < 0.2f) { - k4 = 0.1f; - k5 = 0.0f; - } else if (cp.chromco < 0.5f) { - k4 = 0.15f; - k5 = 0.0f; - } else if (cp.chromco < 1.f) { - k4 = 0.15f; - k5 = 0.1f; - } else if (cp.chromco < 3.f) { - k4 = 0.3f; - k5 = 0.15f; - } else if (cp.chromco < 4.f) { - k4 = 0.6f; - k5 = 0.4f; - } else if (cp.chromco < 6.f) { - k4 = 0.8f; - k5 = 0.6f; - } else { - k4 = 1.f; - k5 = 1.f; - } - - variC[4] = max(0.0001f, k4 * variC[4]); - variC[5] = max(0.0001f, k5 * variC[5]); - variCb[4] = max(0.0001f, k4 * variCb[4]); - variCb[5] = max(0.0001f, k5 * variCb[5]); - - if (cp.chromco < 4.f) { - k6 = 0.f; - } else if (cp.chromco < 5.f) { - k6 = 0.4f; - } else if (cp.chromco < 6.f) { - k6 = 0.7f; - } else { - k6 = 1.f; - } - - variC[6] = max(0.0001f, k6 * variC[6]); - variCb[6] = max(0.0001f, k6 * variCb[6]); - float nvch = 0.6f;//high value - float nvcl = 0.1f;//low value - - if (cp.chromco > 100.f) { - nvch = 0.8f; - nvcl = 0.4f; - } - - float seuil = 4000.f;//low - float seuil2 = 15000.f;//high - //ac and bc for transition - float ac = (nvch - nvcl) / (seuil - seuil2); - float bc = nvch - seuil * ac; - int GW = labco->W; - int GH = labco->H; - float* noisevarchrom = new float[GH * GW]; - //noisevarchrom in function chroma - int GW2 = (GW + 1) / 2; - float noisevarab_r = 100.f; //SQR(lp.noisecc / 10.0); - for (int ir = 0; ir < GH; ir++) - for (int jr = 0; jr < GW; jr++) { - float cN = sqrt(SQR(labco->a[ir][jr]) + SQR(labco->b[ir][jr])); - - if (cN < seuil) { - noisevarchrom[(ir >> 1)*GW2 + (jr >> 1)] = nvch; - } else if (cN < seuil2) { - noisevarchrom[(ir >> 1)*GW2 + (jr >> 1)] = ac * cN + bc; - } else { - noisevarchrom[(ir >> 1)*GW2 + (jr >> 1)] = nvcl; - } - } - */ - - //Flat curve for H=f(H) in residual image - FlatCurve* hhCurve = new FlatCurve(params->wavelet.hhcurve); //curve H=f(H) - bool hhutili = false; - - if (!hhCurve || hhCurve->isIdentity()) { - if (hhCurve) { - delete hhCurve; - hhCurve = nullptr; - } - } else { - hhutili = true; - } - - - if (!hhutili) { //always a or b - int levwava = levwav; - - if (cp.chrores == 0.f && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels - while (levwava > 0 && !cp.diag && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwava - 1] == 0.f)) || (cp.CHmet != 2 && (levwava == 10 || (!cp.curv || cp.mulC[levwava - 1] == 0.f))))) && (!cp.opaRG || levwava == 10 || (cp.opaRG && cp.mulopaRG[levwava - 1] == 0.f)) && ((levwava == 10 || (cp.CHSLmet == 1 && cp.mulC[levwava - 1] == 0.f)))) { - levwava--; - } - } - - if (levwava > 0) { - const std::unique_ptr adecomp(new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwava, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); - - if (!adecomp->memoryAllocationFailed) { - Evaluate2(*adecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); - WaveletcontAllAB(labco, varhue, varchro, *adecomp, wavblcurve, waOpacityCurveW, cp, true, skip, meanab, sigmaab); - adecomp->reconstruct(labco->data + datalen, cp.strength); - } - } - - int levwavb = levwav; - - if (cp.chrores == 0.f && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels - while (levwavb > 0 && !cp.diag && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwavb - 1] == 0.f)) || (cp.CHmet != 2 && (levwavb == 10 || (!cp.curv || cp.mulC[levwavb - 1] == 0.f))))) && (!cp.opaBY || levwavb == 10 || (cp.opaBY && cp.mulopaBY[levwavb - 1] == 0.f)) && ((levwavb == 10 || (cp.CHSLmet == 1 && cp.mulC[levwavb - 1] == 0.f)))) { - levwavb--; - } - } - - if (levwavb > 0) { - const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); - - if (!bdecomp->memoryAllocationFailed) { - Evaluate2(*bdecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); - WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip, meanab, sigmaab); - bdecomp->reconstruct(labco->data + 2 * datalen, cp.strength); - } - } - } else {// a and b - int levwavab = levwav; - - if (cp.chrores == 0.f && !hhutili && params->wavelet.CLmethod == "all") { // no processing of residual ab => we probably can reduce the number of levels - while (levwavab > 0 && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwavab - 1] == 0.f)) || (cp.CHmet != 2 && (levwavab == 10 || (!cp.curv || cp.mulC[levwavab - 1] == 0.f))))) && (!cp.opaRG || levwavab == 10 || (cp.opaRG && cp.mulopaRG[levwavab - 1] == 0.f)) && ((levwavab == 10 || (cp.CHSLmet == 1 && cp.mulC[levwavab - 1] == 0.f)))) { - levwavab--; - } - } - - if (levwavab > 0) { - const std::unique_ptr adecomp(new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); - const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); - - if (!adecomp->memoryAllocationFailed && !bdecomp->memoryAllocationFailed) { - Evaluate2(*adecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); - WaveletcontAllAB(labco, varhue, varchro, *adecomp, wavblcurve, waOpacityCurveW, cp, true, skip, meanab, sigmaab); - Evaluate2(*bdecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); - WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip, meanab, sigmaab); - WaveletAandBAllAB(*adecomp, *bdecomp, cp, hhCurve, hhutili); - - adecomp->reconstruct(labco->data + datalen, cp.strength); - bdecomp->reconstruct(labco->data + 2 * datalen, cp.strength); - - } - } - } - - // delete[] noisevarchrom; - - if (hhCurve) { - delete hhCurve; - } - if (numtiles > 1 || (numtiles == 1 /*&& cp.avoi*/)) { //in all case since I add contrast curve //calculate mask for feathering output tile overlaps float Vmask[height + overlap] ALIGNED16; @@ -2304,6 +2348,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * if (settings->verbose) { printf("lvl=%i n0=%i n32=%i n1=%i n2=%i n3=%i n4=%i n5=%i n6=%i n7=%i n8=%i n9=%i n10=%i\n", lvl, n0, n0 - n32, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10); } + klev = (wavblcurve[lvl * 55.5f]); float lvr = lvl; @@ -2537,8 +2582,8 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float WavCoeffs_ab0[i] = aft[i]; } - delete[] bef; - delete[] aft; + delete[] bef; + delete[] aft; } diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index bc99d0d57..23e526474 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -131,8 +131,8 @@ Wavelet::Wavelet() : edgesensi(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGESENSI"), 0, 100, 1, 60))), edgeampli(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGEAMPLI"), 0, 100, 1, 10))), balchrom(Gtk::manage(new Adjuster(M("TP_WAVELET_BALCHROM"), -100., 100., 1., 0., Gtk::manage(new RTImage("circle-blue-small.png")), Gtk::manage(new RTImage("circle-red-small.png"))))), - chromfi(Gtk::manage(new Adjuster(M("TP_WAVELET_CHROMFI"), 0, 100, 1, 0))), - chromco(Gtk::manage(new Adjuster(M("TP_WAVELET_CHROMCO"), 0, 100, 1, 0))), + chromfi(Gtk::manage(new Adjuster(M("TP_WAVELET_CHROMFI"), 0.0, 150., 0.01, 0.))), + chromco(Gtk::manage(new Adjuster(M("TP_WAVELET_CHROMCO"), 0, 100., 0.01, 0.))), mergeL(Gtk::manage(new Adjuster(M("TP_WAVELET_MERGEL"), -50, 100, 1, 40))), mergeC(Gtk::manage(new Adjuster(M("TP_WAVELET_MERGEC"), -50, 100, 1, 20))), softrad(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.5, 0.))), @@ -246,7 +246,7 @@ Wavelet::Wavelet() : Tilesmethod->append(M("TP_WAVELET_TILESFULL")); Tilesmethod->append(M("TP_WAVELET_TILESBIG")); - Tilesmethod->append(M("TP_WAVELET_TILESLIT")); +// Tilesmethod->append(M("TP_WAVELET_TILESLIT")); Tilesmethodconn = Tilesmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::TilesmethodChanged)); Tilesmethod->set_tooltip_text(M("TP_WAVELET_TILES_TOOLTIP")); Gtk::HBox* const tilesizeHBox = Gtk::manage(new Gtk::HBox()); @@ -540,7 +540,7 @@ Wavelet::Wavelet() : chroBox->pack_start(*chromfi); chroBox->pack_start(*chromco); chroFrame->add(*chroBox); -// noiseBox->pack_start(*chroFrame); + noiseBox->pack_start(*chroFrame); //Clarity @@ -1257,8 +1257,8 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) Tilesmethod->set_active(0); } else if (pp->wavelet.Tilesmethod == "big") { Tilesmethod->set_active(1); - } else if (pp->wavelet.Tilesmethod == "lit") { - Tilesmethod->set_active(2); +// } else if (pp->wavelet.Tilesmethod == "lit") { +// Tilesmethod->set_active(2); } //daubcoeffmethod->set_active (4); @@ -2015,8 +2015,8 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.Tilesmethod = "full"; } else if (Tilesmethod->get_active_row_number() == 1) { pp->wavelet.Tilesmethod = "big"; - } else if (Tilesmethod->get_active_row_number() == 2) { - pp->wavelet.Tilesmethod = "lit"; +// } else if (Tilesmethod->get_active_row_number() == 2) { +// pp->wavelet.Tilesmethod = "lit"; } if (daubcoeffmethod->get_active_row_number() == 0) { From 05250a24973fcc607c491dd7b334a9882effce66 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 5 Apr 2020 11:04:01 +0200 Subject: [PATCH 069/109] Change labels chroma --- rtdata/languages/default | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 4a181324d..ed9b06b04 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2143,7 +2143,7 @@ TP_WAVELET_BACKGROUND;Background TP_WAVELET_BACUR;Curve TP_WAVELET_BALANCE;Contrast balance d/v-h TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the wavelet directions: vertical-horizontal and diagonal.\nIf contrast, chroma or residual tone mapping are activated, the effect due to balance is amplified. -TP_WAVELET_BALCHRO;Chroma balance +TP_WAVELET_BALCHRO;Chrominance balance TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance. TP_WAVELET_BALCHROM;Chroma balance TP_WAVELET_BANONE;None @@ -2163,8 +2163,8 @@ TP_WAVELET_CHR;Chroma-contrast link strength TP_WAVELET_CHRO;Saturated/pastel threshold TP_WAVELET_CHROFRAME;Denoise Chroma TP_WAVELET_CHROMAFRAME;Chroma -TP_WAVELET_CHROMCO;Chroma Coarse -TP_WAVELET_CHROMFI;Chroma Fine +TP_WAVELET_CHROMCO;Chrominance Coarse +TP_WAVELET_CHROMFI;Chrominance Fine TP_WAVELET_CHRO_TOOLTIP;Sets the wavelet level which will be the threshold between saturated and pastel colors.\n1-x: saturated\nx-9: pastel\n\nIf the value exceeds the amount of wavelet levels you are using then it will be ignored. TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of "contrast levels" and "chroma-contrast link strength" TP_WAVELET_CHRWAV;Blur chroma From ca8399bc9008edd5fe9f970efe6ba64407179a6a Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 5 Apr 2020 11:13:18 +0200 Subject: [PATCH 070/109] change labels --- rtdata/languages/default | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index ed9b06b04..83262a3fc 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2145,7 +2145,7 @@ TP_WAVELET_BALANCE;Contrast balance d/v-h TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the wavelet directions: vertical-horizontal and diagonal.\nIf contrast, chroma or residual tone mapping are activated, the effect due to balance is amplified. TP_WAVELET_BALCHRO;Chrominance balance TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance. -TP_WAVELET_BALCHROM;Chroma balance +TP_WAVELET_BALCHROM;Chrominance balance TP_WAVELET_BANONE;None TP_WAVELET_BASLI;Slider TP_WAVELET_BATYPE;Contrast balance method @@ -2161,7 +2161,7 @@ TP_WAVELET_CH3;Link contrast levels TP_WAVELET_CHCU;Curve TP_WAVELET_CHR;Chroma-contrast link strength TP_WAVELET_CHRO;Saturated/pastel threshold -TP_WAVELET_CHROFRAME;Denoise Chroma +TP_WAVELET_CHROFRAME;Denoise Chrominance TP_WAVELET_CHROMAFRAME;Chroma TP_WAVELET_CHROMCO;Chrominance Coarse TP_WAVELET_CHROMFI;Chrominance Fine From 15db8cdb57161d57af8307bf85aeda02ea69ddde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sun, 5 Apr 2020 11:26:47 +0200 Subject: [PATCH 071/109] Guard accesses to `Crop::crop_ratios` (#5701) --- rtgui/crop.cc | 125 +++++++++++++++++++++++++++++++++++--------------- rtgui/crop.h | 11 ++--- 2 files changed, 92 insertions(+), 44 deletions(-) diff --git a/rtgui/crop.cc b/rtgui/crop.cc index d9d496523..f092f07a5 100644 --- a/rtgui/crop.cc +++ b/rtgui/crop.cc @@ -16,6 +16,8 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ +#include + #include "crop.h" #include "options.h" @@ -46,39 +48,82 @@ inline void get_custom_ratio(int w, int h, double &rw, double &rh) } // namespace +class Crop::CropRatios final +{ +public: + CropRatios() : + ratios{ + {M("GENERAL_ASIMAGE"), 0.0}, + {M("GENERAL_CURRENT"), -1.0}, + {"3:2", 3.0 / 2.0}, // L1.5, P0.666... + {"4:3", 4.0 / 3.0}, // L1.333..., P0.75 + {"16:9", 16.0 / 9.0}, // L1.777..., P0.5625 + {"16:10", 16.0 / 10.0}, // L1.6, P0.625 + {"1:1", 1.0 / 1.0}, // L1, P1 + {"2:1", 2.0 / 1.0}, // L2, P0.5 + {"3:1", 3.0 / 1.0}, // L3, P0.333... + {"4:1", 4.0 / 1.0}, // L4, P0.25 + {"5:1", 5.0 / 1.0}, // L5, P0.2 + {"6:1", 6.0 / 1.0}, // L6, P0.1666... + {"7:1", 7.0 / 1.0}, // L7, P0.142... + {"4:5", 4.0 / 5.0}, // L1.25, P0.8 + {"5:7", 5.0 / 7.0}, // L1.4, P0.714... + {"6:7", 6.0 / 7.0}, // L1.166..., P0.857... + {"6:17", 6.0 / 17.0}, // L2.833..., P0.352... + {"24:65 - XPAN", 24.0 / 65.0}, // L2.708..., P0.369... + {"1.414 - DIN EN ISO 216", 1.414}, // L1.414, P0.707... + {"3.5:5", 3.5 / 5.0}, // L1.428..., P0.7 + {"8.5:11 - US Letter", 8.5 / 11.0}, // L1.294..., P0.772... + {"9.5:12", 9.5 / 12.0}, // L1.263..., P0.791... + {"10:12", 10.0 / 12.0}, // L1.2, P0.833... + {"11:14", 11.0 / 14.0}, // L1.272..., P0.785... + {"11:17 - Tabloid", 11.0 / 17.0}, // L1.545..., P0.647... + {"13:19", 13.0 / 19.0}, // L1.461..., P0.684... + {"17:22", 17.0 / 22.0}, // L1.294..., P0.772... + {"45:35 - ePassport", 45.0 / 35.0}, // L1.285,... P0.777... + {"64:27", 64.0 / 27.0}, // L2.370..., P0.421... + } + { + } + + std::vector getLabels() const + { + std::vector res; + + res.reserve(ratios.size()); + + for (const auto& ratio : ratios) { + res.push_back(ratio.label); + } + + return res; + } + + double getValue(std::size_t index) const + { + return + index < ratios.size() + ? ratios[index].value + : ratios[0].value; + } + + void updateCurrentRatio(double value) + { + ratios[1].value = value; + } + +private: + struct CropRatio { + Glib::ustring label; + double value; + }; + + std::vector ratios; +}; + Crop::Crop(): FoldableToolPanel(this, "crop", M("TP_CROP_LABEL"), false, true), - crop_ratios{ - {M("GENERAL_ASIMAGE"), 0.0}, - {M("GENERAL_CURRENT"), -1.0}, - {"3:2", 3.0 / 2.0}, // L1.5, P0.666... - {"4:3", 4.0 / 3.0}, // L1.333..., P0.75 - {"16:9", 16.0 / 9.0}, // L1.777..., P0.5625 - {"16:10", 16.0 / 10.0}, // L1.6, P0.625 - {"1:1", 1.0 / 1.0}, // L1, P1 - {"2:1", 2.0 / 1.0}, // L2, P0.5 - {"3:1", 3.0 / 1.0}, // L3, P0.333... - {"4:1", 4.0 / 1.0}, // L4, P0.25 - {"5:1", 5.0 / 1.0}, // L5, P0.2 - {"6:1", 6.0 / 1.0}, // L6, P0.1666... - {"7:1", 7.0 / 1.0}, // L7, P0.142... - {"4:5", 4.0 / 5.0}, // L1.25, P0.8 - {"5:7", 5.0 / 7.0}, // L1.4, P0.714... - {"6:7", 6.0 / 7.0}, // L1.166..., P0.857... - {"6:17", 6.0 / 17.0}, // L2.833..., P0.352... - {"24:65 - XPAN", 24.0 / 65.0}, // L2.708..., P0.369... - {"1.414 - DIN EN ISO 216", 1.414}, // L1.414, P0.707... - {"3.5:5", 3.5 / 5.0}, // L1.428..., P0.7 - {"8.5:11 - US Letter", 8.5 / 11.0}, // L1.294..., P0.772... - {"9.5:12", 9.5 / 12.0}, // L1.263..., P0.791... - {"10:12", 10.0 / 12.0}, // L1.2, P0.833... - {"11:14", 11.0 / 14.0}, // L1.272..., P0.785... - {"11:17 - Tabloid", 11.0 / 17.0}, // L1.545..., P0.647... - {"13:19", 13.0 / 19.0}, // L1.461..., P0.684... - {"17:22", 17.0 / 22.0}, // L1.294..., P0.772... - {"45:35 - ePassport", 45.0 / 35.0}, // L1.285,... P0.777... - {"64:27", 64.0 / 27.0}, // L2.370..., P0.421... - }, + crop_ratios(new CropRatios), opt(0), wDirty(true), hDirty(true), @@ -229,8 +274,8 @@ Crop::Crop(): // ppigrid END // Populate the combobox - for (const auto& crop_ratio : crop_ratios) { - ratio->append (crop_ratio.label); + for (const auto& label : crop_ratios->getLabels()) { + ratio->append (label); } ratio->set_active (0); @@ -354,7 +399,10 @@ void Crop::read (const ProcParams* pp, const ParamsEdited* pedited) setDimensions (pp->crop.x + pp->crop.w, pp->crop.y + pp->crop.h); } - const bool flip_orientation = pp->crop.fixratio && crop_ratios[ratio->get_active_row_number()].value > 0 && crop_ratios[ratio->get_active_row_number()].value < 1.0; + const bool flip_orientation = + pp->crop.fixratio + && crop_ratios->getValue(ratio->get_active_row_number()) > 0 + && crop_ratios->getValue(ratio->get_active_row_number()) < 1.0; if (pp->crop.orientation == "Landscape") { orientation->set_active (flip_orientation ? 1 : 0); @@ -469,7 +517,10 @@ void Crop::write (ProcParams* pp, ParamsEdited* pedited) } // for historical reasons we store orientation different if ratio is written as 2:3 instead of 3:2, but in GUI 'landscape' is always long side horizontal regardless of the ratio is written short or long side first. - const bool flip_orientation = fixr->get_active() && crop_ratios[ratio->get_active_row_number()].value > 0 && crop_ratios[ratio->get_active_row_number()].value < 1.0; + const bool flip_orientation = + fixr->get_active() + && crop_ratios->getValue(ratio->get_active_row_number()) > 0 + && crop_ratios->getValue(ratio->get_active_row_number()) < 1.0; if (orientation->get_active_row_number() == 0) { pp->crop.orientation = flip_orientation ? "Portrait" : "Landscape"; @@ -1501,7 +1552,7 @@ double Crop::getRatio () const return r; } - r = crop_ratios[ratio->get_active_row_number()].value; + r = crop_ratios->getValue(ratio->get_active_row_number()); if (!r) { r = maxh <= maxw ? float(maxh)/float(maxw) : float(maxw)/float(maxh); } @@ -1539,5 +1590,5 @@ void Crop::updateCurrentRatio() double rw, rh; get_custom_ratio(w->get_value(), h->get_value(), rw, rh); customRatioLabel->set_text(Glib::ustring::compose("%1:%2", rw, rh)); - crop_ratios[1].value = double(w->get_value())/double(h->get_value()); + crop_ratios->updateCurrentRatio(static_cast(w->get_value()) / static_cast(h->get_value())); } diff --git a/rtgui/crop.h b/rtgui/crop.h index b9221a803..c6636b917 100644 --- a/rtgui/crop.h +++ b/rtgui/crop.h @@ -18,7 +18,7 @@ */ #pragma once -#include +#include #include @@ -91,16 +91,13 @@ public: void rotateCrop (int deg, bool hflip, bool vflip); private: - struct CropRatio { - Glib::ustring label; - double value; - }; - - std::vector crop_ratios; + class CropRatios; void adjustCropToRatio(); void updateCurrentRatio(); + const std::unique_ptr crop_ratios; + Gtk::CheckButton* fixr; MyComboBoxText* ratio; MyComboBoxText* orientation; From f4a28b730a3f629eda8463324fb43e31646838a6 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 5 Apr 2020 14:53:55 +0200 Subject: [PATCH 072/109] Disabled denoise chrom when denoise and refine disabled --- rtengine/ipwavelet.cc | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 79302c452..43c5733db 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1168,8 +1168,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr adecomp(new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwava, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!adecomp->memoryAllocationFailed) { - WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); - WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); + if(cp.noiseena && (cp.chromfi > 0.f || cp.chromfi > 0.f)) { + WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); + WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); + } Evaluate2(*adecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); WaveletcontAllAB(labco, varhue, varchro, *adecomp, wavblcurve, waOpacityCurveW, cp, true, skip, meanab, sigmaab); adecomp->reconstruct(labco->data + datalen, cp.strength); @@ -1194,8 +1196,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!bdecomp->memoryAllocationFailed) { - WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); - WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); + if(cp.noiseena && (cp.chromfi > 0.f || cp.chromfi > 0.f)) { + WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); + WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); + } Evaluate2(*bdecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip, meanab, sigmaab); bdecomp->reconstruct(labco->data + 2 * datalen, cp.strength); @@ -1220,15 +1224,19 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!adecomp->memoryAllocationFailed && !bdecomp->memoryAllocationFailed) { - WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); - WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); + if(cp.noiseena && (cp.chromfi > 0.f || cp.chromfi > 0.f)) { + WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); + WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); + } Evaluate2(*adecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); WaveletcontAllAB(labco, varhue, varchro, *adecomp, wavblcurve, waOpacityCurveW, cp, true, skip, meanab, sigmaab); WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); Evaluate2(*bdecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); - WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip, meanab, sigmaab); - WaveletAandBAllAB(*adecomp, *bdecomp, cp, hhCurve, hhutili); + if(cp.noiseena && (cp.chromfi > 0.f || cp.chromfi > 0.f)) { + WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip, meanab, sigmaab); + WaveletAandBAllAB(*adecomp, *bdecomp, cp, hhCurve, hhutili); + } adecomp->reconstruct(labco->data + datalen, cp.strength); bdecomp->reconstruct(labco->data + 2 * datalen, cp.strength); From 1e3870d8f71912838aca84389fff34328c85a45f Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 5 Apr 2020 15:53:05 +0200 Subject: [PATCH 073/109] Clean code improcfun.h --- rtengine/improcfun.h | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 3513efd92..d003df644 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -238,29 +238,22 @@ public: void RGB_denoise_info(Imagefloat * src, Imagefloat * provicalc, bool isRAW, const LUTf &gamcurve, float gam, float gamthresh, float gamslope, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float & maxblueaut, float &minredaut, float & minblueaut, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, bool multiThread = false); void RGBtile_denoise(float * fLblox, int hblproc, float noisevar_Ldetail); //for DCT void RGBoutput_tile_row(float *bloxrow_L, float ** Ldetail, float ** tilemask_out, int height, int width, int top); -// bool WaveletDenoiseAllL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge); -// bool WaveletDenoiseAllAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb); + void WaveletDenoiseAll_info(int levwav, const wavelet_decomposition &WaveletCoeffs_a, const wavelet_decomposition &WaveletCoeffs_b, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float & minblueaut, int schoice, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb); bool WaveletDenoiseAllL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge, int denoiseNestedLevels); bool WaveletDenoiseAllAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float *variC, int local, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, int denoiseNestedLevels); - bool WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float *variC, int local, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, int denoiseNestedLevels); bool WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge, int denoiseNestedLevels); -// bool WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3]); -// bool WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab, -// const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb); + bool WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float *variC, int local, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, int denoiseNestedLevels); void ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir, float *noisevarlum, float * madL, float * vari, int edge); void ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float **buffer, int level, int dir, float *noisevarchrom, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, float * madL, float * variC, int local, float * madaab = nullptr, bool madCalculated = false); -// void ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir, float *noisevarlum, float * madL, float * vari, int edge); -// void ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float **buffer, int level, int dir, -// float *noisevarchrom, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, float * madL, float * madaab = nullptr, bool madCalculated = false); void ShrinkAll_info(float ** WavCoeffs_a, float ** WavCoeffs_b, int W_ab, int H_ab, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, int schoice, int lvl, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb); From 31355ca70e2585d2b62268cc89f80697ea93aab9 Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 6 Apr 2020 09:37:37 +0200 Subject: [PATCH 074/109] Added equalizer denoise luminance --- rtdata/languages/default | 6 +++-- rtengine/FTblockDN.cc | 6 ++--- rtengine/ipwavelet.cc | 56 +++++++++++++++++++++++++++++++++++++--- rtengine/procparams.cc | 4 +++ rtengine/procparams.h | 1 + rtgui/paramsedited.cc | 6 +++++ rtgui/paramsedited.h | 1 + rtgui/wavelet.cc | 12 +++++++++ rtgui/wavelet.h | 2 ++ 9 files changed, 85 insertions(+), 9 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 83262a3fc..c49205767 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -791,7 +791,8 @@ HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength HISTORY_MSG_TEMPOUT;CAM02 automatic temperature HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor HISTORY_MSG_TRANS_Method;Geometry - Method -HISTORY_MSG_WAVBALCHROM;Balance chroma +HISTORY_MSG_WAVBALCHROM;Equalizer chrominance +HISTORY_MSG_WAVBALLUM;Equalizer luminance HISTORY_MSG_WAVCHROMFI;Chroma fine HISTORY_MSG_WAVCHROMCO;Chroma coarse HISTORY_MSG_WAVCLARI;Clarity @@ -2145,7 +2146,8 @@ TP_WAVELET_BALANCE;Contrast balance d/v-h TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the wavelet directions: vertical-horizontal and diagonal.\nIf contrast, chroma or residual tone mapping are activated, the effect due to balance is amplified. TP_WAVELET_BALCHRO;Chrominance balance TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance. -TP_WAVELET_BALCHROM;Chrominance balance +TP_WAVELET_BALCHROM;Denoise Equalizer Blue-Red +TP_WAVELET_BALLUM;Denoise Equalizer White-Black TP_WAVELET_BANONE;None TP_WAVELET_BASLI;Slider TP_WAVELET_BATYPE;Contrast balance method diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 34e7351b8..894c72ce2 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -2214,7 +2214,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W int maxlvl = min(WaveletCoeffs_L.maxlevel(), 5); const float eps = 0.01f; - if (edge == 1 || edge == 3) { + if (edge == 1 || edge == 3 || edge == 4) { maxlvl = 4; //for refine denoise edge wavelet } @@ -2294,7 +2294,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W } } - if (edge == 2) { + if (edge == 2 || edge == 4) { for (int i = 0; i < Hlvl_L * Wlvl_L; ++i) { nvl[i] = vari[lvl] * SQR(noisevarlum[i]); } @@ -2721,7 +2721,7 @@ void ImProcFunctions::ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, f } } - if (edge == 2) { + if (edge == 2 || edge == 4) { for (int i = 0; i < W_L * H_L; ++i) { nvl[i] = vari[level] * SQR(noisevarlum[i]); } diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 43c5733db..a5dc1b7c6 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -138,6 +138,7 @@ struct cont_params { float edgampl; int neigh; bool lipp; + float ballum; float balchrom; float chromfi; float chromco; @@ -401,6 +402,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.balchrom = waparams.balchrom; cp.chromfi = 0.1f * waparams.chromfi; cp.chromco = 0.1f * waparams.chromco; + cp.ballum = waparams.ballum; cp.conres = waparams.rescon; cp.conresH = waparams.resconH; @@ -884,16 +886,62 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const vari[1] = 8.f * SQR((cp.lev1n / 125.f) * (1.f + cp.lev1n / 25.f)); vari[2] = 8.f * SQR((cp.lev2n / 125.f) * (1.f + cp.lev2n / 25.f)); vari[3] = 8.f * SQR((cp.lev3n / 125.f) * (1.f + cp.lev3n / 25.f)); + float kr3 = 1.f; + if (cp.lev3n < 10.f) { + kr3 = 0.f; + } else if (cp.lev3n < 30.f) { + kr3 = 0.5f; + } else if (cp.lev3n < 70.f) { + kr3 = 0.7f; + } else { + kr3 = 1.f; + } if ((cp.lev0n > 0.1f || cp.lev1n > 0.1f || cp.lev2n > 0.1f || cp.lev3n > 0.1f) && cp.noiseena) { - int edge = 1; + int edge = 4; vari[0] = rtengine::max(0.0001f, vari[0]); vari[1] = rtengine::max(0.0001f, vari[1]); vari[2] = rtengine::max(0.0001f, vari[2]); - vari[3] = rtengine::max(0.0001f, vari[3]); - float* noisevarlum = nullptr; // we need a dummy to pass it to WaveletDenoiseAllL + vari[3] = rtengine::max(0.0001f, kr3 * vari[3]); + // float* noisevarlum = nullptr; // we need a dummy to pass it to WaveletDenoiseAllL + int GWL = labco->W; + int GHL = labco->H; + float* noisevarlum = new float[GHL * GWL]; + int GW2L = (GWL + 1) / 2; - WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, vari, edge, 1); + float nvlh[13] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 0.7f, 0.5f}; //high value + float nvll[13] = {0.1f, 0.15f, 0.2f, 0.25f, 0.3f, 0.35f, 0.4f, 0.45f, 0.7f, 0.8f, 1.f, 1.f, 1.f}; //low value + + float seuillow = 3000.f;//low + float seuilhigh = 18000.f;//high + int i = 10 - cp.ballum; + float ac = (nvlh[i] - nvll[i]) / (seuillow - seuilhigh); + float bc = nvlh[i] - seuillow * ac; + +#ifdef _OPENMP + #pragma omp parallel for + +#endif + + for (int ir = 0; ir < GHL; ir++) + for (int jr = 0; jr < GWL; jr++) { + float lN = labco->L[ir][jr]; + + if (lN < seuillow) { + noisevarlum[(ir >> 1)*GW2L + (jr >> 1)] = nvlh[i]; + } else if (lN < seuilhigh) { + noisevarlum[(ir >> 1)*GW2L + (jr >> 1)] = ac * lN + bc; + } else { + noisevarlum[(ir >> 1)*GW2L + (jr >> 1)] = nvll[i]; + } + } + if (cp.lev3n < 0.5f) { + WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, vari, edge, 1); + } else { + WaveletDenoiseAll_BiShrinkL(*Ldecomp, noisevarlum, madL, vari, edge, 1); + + WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, vari, edge, 1); + } } //Flat curve for Contrast=f(H) in levels diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index b398cc729..b02f1970c 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2248,6 +2248,7 @@ WaveletParams::WaveletParams() : bluemed(0), greenhigh(0), bluehigh(0), + ballum(7.), balchrom(0.), chromfi(0.), chromco(0.), @@ -2361,6 +2362,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && bluemed == other.bluemed && greenhigh == other.greenhigh && bluehigh == other.bluehigh + && ballum == other.ballum && balchrom == other.balchrom && chromfi == other.chromfi && chromco == other.chromco @@ -3526,6 +3528,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.bluehigh, "Wavelet", "CBbluehigh", wavelet.bluehigh, keyFile); saveToKeyfile(!pedited || pedited->wavelet.bluemed, "Wavelet", "CBbluemed", wavelet.bluemed, keyFile); saveToKeyfile(!pedited || pedited->wavelet.bluelow, "Wavelet", "CBbluelow", wavelet.bluelow, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.ballum, "Wavelet", "Ballum", wavelet.ballum, keyFile); saveToKeyfile(!pedited || pedited->wavelet.balchrom, "Wavelet", "Balchrom", wavelet.balchrom, keyFile); saveToKeyfile(!pedited || pedited->wavelet.chromfi, "Wavelet", "Chromfine", wavelet.chromfi, keyFile); saveToKeyfile(!pedited || pedited->wavelet.chromco, "Wavelet", "Chromcoarse", wavelet.chromco, keyFile); @@ -4699,6 +4702,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "CBbluehigh", pedited, wavelet.bluehigh, pedited->wavelet.bluehigh); assignFromKeyfile(keyFile, "Wavelet", "CBbluemed", pedited, wavelet.bluemed, pedited->wavelet.bluemed); assignFromKeyfile(keyFile, "Wavelet", "CBbluelow", pedited, wavelet.bluelow, pedited->wavelet.bluelow); + assignFromKeyfile(keyFile, "Wavelet", "Ballum", pedited, wavelet.ballum, pedited->wavelet.ballum); assignFromKeyfile(keyFile, "Wavelet", "Balchrom", pedited, wavelet.balchrom, pedited->wavelet.balchrom); assignFromKeyfile(keyFile, "Wavelet", "Chromfine", pedited, wavelet.chromfi, pedited->wavelet.chromfi); assignFromKeyfile(keyFile, "Wavelet", "Chromcoarse", pedited, wavelet.chromco, pedited->wavelet.chromco); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index a6147ccc5..4e2b0c275 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1205,6 +1205,7 @@ struct WaveletParams { int bluemed; int greenhigh; int bluehigh; + double ballum; double balchrom; double chromfi; double chromco; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 0685e1471..0faee0fd3 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -486,6 +486,7 @@ void ParamsEdited::set(bool v) wavelet.bluemed = v; wavelet.bluelow = v; wavelet.lipst = v; + wavelet.ballum = v; wavelet.balchrom = v; wavelet.chromfi = v; wavelet.chromco = v; @@ -1096,6 +1097,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.bluelow = wavelet.bluelow && p.wavelet.bluelow == other.wavelet.bluelow; wavelet.lipst = wavelet.lipst && p.wavelet.lipst == other.wavelet.lipst; wavelet.bluehigh = wavelet.bluehigh && p.wavelet.bluehigh == other.wavelet.bluehigh; + wavelet.ballum = wavelet.ballum && p.wavelet.ballum == other.wavelet.ballum; wavelet.balchrom = wavelet.balchrom && p.wavelet.balchrom == other.wavelet.balchrom; wavelet.chromfi = wavelet.chromfi && p.wavelet.chromfi == other.wavelet.chromfi; wavelet.chromco = wavelet.chromco && p.wavelet.chromco == other.wavelet.chromco; @@ -2935,6 +2937,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.bluelow = mods.wavelet.bluelow; } + if (wavelet.ballum) { + toEdit.wavelet.ballum = mods.wavelet.ballum; + } + if (wavelet.balchrom) { toEdit.wavelet.balchrom = mods.wavelet.balchrom; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 4465d15b4..d1be2c57e 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -586,6 +586,7 @@ struct WaveletParamsEdited { bool bluemed; bool greenhigh; bool bluehigh; + bool ballum; bool balchrom; bool chromfi; bool chromco; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 23e526474..652774af4 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -130,6 +130,7 @@ Wavelet::Wavelet() : edgedetectthr2(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGEDETECTTHR2"), -10, 100, 1, 0))), edgesensi(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGESENSI"), 0, 100, 1, 60))), edgeampli(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGEAMPLI"), 0, 100, 1, 10))), + ballum(Gtk::manage(new Adjuster(M("TP_WAVELET_BALLUM"), -2., 10., 0.5, 7., Gtk::manage(new RTImage("circle-white-small.png")), Gtk::manage(new RTImage("circle-black-small.png"))))), balchrom(Gtk::manage(new Adjuster(M("TP_WAVELET_BALCHROM"), -100., 100., 1., 0., Gtk::manage(new RTImage("circle-blue-small.png")), Gtk::manage(new RTImage("circle-red-small.png"))))), chromfi(Gtk::manage(new Adjuster(M("TP_WAVELET_CHROMFI"), 0.0, 150., 0.01, 0.))), chromco(Gtk::manage(new Adjuster(M("TP_WAVELET_CHROMCO"), 0, 100., 0.01, 0.))), @@ -183,6 +184,7 @@ Wavelet::Wavelet() : auto m = ProcEventMapper::getInstance(); EvWavenaclari = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVCLARI"); EvWavushamet = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVUSHAMET"); + EvWavballum = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVBALLUM"); EvWavbalchrom = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVBALCHROM"); EvWavchromfi = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVCHROMFI"); EvWavchromco = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVCHROMCO"); @@ -524,7 +526,9 @@ Wavelet::Wavelet() : level3noise->setAdjusterListener(this); level3noise->setUpdatePolicy(RTUP_DYNAMIC); + ballum->setAdjusterListener(this); + noiseBox->pack_start(*ballum); noiseBox->pack_start(*level0noise, Gtk::PACK_SHRINK, 0); noiseBox->pack_start(*level1noise, Gtk::PACK_SHRINK, 0); noiseBox->pack_start(*level2noise, Gtk::PACK_SHRINK, 0); @@ -1403,6 +1407,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) softrad->setValue(pp->wavelet.softrad); softradend->setValue(pp->wavelet.softradend); + ballum->setValue(pp->wavelet.ballum); balchrom->setValue(pp->wavelet.balchrom); chromfi->setValue(pp->wavelet.chromfi); chromco->setValue(pp->wavelet.chromco); @@ -1551,6 +1556,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) softrad->setEditedState(pedited->wavelet.softrad ? Edited : UnEdited); softradend->setEditedState(pedited->wavelet.softradend ? Edited : UnEdited); + ballum->setEditedState(pedited->wavelet.ballum ? Edited : UnEdited); balchrom->setEditedState(pedited->wavelet.balchrom ? Edited : UnEdited); chromfi->setEditedState(pedited->wavelet.chromfi ? Edited : UnEdited); chromco->setEditedState(pedited->wavelet.chromco ? Edited : UnEdited); @@ -1774,6 +1780,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.strength = (int) strength->getValue(); pp->wavelet.balance = (int) balance->getValue(); pp->wavelet.balchrom = balchrom->getValue(); + pp->wavelet.ballum = ballum->getValue(); pp->wavelet.chromfi = chromfi->getValue(); pp->wavelet.chromco = chromco->getValue(); @@ -1895,6 +1902,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.bluemed = bluemed->getEditedState(); pedited->wavelet.greenhigh = greenhigh->getEditedState(); pedited->wavelet.bluehigh = bluehigh->getEditedState(); + pedited->wavelet.ballum = ballum->getEditedState(); pedited->wavelet.balchrom = balchrom->getEditedState(); pedited->wavelet.chromfi = chromfi->getEditedState(); pedited->wavelet.chromco = chromco->getEditedState(); @@ -2129,6 +2137,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit level1noise->setDefault (defParams->wavelet.level1noise); level2noise->setDefault (defParams->wavelet.level2noise); level3noise->setDefault (defParams->wavelet.level3noise); + ballum->setDefault(defParams->wavelet.ballum); balchrom->setDefault(defParams->wavelet.balchrom); chromfi->setDefault(defParams->wavelet.chromfi); chromco->setDefault(defParams->wavelet.chromco); @@ -2155,6 +2164,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit mergeC->setDefaultEditedState(pedited->wavelet.mergeC ? Edited : UnEdited); softrad->setDefaultEditedState(pedited->wavelet.softrad ? Edited : UnEdited); softradend->setDefaultEditedState(pedited->wavelet.softradend ? Edited : UnEdited); + ballum->setDefaultEditedState(pedited->wavelet.ballum ? Edited : UnEdited); balchrom->setDefaultEditedState(pedited->wavelet.balchrom ? Edited : UnEdited); chromfi->setDefaultEditedState(pedited->wavelet.chromfi ? Edited : UnEdited); chromco->setDefaultEditedState(pedited->wavelet.chromco ? Edited : UnEdited); @@ -2951,6 +2961,8 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavgreenhigh, greenhigh->getTextValue()); } else if (a == bluehigh) { listener->panelChanged(EvWavbluehigh, bluehigh->getTextValue()); + } else if (a == ballum) { + listener->panelChanged(EvWavballum, ballum->getTextValue()); } else if (a == balchrom) { listener->panelChanged(EvWavbalchrom, balchrom->getTextValue()); } else if (a == chromfi) { diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index 07d2432ac..d1b4bb7c3 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -70,6 +70,7 @@ public: private: rtengine::ProcEvent EvWavenaclari; rtengine::ProcEvent EvWavushamet; + rtengine::ProcEvent EvWavballum; rtengine::ProcEvent EvWavbalchrom; rtengine::ProcEvent EvWavchromfi; rtengine::ProcEvent EvWavchromco; @@ -244,6 +245,7 @@ private: Adjuster* const edgedetectthr2; Adjuster* const edgesensi; Adjuster* const edgeampli; + Adjuster* const ballum; Adjuster* const balchrom; Adjuster* const chromfi; Adjuster* const chromco; From 9f5e81b0262e50bf26dfdfc3524382d7b428557f Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 6 Apr 2020 09:42:46 +0200 Subject: [PATCH 075/109] Change tooltip offset --- rtdata/languages/default | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index c49205767..64af97689 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2328,7 +2328,7 @@ TP_WAVELET_USHARP_TOOLTIP;Origin : the source file is the file before Wavelet.\n TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, wavelet settings will be automatically positioned :\nBackground=black, Process=below, level=3...you can change level between 1 and 4.\n\nIf you select Clarity, wavelet settings will be automatically positioned :\nBackground=residual, Process=above, level=7..you can change level between 5 and 10 and wavelet levels. TP_WAVELET_WAVLOWTHR;Low contrast threshold TP_WAVELET_WAVOFFSET;Offset -TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between shadows and highlights.\n High values will amplify the contrast enhancement of the highlights, while low values will amplify the contrast enhancement of the shadows. Along with a low Max. effect value will help you selecting the contrasts that will be enhanced +TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between shadows and highlights.\nHigh values here will amplify the contrast change of the highlights, whereas low values will amplify the contrast change of the shadows.\nAlong with a low Damper value you will able to select the contrasts that will be enhanced. TP_WBALANCE_AUTO;Auto TP_WBALANCE_AUTOITCGREEN;Auto iterate temperature correlation TP_WBALANCE_AUTOOLD;Auto RGB grey From ded866f5afc1e009a51adc74ba604ebcd5f9b9df Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 6 Apr 2020 17:33:01 +0200 Subject: [PATCH 076/109] Optimize memory when denoise chroma is not used --- rtengine/ipwavelet.cc | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index a5dc1b7c6..0d55791d6 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -838,7 +838,8 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (levwavL < 4) { levwavL = 4; //to allow edge => I always allocate 3 (4) levels..because if user select wavelet it is to do something !! } - + bool usechrom = cp.chromfi > 0.f || cp.chromco > 0.f; + if (levwavL > 0) { const std::unique_ptr Ldecomp(new wavelet_decomposition(labco->data, labco->W, labco->H, levwavL, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); float madL[8][3]; @@ -970,7 +971,9 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } */ - + if(!usechrom) { + Ldecomp->reconstruct(labco->data, cp.strength); + } float variC[7]; float variCb[7]; @@ -1298,8 +1301,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (hhCurve) { delete hhCurve; } - - Ldecomp->reconstruct(labco->data, cp.strength); + + if(usechrom) { + Ldecomp->reconstruct(labco->data, cp.strength); + } } } From abba1bf360502b13bd541b68bf4630c0e2835cce Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 7 Apr 2020 10:16:08 +0200 Subject: [PATCH 077/109] Improve enabled blur level and wavelet decomp level --- rtengine/ipwavelet.cc | 105 ++++++++++++++++++++++++++++-------------- rtgui/wavelet.cc | 2 +- 2 files changed, 71 insertions(+), 36 deletions(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 0d55791d6..860530be2 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -524,11 +524,12 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (params->wavelet.Tilesmethod == "big") { realtile = 22; } -/* - if (params->wavelet.Tilesmethod == "lit") { - realtile = 12; - } -*/ + + /* + if (params->wavelet.Tilesmethod == "lit") { + realtile = 12; + } + */ int tilesize = 128 * realtile; int overlap = (int) tilesize * 0.125f; int numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip; @@ -823,7 +824,25 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const ref0 = true; } - if (cp.contrast == 0.f && !cp.tonemap && cp.conres == 0.f && cp.conresH == 0.f && cp.val == 0 && !ref0 && params->wavelet.CLmethod == "all") { // no processing of residual L or edge=> we probably can reduce the number of levels + bool wavcurvecomp = false;//not enable if 0.75 + + if (wavblcurve) { + for (int i = 0; i < 500; i++) { + if (wavblcurve[i] != 0.) { + wavcurvecomp = true; + } + } + } + + bool exblurL = cp.blena && wavcurvecomp; + + if(exblurL) { + if(cp.mul[0] == 0.f) { + cp.mul[0] = 0.01f;//to enable WaveletcontAllL if no contrast is nead + } + } + + if (!exblurL && cp.contrast == 0.f && cp.blurres == 0.f && !cp.tonemap && cp.conres == 0.f && cp.conresH == 0.f && cp.val == 0 && !ref0 && params->wavelet.CLmethod == "all") { // no processing of residual L or edge=> we probably can reduce the number of levels while (levwavL > 0 && cp.mul[levwavL - 1] == 0.f) { // cp.mul[level] == 0.f means no changes to level levwavL--; } @@ -838,8 +857,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (levwavL < 4) { levwavL = 4; //to allow edge => I always allocate 3 (4) levels..because if user select wavelet it is to do something !! } + + // printf("wave L=%i\n", levwavL); bool usechrom = cp.chromfi > 0.f || cp.chromco > 0.f; - + if (levwavL > 0) { const std::unique_ptr Ldecomp(new wavelet_decomposition(labco->data, labco->W, labco->H, levwavL, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); float madL[8][3]; @@ -888,6 +909,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const vari[2] = 8.f * SQR((cp.lev2n / 125.f) * (1.f + cp.lev2n / 25.f)); vari[3] = 8.f * SQR((cp.lev3n / 125.f) * (1.f + cp.lev3n / 25.f)); float kr3 = 1.f; + if (cp.lev3n < 10.f) { kr3 = 0.f; } else if (cp.lev3n < 30.f) { @@ -904,7 +926,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const vari[1] = rtengine::max(0.0001f, vari[1]); vari[2] = rtengine::max(0.0001f, vari[2]); vari[3] = rtengine::max(0.0001f, kr3 * vari[3]); - // float* noisevarlum = nullptr; // we need a dummy to pass it to WaveletDenoiseAllL + // float* noisevarlum = nullptr; // we need a dummy to pass it to WaveletDenoiseAllL int GWL = labco->W; int GHL = labco->H; float* noisevarlum = new float[GHL * GWL]; @@ -920,22 +942,23 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const float bc = nvlh[i] - seuillow * ac; #ifdef _OPENMP - #pragma omp parallel for + #pragma omp parallel for #endif - for (int ir = 0; ir < GHL; ir++) - for (int jr = 0; jr < GWL; jr++) { - float lN = labco->L[ir][jr]; + for (int ir = 0; ir < GHL; ir++) + for (int jr = 0; jr < GWL; jr++) { + float lN = labco->L[ir][jr]; + + if (lN < seuillow) { + noisevarlum[(ir >> 1)*GW2L + (jr >> 1)] = nvlh[i]; + } else if (lN < seuilhigh) { + noisevarlum[(ir >> 1)*GW2L + (jr >> 1)] = ac * lN + bc; + } else { + noisevarlum[(ir >> 1)*GW2L + (jr >> 1)] = nvll[i]; + } + } - if (lN < seuillow) { - noisevarlum[(ir >> 1)*GW2L + (jr >> 1)] = nvlh[i]; - } else if (lN < seuilhigh) { - noisevarlum[(ir >> 1)*GW2L + (jr >> 1)] = ac * lN + bc; - } else { - noisevarlum[(ir >> 1)*GW2L + (jr >> 1)] = nvll[i]; - } - } if (cp.lev3n < 0.5f) { WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, vari, edge, 1); } else { @@ -965,13 +988,14 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } WaveletcontAllLfinal(*Ldecomp, cp, mean, sigma, MaxP, waOpacityCurveWL); + //Evaluate2(*Ldecomp, cp, ind, mean, meanN, sigma, sigmaN, MaxP, MaxN, madL); /* Ldecomp->reconstruct(labco->data, cp.strength); } } */ - if(!usechrom) { + if (!usechrom) { Ldecomp->reconstruct(labco->data, cp.strength); } @@ -1147,11 +1171,11 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const variC[6] = max(0.0001f, k6 * variC[6]); variCb[6] = max(0.0001f, k6 * variCb[6]); -/* - for (int y = 0; y < 7; y++) { - printf("y=%i madL=%f varia=%f variab=%f\n", y, madL[y][1], variC[y], variCb[y]); - } -*/ + /* + for (int y = 0; y < 7; y++) { + printf("y=%i madL=%f varia=%f variab=%f\n", y, madL[y][1], variC[y], variCb[y]); + } + */ float nvch = 0.6f;//high value float nvcl = 0.1f;//low value @@ -1199,11 +1223,12 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const hhutili = true; } + bool exblurab = cp.chrwav > 0.f && exblurL; if (!hhutili) { //always a or b int levwava = levwav; - if (cp.chrores == 0.f && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels + if (!exblurab && cp.chrores == 0.f && cp.blurcres == 0.f && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels while (levwava > 0 && !cp.diag && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwava - 1] == 0.f)) || (cp.CHmet != 2 && (levwava == 10 || (!cp.curv || cp.mulC[levwava - 1] == 0.f))))) && (!cp.opaRG || levwava == 10 || (cp.opaRG && cp.mulopaRG[levwava - 1] == 0.f)) && ((levwava == 10 || (cp.CHSLmet == 1 && cp.mulC[levwava - 1] == 0.f)))) { levwava--; } @@ -1215,14 +1240,17 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } + // printf("wavea=%i\n", levwava); + if (levwava > 0) { const std::unique_ptr adecomp(new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwava, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!adecomp->memoryAllocationFailed) { - if(cp.noiseena && (cp.chromfi > 0.f || cp.chromfi > 0.f)) { + if (cp.noiseena && (cp.chromfi > 0.f || cp.chromfi > 0.f)) { WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); } + Evaluate2(*adecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); WaveletcontAllAB(labco, varhue, varchro, *adecomp, wavblcurve, waOpacityCurveW, cp, true, skip, meanab, sigmaab); adecomp->reconstruct(labco->data + datalen, cp.strength); @@ -1231,7 +1259,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const int levwavb = levwav; - if (cp.chrores == 0.f && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels + if (!exblurab && cp.chrores == 0.f && cp.blurcres == 0.f && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels while (levwavb > 0 && !cp.diag && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwavb - 1] == 0.f)) || (cp.CHmet != 2 && (levwavb == 10 || (!cp.curv || cp.mulC[levwavb - 1] == 0.f))))) && (!cp.opaBY || levwavb == 10 || (cp.opaBY && cp.mulopaBY[levwavb - 1] == 0.f)) && ((levwavb == 10 || (cp.CHSLmet == 1 && cp.mulC[levwavb - 1] == 0.f)))) { levwavb--; } @@ -1243,14 +1271,17 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } + // printf("waveb=%i\n", levwavb); + if (levwavb > 0) { const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!bdecomp->memoryAllocationFailed) { - if(cp.noiseena && (cp.chromfi > 0.f || cp.chromfi > 0.f)) { + if (cp.noiseena && (cp.chromfi > 0.f || cp.chromfi > 0.f)) { WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); } + Evaluate2(*bdecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip, meanab, sigmaab); bdecomp->reconstruct(labco->data + 2 * datalen, cp.strength); @@ -1259,11 +1290,12 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } else {// a and b int levwavab = levwav; - if (cp.chrores == 0.f && !hhutili && params->wavelet.CLmethod == "all") { // no processing of residual ab => we probably can reduce the number of levels + if (!exblurab && cp.chrores == 0.f && cp.blurcres == 0.f && !hhutili && params->wavelet.CLmethod == "all") { // no processing of residual ab => we probably can reduce the number of levels while (levwavab > 0 && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwavab - 1] == 0.f)) || (cp.CHmet != 2 && (levwavab == 10 || (!cp.curv || cp.mulC[levwavab - 1] == 0.f))))) && (!cp.opaRG || levwavab == 10 || (cp.opaRG && cp.mulopaRG[levwavab - 1] == 0.f)) && ((levwavab == 10 || (cp.CHSLmet == 1 && cp.mulC[levwavab - 1] == 0.f)))) { levwavab--; } } + if (cp.chromfi > 0.f || cp.chromco > 0.f) { if (levwavab < 7) { levwavab = 7; @@ -1275,16 +1307,18 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!adecomp->memoryAllocationFailed && !bdecomp->memoryAllocationFailed) { - if(cp.noiseena && (cp.chromfi > 0.f || cp.chromfi > 0.f)) { + if (cp.noiseena && (cp.chromfi > 0.f || cp.chromfi > 0.f)) { WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); } + Evaluate2(*adecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); WaveletcontAllAB(labco, varhue, varchro, *adecomp, wavblcurve, waOpacityCurveW, cp, true, skip, meanab, sigmaab); WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); Evaluate2(*bdecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); - if(cp.noiseena && (cp.chromfi > 0.f || cp.chromfi > 0.f)) { + + if (cp.noiseena && (cp.chromfi > 0.f || cp.chromfi > 0.f)) { WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip, meanab, sigmaab); WaveletAandBAllAB(*adecomp, *bdecomp, cp, hhCurve, hhutili); } @@ -1301,8 +1335,8 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (hhCurve) { delete hhCurve; } - - if(usechrom) { + + if (usechrom) { Ldecomp->reconstruct(labco->data, cp.strength); } } @@ -2350,6 +2384,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * float klev = 1.f; if (wavblcurve && wavcurvecomp && cp.blena) { + printf("Blur level L\n"); float mea[10]; float effect = cp.bluwav; float beta = 0.f; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 652774af4..af159d480 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -138,7 +138,7 @@ Wavelet::Wavelet() : mergeC(Gtk::manage(new Adjuster(M("TP_WAVELET_MERGEC"), -50, 100, 1, 20))), softrad(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.5, 0.))), softradend(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.5, 0.))), - chrwav(Gtk::manage(new Adjuster(M("TP_WAVELET_CHRWAV"), 0., 100., 0., 0.))), + chrwav(Gtk::manage(new Adjuster(M("TP_WAVELET_CHRWAV"), 0., 100., 0.5, 0.))), Lmethod(Gtk::manage(new MyComboBoxText())), CHmethod(Gtk::manage(new MyComboBoxText())), CHSLmethod(Gtk::manage(new MyComboBoxText())), From cbac4e06913ecefbc096dd38c3ddb48a1359b4eb Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 7 Apr 2020 10:52:08 +0200 Subject: [PATCH 078/109] Fixed segmentation fault with blur levels --- rtengine/ipwavelet.cc | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 860530be2..703894e2d 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -836,9 +836,9 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const bool exblurL = cp.blena && wavcurvecomp; - if(exblurL) { - if(cp.mul[0] == 0.f) { - cp.mul[0] = 0.01f;//to enable WaveletcontAllL if no contrast is nead + if (exblurL) { + if (cp.mul[0] == 0.f) { + cp.mul[0] = 0.01f;//to always enable WaveletcontAllL if no contrast is nead } } @@ -858,7 +858,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const levwavL = 4; //to allow edge => I always allocate 3 (4) levels..because if user select wavelet it is to do something !! } - // printf("wave L=%i\n", levwavL); + if (settings->verbose) { + printf("Level decomp L=%i\n", levwavL); + } + bool usechrom = cp.chromfi > 0.f || cp.chromco > 0.f; if (levwavL > 0) { @@ -1240,7 +1243,9 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } - // printf("wavea=%i\n", levwava); + if (settings->verbose) { + printf("Leval decomp a=%i\n", levwava); + } if (levwava > 0) { const std::unique_ptr adecomp(new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwava, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); @@ -1271,7 +1276,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } - // printf("waveb=%i\n", levwavb); + if (settings->verbose) { + printf("Leval decomp b=%i\n", levwavb); + } + if (levwavb > 0) { const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); @@ -2384,7 +2392,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * float klev = 1.f; if (wavblcurve && wavcurvecomp && cp.blena) { - printf("Blur level L\n"); + // printf("Blur level L\n"); float mea[10]; float effect = cp.bluwav; float beta = 0.f; @@ -2446,13 +2454,8 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } klev = (wavblcurve[lvl * 55.5f]); - float lvr = lvl; - if (lvr == 0) { - lvr = 1; - } - - klev *= beta * lvr * 100.f / skip; + klev *= beta * 100.f / skip; boxblur(bef, aft, klev, Wlvl_L, Hlvl_L, false); for (int co = 0; co < Hlvl_L * Wlvl_L; co++) { @@ -2707,6 +2710,7 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float ContAllAB(labco, maxlvl, varhue, varchrom, WavCoeffs_ab, WavCoeffs_ab0, lvl, dir, waOpacityCurveW, cp, Wlvl_ab, Hlvl_ab, useChannelA); if (wavblcurve && wavcurvecomp && cp.blena && cp.chrwav > 0.f) { + float mea[10]; float effect = cp.bluwav; float beta = 0.f; @@ -2750,13 +2754,8 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float } klev = (wavblcurve[lvl * 55.5f]); - float lvr = lvl; - if (lvr == 0) { - lvr = 1; - } - - klev *= beta * cp.chrwav * lvr * 200.f / skip; + klev *= beta * cp.chrwav * 100.f / skip; boxblur(bef, aft, klev, Wlvl_ab, Hlvl_ab, false); From 4c0013b461c060cb83ab2b2602a0644c70dd309a Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 8 Apr 2020 07:42:17 +0200 Subject: [PATCH 079/109] Wavelet final - Change guidefilter parameters --- rtengine/ipwavelet.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 703894e2d..f415c9c8e 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1576,10 +1576,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } - constexpr double epsilmax = 0.001; - constexpr double epsilmin = 0.0001; - constexpr double aepsil = (epsilmax - epsilmin) / 90.f; - constexpr double bepsil = epsilmax - 100.f * aepsil; + constexpr double epsilmax = 0.002; + constexpr double epsilmin = 0.0005; + constexpr double aepsil = 0.01f * (epsilmax - epsilmin); + constexpr double bepsil = epsilmin; const double epsil = aepsil * waparams.softradend + bepsil; const float blur = 10.f / scale * (0.001f + 0.8f * waparams.softradend); From c2fae0ce87cfed13e32eb43a518d3e5bdf08bcaa Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 10 Apr 2020 09:20:31 +0200 Subject: [PATCH 080/109] Change sensitivity sliders wavelet levels denoise --- rtengine/FTblockDN.cc | 2 +- rtengine/ipwavelet.cc | 53 +++++++++++++++++++++++-------------------- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 894c72ce2..ab06f92f2 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -549,7 +549,7 @@ BENCHFUN const float noisevarL = (useNoiseLCurve && (denoiseMethodRgb || !isRAW)) ? SQR(((noiseluma + 1.f) / 125.f) * (10.f + (noiseluma + 1.f) / 25.f)) : SQR((noiseluma / 125.f) * (1.f + noiseluma / 25.f)); const bool denoiseLuminance = (noisevarL > 0.00001f); - //printf("NL=%f \n",noisevarL); +// printf("NL=%f \n",noisevarL); if (useNoiseLCurve || useNoiseCCurve) { int hei = calclum->getHeight(); int wid = calclum->getWidth(); diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index f415c9c8e..264b5df6d 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -907,10 +907,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const //init for edge and denoise float vari[4]; - vari[0] = 8.f * SQR((cp.lev0n / 125.f) * (1.f + cp.lev0n / 25.f)); - vari[1] = 8.f * SQR((cp.lev1n / 125.f) * (1.f + cp.lev1n / 25.f)); - vari[2] = 8.f * SQR((cp.lev2n / 125.f) * (1.f + cp.lev2n / 25.f)); - vari[3] = 8.f * SQR((cp.lev3n / 125.f) * (1.f + cp.lev3n / 25.f)); + vari[0] = 0.8f * SQR((cp.lev0n / 125.f) * (1.f + cp.lev0n / 25.f)); + vari[1] = 0.8f * SQR((cp.lev1n / 125.f) * (1.f + cp.lev1n / 25.f)); + vari[2] = 0.8f * SQR((cp.lev2n / 125.f) * (1.f + cp.lev2n / 25.f)); + vari[3] = 0.8f * SQR((cp.lev3n / 125.f) * (1.f + cp.lev3n / 25.f)); float kr3 = 1.f; if (cp.lev3n < 10.f) { @@ -925,10 +925,13 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if ((cp.lev0n > 0.1f || cp.lev1n > 0.1f || cp.lev2n > 0.1f || cp.lev3n > 0.1f) && cp.noiseena) { int edge = 4; - vari[0] = rtengine::max(0.0001f, vari[0]); - vari[1] = rtengine::max(0.0001f, vari[1]); - vari[2] = rtengine::max(0.0001f, vari[2]); - vari[3] = rtengine::max(0.0001f, kr3 * vari[3]); + vari[0] = rtengine::max(0.000001f, vari[0]); + vari[1] = rtengine::max(0.000001f, vari[1]); + vari[2] = rtengine::max(0.000001f, vari[2]); + vari[3] = rtengine::max(0.000001f, kr3 * vari[3]); + if (settings->verbose) { + printf("LUM var0=%f var1=%f var2=%f var3=%f\n",vari[0], vari[1], vari[2], vari[3]); + } // float* noisevarlum = nullptr; // we need a dummy to pass it to WaveletDenoiseAllL int GWL = labco->W; int GHL = labco->H; @@ -1023,15 +1026,15 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (noisecfr < 0.f) { - noisecfr = 0.0001f; + noisecfr = 0.00001f; } if (noiseccr < 0.f) { - noiseccr = 0.0001f; + noiseccr = 0.00001f; } if (noisecfb < 0.f) { - noisecfb = 0.0001f; + noisecfb = 0.00001f; } if (noiseccb < 0.f) { @@ -1062,7 +1065,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const float k3 = 0.f; if (cp.chromfi < 0.2f) { - k1 = 0.f; + k1 = 0.05f; k2 = 0.f; k3 = 0.f; } else if (cp.chromfi < 0.3f) { @@ -1116,7 +1119,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const k3 = 1.f; } - float minic = 0.0001f; + float minic = 0.000001f; variC[0] = max(minic, variC[0]); variC[1] = max(minic, k1 * variC[1]); variC[2] = max(minic, k2 * variC[2]); @@ -1131,15 +1134,12 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const float k5 = 0.f; float k6 = 0.f; - if (cp.chromco == 0.01f) { - k4 = 0.f; - k5 = 0.0f; - } else if (cp.chromco < 0.2f) { + if (cp.chromco < 0.2f) { k4 = 0.1f; - k5 = 0.0f; + k5 = 0.02f; } else if (cp.chromco < 0.5f) { k4 = 0.15f; - k5 = 0.0f; + k5 = 0.05f; } else if (cp.chromco < 1.f) { k4 = 0.15f; k5 = 0.1f; @@ -1157,10 +1157,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const k5 = 1.f; } - variC[4] = max(0.0001f, k4 * variC[4]); - variC[5] = max(0.0001f, k5 * variC[5]); - variCb[4] = max(0.0001f, k4 * variCb[4]); - variCb[5] = max(0.0001f, k5 * variCb[5]); + variC[4] = max(0.000001f, k4 * variC[4]); + variC[5] = max(0.000001f, k5 * variC[5]); + variCb[4] = max(0.000001f, k4 * variCb[4]); + variCb[5] = max(0.000001f, k5 * variCb[5]); if (cp.chromco < 4.f) { k6 = 0.f; @@ -1172,8 +1172,11 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const k6 = 1.f; } - variC[6] = max(0.0001f, k6 * variC[6]); - variCb[6] = max(0.0001f, k6 * variCb[6]); + variC[6] = max(0.00001f, k6 * variC[6]); + variCb[6] = max(0.00001f, k6 * variCb[6]); + if (settings->verbose) { + printf("CHRO var0=%f va1=%f va2=%f va3=%f va4=%f val5=%f va6=%f\n", variC[0], variC[1], variC[2], variC[3],variC[4],variC[5], variC[6]); + } /* for (int y = 0; y < 7; y++) { printf("y=%i madL=%f varia=%f variab=%f\n", y, madL[y][1], variC[y], variCb[y]); From 60bb7b520b2222d127a258a8305d1fedcacbd5d5 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 12 Apr 2020 14:08:06 +0200 Subject: [PATCH 081/109] Wavelet - Fixed crash when blur residual high and zoom high --- rtdata/languages/default | 1 + rtengine/ipwavelet.cc | 64 +++++++++++++++++++++++----------------- rtgui/wavelet.cc | 2 ++ 3 files changed, 40 insertions(+), 27 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 64af97689..b200a2ad7 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2283,6 +2283,7 @@ TP_WAVELET_RE2;Unchanged TP_WAVELET_RE3;Reduced TP_WAVELET_RESBLUR;Blur Luminance TP_WAVELET_RESBLURC;Blur Chroma +TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500% TP_WAVELET_RESCHRO;Intensity TP_WAVELET_RESCON;Shadows TP_WAVELET_RESCONH;Highlights diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 264b5df6d..948b76f2b 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -2201,22 +2201,27 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * //Blur luma if (cp.blurres != 0.f && cp.resena) { - float rad = 0.7f * cp.blurres / skip; - float * bef = new float[W_L * H_L]; - float * aft = new float[W_L * H_L]; + int minWL = min(W_L, H_L); + float k = 0.5f; + //printf("skip=%i WL=%i HL=%i min=%i\n", skip, W_L, H_L, minWL); + if(minWL > 140) {//disabled if too low windows + float rad = k * cp.blurres / skip; + float * bef = new float[W_L * H_L]; + float * aft = new float[W_L * H_L]; + + for (int i = 0; i < H_L * W_L; i++) { + bef[i] = WavCoeffs_L0[i]; + } - for (int i = 0; i < H_L * W_L; i++) { - bef[i] = WavCoeffs_L0[i]; - } + boxblur(bef, aft, rad, W_L, H_L, false); - boxblur(bef, aft, rad, W_L, H_L, false); + for (int i = 0; i < H_L * W_L; i++) { + WavCoeffs_L0[i] = aft[i]; + } - for (int i = 0; i < H_L * W_L; i++) { - WavCoeffs_L0[i] = aft[i]; - } - - delete[] bef; - delete[] aft; + delete[] bef; + delete[] aft; + } } // @@ -2670,22 +2675,27 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float //Blur chroma if (cp.blurcres != 0.f && cp.resena) { - float rad = 0.7f * cp.blurcres / skip; - float * bef = new float[W_L * H_L]; - float * aft = new float[W_L * H_L]; + int minWL = min(W_L, H_L); + float k = 0.5f; + //printf("skip=%i WL=%i HL=%i min=%i\n", skip, W_L, H_L, minWL); + if(minWL > 140) {//disabled if too low windows + float rad = k * cp.blurcres / skip; + float * bef = new float[W_L * H_L]; + float * aft = new float[W_L * H_L]; - for (int i = 0; i < H_L * W_L; i++) { - bef[i] = WavCoeffs_ab0[i]; + for (int i = 0; i < H_L * W_L; i++) { + bef[i] = WavCoeffs_ab0[i]; + } + + boxblur(bef, aft, rad, W_L, H_L, false); + + for (int i = 0; i < H_L * W_L; i++) { + WavCoeffs_ab0[i] = aft[i]; + } + + delete[] bef; + delete[] aft; } - - boxblur(bef, aft, rad, W_L, H_L, false); - - for (int i = 0; i < H_L * W_L; i++) { - WavCoeffs_ab0[i] = aft[i]; - } - - delete[] bef; - delete[] aft; } diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index af159d480..17689be50 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -800,6 +800,8 @@ Wavelet::Wavelet() : blurBox->pack_start(*resblur); blurBox->pack_start(*resblurc); blurFrame->add(*blurBox); + resblur->set_tooltip_text(M("TP_WAVELET_RESBLUR_TOOLTIP")); + resblurc->set_tooltip_text(M("TP_WAVELET_RESBLUR_TOOLTIP")); chromaFrame->set_label_align(0.025, 0.5); ToolParamBlock* const chromaBox = Gtk::manage(new ToolParamBlock()); From 71da91c85f5bf9986dfb1d0d32e1aeea19dbab16 Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 13 Apr 2020 09:04:38 +0200 Subject: [PATCH 082/109] Wavelet levels - Added Damper to local contrast final --- rtdata/languages/default | 5 ++++- rtengine/ipwavelet.cc | 8 +++++--- rtengine/procparams.cc | 4 ++++ rtengine/procparams.h | 1 + rtgui/paramsedited.cc | 6 ++++++ rtgui/paramsedited.h | 1 + rtgui/wavelet.cc | 31 +++++++++++++++++++++++++++---- rtgui/wavelet.h | 3 +++ 8 files changed, 51 insertions(+), 8 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index b200a2ad7..a5cd7746e 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -816,6 +816,7 @@ HISTORY_MSG_WAVBL;Blur levels HISTORY_MSG_BLURWAV;Blur luminance HISTORY_MSG_BLURCWAV;Blur chroma HISTORY_MSG_EDGEFFECT;Edge Damper +HISTORY_MSG_SIGMAFIN;Final contrast Damper HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -2227,6 +2228,7 @@ TP_WAVELET_EDSL;Threshold Sliders TP_WAVELET_EDTYPE;Local contrast method TP_WAVELET_EDVAL;Strength TP_WAVELET_FINAL;Final Touchup +TP_WAVELET_FINCFRAME;Final Local Contrast TP_WAVELET_FINEST;Finest TP_WAVELET_HIGHLIGHT;Highlight luminance range TP_WAVELET_HS1;Whole luminance range @@ -2273,7 +2275,7 @@ TP_WAVELET_NPTYPE_TOOLTIP;This algorithm uses the proximity of a pixel and eight TP_WAVELET_OLDSH;Algorithm using negatives values TP_WAVELET_OPACITY;Opacity Blue-Yellow TP_WAVELET_OPACITYW;Contrast balance d/v-h curve -TP_WAVELET_OPACITYWL;Final local contrast +TP_WAVELET_OPACITYWL;Local contrast TP_WAVELET_OPACITYWL_TOOLTIP;Modify the final local contrast at the end of the wavelet treatment.\n\nThe left side represents the smallest local contrast, progressing to the largest local contrast on the right. TP_WAVELET_PASTEL;Pastel chroma TP_WAVELET_PROC;Process @@ -2294,6 +2296,7 @@ TP_WAVELET_SHA;Sharp mask TP_WAVELET_SHFRAME;Shadows/Highlights TP_WAVELET_SHOWMASK;Show wavelet 'mask' TP_WAVELET_SIGMA;Damper +TP_WAVELET_SIGMAFIN;Damper TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n The lower it is, the more pinpoint will the effect be applied to a narrow range of contrast values. 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. diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 948b76f2b..157fb6239 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -113,6 +113,7 @@ struct cont_params { int TMmeth; float tmstrength; float balan; + float sigmafin; int ite; int contmet; bool opaW; @@ -191,6 +192,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.ite = params->wavelet.iter; cp.tonemap = params->wavelet.tmrs != 0; cp.bam = false; + cp.sigmafin = params->wavelet.sigmafin; if (params->wavelet.TMmethod == "cont") { cp.contmet = 1; @@ -2955,11 +2957,11 @@ void ImProcFunctions::finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, if (cp.diagcurv && cp.finena && MaxP[level] > 0.f && mean[level] != 0.f && sigma[level] != 0.f) { //curve float insigma = 0.666f; //SD float logmax = log(MaxP[level]); //log Max - float rapX = (mean[level] + sigma[level]) / MaxP[level]; //rapport between sD / max + float rapX = (mean[level] + cp.sigmafin * sigma[level]) / MaxP[level]; //rapport between sD / max float inx = log(insigma); float iny = log(rapX); float rap = inx / iny; //koef - float asig = 0.166f / sigma[level]; + float asig = 0.166f / (sigma[level] * cp.sigmafin); float bsig = 0.5f - asig * mean[level]; float amean = 0.5f / mean[level]; @@ -2970,7 +2972,7 @@ void ImProcFunctions::finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, for (int i = 0; i < W_L * H_L; i++) { float absciss; - if (std::fabs(WavCoeffs_L[dir][i]) >= (mean[level] + sigma[level])) { //for max + if (std::fabs(WavCoeffs_L[dir][i]) >= (mean[level] + cp.sigmafin * sigma[level])) { //for max float valcour = xlogf(std::fabs(WavCoeffs_L[dir][i])); float valc = valcour - logmax; float vald = valc * rap; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index b02f1970c..0d8324d4e 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2263,6 +2263,7 @@ WaveletParams::WaveletParams() : tmr(false), strength(100), balance(0), + sigmafin(1.0), iter(0), expcontrast(false), expchroma(false), @@ -2377,6 +2378,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && tmr == other.tmr && strength == other.strength && balance == other.balance + && sigmafin == other.sigmafin && iter == other.iter && expcontrast == other.expcontrast && expchroma == other.expchroma @@ -3514,6 +3516,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.enabled, "Wavelet", "Enabled", wavelet.enabled, keyFile); saveToKeyfile(!pedited || pedited->wavelet.strength, "Wavelet", "Strength", wavelet.strength, keyFile); saveToKeyfile(!pedited || pedited->wavelet.balance, "Wavelet", "Balance", wavelet.balance, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.sigmafin, "Wavelet", "Sigmafin", wavelet.sigmafin, keyFile); saveToKeyfile(!pedited || pedited->wavelet.iter, "Wavelet", "Iter", wavelet.iter, keyFile); saveToKeyfile(!pedited || pedited->wavelet.thres, "Wavelet", "MaxLev", wavelet.thres, keyFile); saveToKeyfile(!pedited || pedited->wavelet.Tilesmethod, "Wavelet", "TilesMethod", wavelet.Tilesmethod, keyFile); @@ -4691,6 +4694,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "Enabled", pedited, wavelet.enabled, pedited->wavelet.enabled); assignFromKeyfile(keyFile, "Wavelet", "Strength", pedited, wavelet.strength, pedited->wavelet.strength); assignFromKeyfile(keyFile, "Wavelet", "Balance", pedited, wavelet.balance, pedited->wavelet.balance); + assignFromKeyfile(keyFile, "Wavelet", "Sigmafin", pedited, wavelet.sigmafin, pedited->wavelet.sigmafin); assignFromKeyfile(keyFile, "Wavelet", "Iter", pedited, wavelet.iter, pedited->wavelet.iter); assignFromKeyfile(keyFile, "Wavelet", "Median", pedited, wavelet.median, pedited->wavelet.median); assignFromKeyfile(keyFile, "Wavelet", "Medianlev", pedited, wavelet.medianlev, pedited->wavelet.medianlev); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 4e2b0c275..c26b02de4 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1221,6 +1221,7 @@ struct WaveletParams { bool tmr; int strength; int balance; + double sigmafin; int iter; bool expcontrast; bool expchroma; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 0faee0fd3..9eff3c4ce 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -475,6 +475,7 @@ void ParamsEdited::set(bool v) wavelet.strength = v; wavelet.balance = v; wavelet.iter = v; + wavelet.sigmafin = v; wavelet.median = v; wavelet.medianlev = v; wavelet.linkedg = v; @@ -1085,6 +1086,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.strength = wavelet.strength && p.wavelet.strength == other.wavelet.strength; wavelet.balance = wavelet.balance && p.wavelet.balance == other.wavelet.balance; wavelet.iter = wavelet.iter && p.wavelet.iter == other.wavelet.iter; + wavelet.sigmafin = wavelet.sigmafin && p.wavelet.sigmafin == other.wavelet.sigmafin; wavelet.median = wavelet.median && p.wavelet.median == other.wavelet.median; wavelet.medianlev = wavelet.medianlev && p.wavelet.medianlev == other.wavelet.medianlev; wavelet.linkedg = wavelet.linkedg && p.wavelet.linkedg == other.wavelet.linkedg; @@ -2893,6 +2895,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.balance = mods.wavelet.balance; } + if (wavelet.sigmafin) { + toEdit.wavelet.sigmafin = mods.wavelet.sigmafin; + } + if (wavelet.iter) { toEdit.wavelet.iter = mods.wavelet.iter; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index d1be2c57e..351096a7e 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -499,6 +499,7 @@ struct WaveletParamsEdited { bool strength; bool balance; bool iter; + bool sigmafin; bool median; bool medianlev; bool linkedg; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 17689be50..c12e216cf 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -112,6 +112,7 @@ Wavelet::Wavelet() : strength(Gtk::manage(new Adjuster(M("TP_WAVELET_STRENGTH"), 0, 100, 1, 100))), balance(Gtk::manage(new Adjuster(M("TP_WAVELET_BALANCE"), -30, 100, 1, 0))), iter(Gtk::manage(new Adjuster(M("TP_WAVELET_ITER"), -3, 3, 1, 0))), + sigmafin(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMAFIN"), 0.025, 2.5, 0.01, 1.))), hueskin(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_HUESKIN"), -314., 314., -5., 25., 170., 120., 0, false))), hueskin2(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_HUESKY"), -314., 314., -260., -250, -130., -140., 0, false))), hllev(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_HIGHLIGHT"), 0., 100., 50., 75., 100., 98., 0, false))), @@ -162,6 +163,7 @@ Wavelet::Wavelet() : blurFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_BLURFRAME")))), chromaFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_CHROMAFRAME")))), chroFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_CHROFRAME")))), + fincFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_FINCFRAME")))), wavLabels(Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER))), labmC(Gtk::manage(new Gtk::Label(M("TP_WAVELET_CTYPE") + ":"))), labmNP(Gtk::manage(new Gtk::Label(M("TP_WAVELET_NPTYPE") + ":"))), @@ -207,6 +209,8 @@ Wavelet::Wavelet() : EvWavresblur = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLURWAV"); EvWavresblurc = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLURCWAV"); EvWavedgeffect = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_EDGEFFECT"); + EvWavsigmafin = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SIGMAFIN"); + expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings)); expcontrast->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expcontrast)); @@ -978,7 +982,7 @@ Wavelet::Wavelet() : iter->setAdjusterListener(this); iter->set_tooltip_text(M("TP_WAVELET_ITER_TOOLTIP")); - Gtk::HSeparator* const separatorbalend = Gtk::manage(new Gtk::HSeparator()); +// Gtk::HSeparator* const separatorbalend = Gtk::manage(new Gtk::HSeparator()); opacityCurveEditorWL->setCurveListener(this); @@ -986,6 +990,7 @@ Wavelet::Wavelet() : opacityShapeWL->setIdentityValue(0.); opacityShapeWL->setResetCurve(FlatCurveType(default_params.opacityCurveWL.at(0)), default_params.opacityCurveWL); opacityShapeWL->setTooltip(M("TP_WAVELET_OPACITYWL_TOOLTIP")); + sigmafin->setAdjusterListener(this); // This will add the reset button at the end of the curveType buttons opacityCurveEditorWL->curveListComplete(); @@ -1004,6 +1009,13 @@ Wavelet::Wavelet() : tmr->set_tooltip_text(M("TP_WAVELET_BALCHRO_TOOLTIP")); tmrConn = tmr->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::tmrToggled)); + fincFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const fincBox = Gtk::manage(new ToolParamBlock()); + fincBox->pack_start(*opacityCurveEditorWL, Gtk::PACK_SHRINK, 2); + fincBox->pack_start(*sigmafin); + fincFrame->add(*fincBox); + + ToolParamBlock* const finalBox = Gtk::manage(new ToolParamBlock()); finalBox->pack_start(*ctboxBA); @@ -1014,9 +1026,10 @@ Wavelet::Wavelet() : finalBox->pack_start(*iter); finalBox->pack_start(*tmr); - finalBox->pack_start(*separatorbalend, Gtk::PACK_SHRINK, 2); - finalBox->pack_start(*opacityCurveEditorWL, Gtk::PACK_SHRINK, 2); - +// finalBox->pack_start(*separatorbalend, Gtk::PACK_SHRINK, 2); +// finalBox->pack_start(*opacityCurveEditorWL, Gtk::PACK_SHRINK, 2); +// finalBox->pack_start(*sigmafin); + finalBox->pack_start(*fincFrame); finalBox->pack_start(*curveEditorG, Gtk::PACK_SHRINK, 4); finalBox->pack_start(*softradend); @@ -1420,6 +1433,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) strength->setValue(pp->wavelet.strength); balance->setValue(pp->wavelet.balance); iter->setValue(pp->wavelet.iter); + sigmafin->setValue(pp->wavelet.sigmafin); for (int i = 0; i < 9; i++) { correction[i]->setValue(pp->wavelet.c[i]); @@ -1537,6 +1551,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) thres->setEditedState(pedited->wavelet.thres ? Edited : UnEdited); balance->setEditedState(pedited->wavelet.balance ? Edited : UnEdited); iter->setEditedState(pedited->wavelet.iter ? Edited : UnEdited); + sigmafin->setEditedState(pedited->wavelet.sigmafin ? Edited : UnEdited); threshold->setEditedState(pedited->wavelet.threshold ? Edited : UnEdited); threshold2->setEditedState(pedited->wavelet.threshold2 ? Edited : UnEdited); edgedetect->setEditedState(pedited->wavelet.edgedetect ? Edited : UnEdited); @@ -1808,6 +1823,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.iter = (int) iter->getValue(); pp->wavelet.wavclCurve = clshape->getCurve(); + pp->wavelet.sigmafin = sigmafin->getValue(); for (int i = 0; i < 9; i++) { pp->wavelet.c[i] = (int) correction[i]->getValue(); @@ -1914,6 +1930,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.softradend = softradend->getEditedState(); pedited->wavelet.balance = balance->getEditedState(); pedited->wavelet.iter = iter->getEditedState(); + pedited->wavelet.sigmafin = sigmafin->getEditedState(); pedited->wavelet.wavclCurve = !clshape->isUnChanged(); pedited->wavelet.expcontrast = !expcontrast->get_inconsistent(); pedited->wavelet.expchroma = !expchroma->get_inconsistent(); @@ -2094,6 +2111,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit strength->setDefault(defParams->wavelet.strength); balance->setDefault(defParams->wavelet.balance); iter->setDefault(defParams->wavelet.iter); + sigmafin->setDefault(defParams->wavelet.sigmafin); sigma->setDefault(defParams->wavelet.sigma); offset->setDefault(defParams->wavelet.offset); lowthr->setDefault(defParams->wavelet.lowthr); @@ -2216,6 +2234,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit strength->setDefaultEditedState(pedited->wavelet.strength ? Edited : UnEdited); balance->setDefaultEditedState(pedited->wavelet.balance ? Edited : UnEdited); iter->setDefaultEditedState(pedited->wavelet.iter ? Edited : UnEdited); + sigmafin->setDefaultEditedState(pedited->wavelet.sigmafin ? Edited : UnEdited); level0noise->setDefaultEditedState(pedited->wavelet.level0noise ? Edited : UnEdited); level1noise->setDefaultEditedState(pedited->wavelet.level1noise ? Edited : UnEdited); level2noise->setDefaultEditedState(pedited->wavelet.level2noise ? Edited : UnEdited); @@ -2278,6 +2297,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit strength->setDefaultEditedState(Irrelevant); balance->setDefaultEditedState(Irrelevant); iter->setDefaultEditedState(Irrelevant); + sigmafin->setDefaultEditedState(Irrelevant); for (int i = 0; i < 9; i++) { correction[i]->setDefaultEditedState(Irrelevant); @@ -2810,6 +2830,7 @@ void Wavelet::setBatchMode(bool batchMode) strength->showEditedCB(); balance->showEditedCB(); iter->showEditedCB(); + sigmafin->showEditedCB(); level0noise->showEditedCB(); level1noise->showEditedCB(); level2noise->showEditedCB(); @@ -2959,6 +2980,8 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavbalance, balance->getTextValue()); } else if (a == iter) { listener->panelChanged(EvWaviter, iter->getTextValue()); + } else if (a == sigmafin) { + listener->panelChanged(EvWavsigmafin, sigmafin->getTextValue()); } else if (a == greenhigh) { listener->panelChanged(EvWavgreenhigh, greenhigh->getTextValue()); } else if (a == bluehigh) { diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index d1b4bb7c3..271aea5b2 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -93,6 +93,7 @@ private: rtengine::ProcEvent EvWavresblur; rtengine::ProcEvent EvWavresblurc; rtengine::ProcEvent EvWavedgeffect; + rtengine::ProcEvent EvWavsigmafin; void foldAllButMe(GdkEventButton* event, MyExpander *expander); @@ -218,6 +219,7 @@ private: Adjuster* const strength; Adjuster* const balance; Adjuster* const iter; + Adjuster* const sigmafin; Adjuster* greenlow; Adjuster* bluelow; @@ -294,6 +296,7 @@ private: Gtk::Frame* const blurFrame; Gtk::Frame* const chromaFrame; Gtk::Frame* const chroFrame; + Gtk::Frame* const fincFrame; Gtk::Label* const wavLabels; Gtk::Label* const labmC; From 9cc744b1f62aec5cc06378b0c4718add6fe9b1a3 Mon Sep 17 00:00:00 2001 From: Thanatomanic <6567747+Thanatomanic@users.noreply.github.com> Date: Mon, 13 Apr 2020 11:40:28 +0200 Subject: [PATCH 083/109] Reset all options in crop. Fixes #5138 and #5045 --- rtgui/crop.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtgui/crop.cc b/rtgui/crop.cc index f092f07a5..48d1e09af 100644 --- a/rtgui/crop.cc +++ b/rtgui/crop.cc @@ -612,6 +612,11 @@ void Crop::doresetCrop () yDirty = true; wDirty = true; hDirty = true; + + // Reset ratio, ratio lock and orientation as well + ratio->set_active(0); + orientation->set_active(2); + fixr->set_active(true); int X = 0; int Y = 0; From 996ba0a9a30869bd25cbc3db32f5bdf2c992b64d Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 13 Apr 2020 13:31:06 +0200 Subject: [PATCH 084/109] Partial decoding or wrong dimensions of X-T30 files, fixes #5709, code taken from ART --- rtengine/dcraw.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index b8d5b9895..29796ea67 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -10048,6 +10048,9 @@ canon_a5: } else if (!strncmp(model, "X-A3", 4) || !strncmp(model, "X-A5", 4)) { width = raw_width = 6016; height = raw_height = 4014; + } else if (!strcmp(model, "X-Pro3") || !strcmp(model, "X-T3") || !strcmp(model, "X-T30")) { + width = raw_width = 6384; + height = raw_height = 4182; } top_margin = (raw_height - height) >> 2 << 1; left_margin = (raw_width - width ) >> 2 << 1; From 22eee9787e4ea5c34d19407d66e1ecaf6197bd16 Mon Sep 17 00:00:00 2001 From: rom9 <4711834+rom9@users.noreply.github.com> Date: Mon, 13 Apr 2020 17:20:56 +0200 Subject: [PATCH 085/109] Film negative stable multipliers (#5485) * Added new feature to calculate channel multipliers from crop area. This also saves the crop area channel medians to the processing profiles, in order to get a more consistent color balance when batch-applying the same profile to multiple pictures from the same film roll. * Fixed wrong initialization of array, and missing check for the result of `getFilmNegativeMedians()`. Moved `ImProcCoordinator::translateCoord()` from private member to anonymous namespace. Fixed some whitespace and formatting issues. * Fixed some formatting issues * Passed `ipf` parameter as const in `translateCoord`. Narrowed `using namespace` to single class `Coord2D`. * Added `scaleGain` entry to thumbnail metadata file, to make `scale_mul` multipliers available in thumbnail processing phase. This simplifies multiplier calculations, so that "faking" thumbnail multipliers in the main image processing is not necessary anymore. This way, output values are immune to slight variations of multipliers between successive shots taken with in-camera AWB turned on. Shifted multipliers so that the output channel medians are balanced when "Camera WB" is selected. This way, just computing multipliers from crop and setting "Camera WB" (which is the default) gives a pretty well balanced image as a starting point. * New channel scaling method, based on a film base color sample instead of crop area channel medians. Channels are scaled so that the converted film base values are equal to 1/512th of the output range (65k). This giver better black levels in the output, and more consistency when batch-processing multiple negatives. The output is now compensated for a known fixed WB value, so that the film base will appear grey when WB is set to 3500K, Green=1. Added PPVERSION 347 to preserve backwards compatibility: when a processing profile saved by RT 5.7 is loaded (PPVERSION=346), the new fields are initialized to the special value -1, which will instruct the main processing to follow the old channel scaling behaviour. The old channel scaling multipliers will then be converted to the new film base values so that the resulting image is the same, and the fields will be overwritten as soon as the PP is saved again. This will transparently upgrade the processing profile. When the new behaviour is used, but the film base values are still unset, they are estimated based on channel medians, excluding a 20% border around the image. This should give a better result out-of-the-box for pictures containing a large film holder. * Code cleanup from review * Run astyle on film neg source files * Fixed automated build failure caused by incompatible libraries on my dev PC. * Simplified `Thumbnail::processFilmNegative` method signature. There is no need to pass in `rmi`,`gmi`,`bmi` multipliers from the caller, i can do the same with my own internal multipliers. * Added `FilmNegListener` class to pass estimeted film base values to the GUI after first processing. Removed old `filmBaseValues` instance variable from RawImageSource. * Code cleanup * Forgot to set baseValues flag in `PartialPasteDlg::applyPaste` Fixed `filmBaseValuesLabel` not updating when reading zero baseValues. Normally not needed (the label is updated later by the listener), but when the user is browsing through pictures the listener won't fire, so the label must be updated to show values are unset. * Overwritten channel scaling multipliers by calling `get_colorsCoeff` with `forceAutoWB=false`. Initially, in `RawImageSource::load`, channels are auto-balanced by averaging the whole picture when computing multipliers. This can give different multipliers for multiple shots of the same camera, which will lead to inconsistent conversions when batch-processing multiple negatives. This commit re-sets `scale_mul`, `ref_pre_mul`, etc., in order to "undo" the auto-WB and use the normal camera multipliers. * Found an easier way to get stable overall multipliers, removed the (horrible) on-the-fly mutation of scaling instance variables. --- rtdata/languages/default | 4 + rtengine/filmnegativeproc.cc | 345 +++++++++++++++++++++++++--------- rtengine/filmnegativethumb.cc | 211 ++++++++++++++++----- rtengine/imagesource.h | 3 +- rtengine/improccoordinator.cc | 51 +++-- rtengine/improccoordinator.h | 7 + rtengine/procparams.cc | 33 +++- rtengine/procparams.h | 4 + rtengine/rawimagesource.h | 3 +- rtengine/rtengine.h | 10 + rtengine/rtthumbnail.cc | 10 +- rtengine/rtthumbnail.h | 3 +- rtengine/simpleprocess.cc | 7 +- rtgui/filmnegative.cc | 164 +++++++++++++--- rtgui/filmnegative.h | 16 +- rtgui/paramsedited.cc | 12 +- rtgui/paramsedited.h | 1 + rtgui/partialpastedlg.cc | 1 + rtgui/ppversion.h | 4 +- rtgui/toolpanelcoord.cc | 6 + rtgui/toolpanelcoord.h | 1 + 21 files changed, 705 insertions(+), 191 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 64af97689..f33608903 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -752,6 +752,7 @@ HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative +HISTORY_MSG_FILMNEGATIVE_FILMBASE;Film base color HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values HISTORY_MSG_HISTMATCHING;Auto-matched tone curve HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries @@ -1693,6 +1694,9 @@ TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Weighted Standard TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points TP_EXPOS_WHITEPOINT_LABEL;Raw White Points TP_FILMNEGATIVE_BLUE;Blue ratio +TP_FILMNEGATIVE_FILMBASE_PICK;Pick film base color +TP_FILMNEGATIVE_FILMBASE_TOOLTIP;Pick a spot of unexposed film (eg. the border between frames), to get the actual film base color values, and save them in the processing profile.\nThis makes it easy to get a more consistent color balance when batch-processing multiple pictures from the same roll.\nAlso use this when the converted image is extremely dark, bright, or color-unbalanced. +TP_FILMNEGATIVE_FILMBASE_VALUES;Film base RGB: TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. TP_FILMNEGATIVE_LABEL;Film Negative diff --git a/rtengine/filmnegativeproc.cc b/rtengine/filmnegativeproc.cc index c7de3c483..6d4fe1ad6 100644 --- a/rtengine/filmnegativeproc.cc +++ b/rtengine/filmnegativeproc.cc @@ -35,6 +35,9 @@ namespace { +using rtengine::ST_BAYER; +using rtengine::ST_FUJI_XTRANS; +using rtengine::settings; bool channelsAvg( const rtengine::RawImage* ri, @@ -43,17 +46,16 @@ bool channelsAvg( const float* cblacksom, rtengine::Coord spotPos, int spotSize, - const rtengine::procparams::FilmNegativeParams& params, std::array& avgs ) { avgs = {}; // Channel averages - if (ri->getSensorType() != rtengine::ST_BAYER && ri->getSensorType() != rtengine::ST_FUJI_XTRANS) { + if (ri->getSensorType() != ST_BAYER && ri->getSensorType() != ST_FUJI_XTRANS) { return false; } - if (rtengine::settings->verbose) { + if (settings->verbose) { printf("Spot coord: x=%d y=%d\n", spotPos.x, spotPos.y); } @@ -69,9 +71,10 @@ bool channelsAvg( } std::array pxCount = {}; // Per-channel sample counts + for (int c = x1; c < x2; ++c) { for (int r = y1; r < y2; ++r) { - const int ch = ri->getSensorType() == rtengine::ST_BAYER ? ri->FC(r,c) : ri->XTRANSFC(r,c); + const int ch = ri->getSensorType() == ST_BAYER ? ri->FC(r, c) : ri->XTRANSFC(r, c); ++pxCount[ch]; @@ -88,6 +91,112 @@ bool channelsAvg( return true; } +void calcMedians( + const rtengine::RawImage* ri, + float** data, + int x1, int y1, int x2, int y2, + std::array& meds +) +{ + + MyTime t1, t2, t3; + t1.set(); + + // Channel vectors to calculate medians + std::array, 3> cvs; + + // Sample one every 5 pixels, and push the value in the appropriate channel vector. + // Choose an odd step, not a multiple of the CFA size, to get a chance to visit each channel. + if (ri->getSensorType() == ST_BAYER) { + for (int row = y1; row < y2; row += 5) { + const int c0 = ri->FC(row, x1 + 0); + const int c1 = ri->FC(row, x1 + 5); + int col = x1; + + for (; col < x2 - 5; col += 10) { + cvs[c0].push_back(data[row][col]); + cvs[c1].push_back(data[row][col + 5]); + } + + if (col < x2) { + cvs[c0].push_back(data[row][col]); + } + } + } else if (ri->getSensorType() == ST_FUJI_XTRANS) { + for (int row = y1; row < y2; row += 5) { + const std::array cs = { + ri->XTRANSFC(row, x1 + 0), + ri->XTRANSFC(row, x1 + 5), + ri->XTRANSFC(row, x1 + 10), + ri->XTRANSFC(row, x1 + 15), + ri->XTRANSFC(row, x1 + 20), + ri->XTRANSFC(row, x1 + 25) + }; + int col = x1; + + for (; col < x2 - 25; col += 30) { + for (int c = 0; c < 6; ++c) { + cvs[cs[c]].push_back(data[row][col + c * 5]); + } + } + + for (int c = 0; col < x2; col += 5, ++c) { + cvs[cs[c]].push_back(data[row][col]); + } + } + } + + t2.set(); + + if (settings->verbose) { + printf("Median vector fill loop time us: %d\n", t2.etime(t1)); + } + + t2.set(); + + for (int c = 0; c < 3; ++c) { + // Find median values for each channel + if (!cvs[c].empty()) { + rtengine::findMinMaxPercentile(cvs[c].data(), cvs[c].size(), 0.5f, meds[c], 0.5f, meds[c], true); + } + } + + t3.set(); + + if (settings->verbose) { + printf("Sample count: R=%zu, G=%zu, B=%zu\n", cvs[0].size(), cvs[1].size(), cvs[2].size()); + printf("Median calc time us: %d\n", t3.etime(t2)); + } + +} + +std::array calcWBMults( + const rtengine::ColorTemp& wb, + const rtengine::ImageMatrices& imatrices, + const rtengine::RawImage *ri, + const float ref_pre_mul[4]) +{ + std::array wb_mul; + double r, g, b; + wb.getMultipliers(r, g, b); + wb_mul[0] = imatrices.cam_rgb[0][0] * r + imatrices.cam_rgb[0][1] * g + imatrices.cam_rgb[0][2] * b; + wb_mul[1] = imatrices.cam_rgb[1][0] * r + imatrices.cam_rgb[1][1] * g + imatrices.cam_rgb[1][2] * b; + wb_mul[2] = imatrices.cam_rgb[2][0] * r + imatrices.cam_rgb[2][1] * g + imatrices.cam_rgb[2][2] * b; + + for (int c = 0; c < 3; ++c) { + wb_mul[c] = ri->get_pre_mul(c) / wb_mul[c] / ref_pre_mul[c]; + } + + // Normalize max channel gain to 1.0 + float mg = rtengine::max(wb_mul[0], wb_mul[1], wb_mul[2]); + + for (int c = 0; c < 3; ++c) { + wb_mul[c] /= mg; + } + + return wb_mul; +} + } bool rtengine::RawImageSource::getFilmNegativeExponents(Coord2D spotA, Coord2D spotB, int tran, const procparams::FilmNegativeParams ¤tParams, std::array& newExps) @@ -104,21 +213,29 @@ bool rtengine::RawImageSource::getFilmNegativeExponents(Coord2D spotA, Coord2D s std::array clearVals; std::array denseVals; + // Get channel averages in the two spots, sampling from the original ri->data buffer. + // NOTE: rawData values might be affected by CA corection, FlatField, etc, so: + // rawData[y][x] == (ri->data[y][x] - cblacksom[c]) * scale_mul[c] + // is not always true. To calculate exponents on the exact values, we should keep + // a copy of the rawData buffer after preprocessing. Worth the memory waste? + // Sample first spot transformPosition(spotA.x, spotA.y, tran, spot.x, spot.y); - if (!channelsAvg(ri, W, H, cblacksom, spot, spotSize, currentParams, clearVals)) { + + if (!channelsAvg(ri, W, H, cblacksom, spot, spotSize, clearVals)) { return false; } // Sample second spot transformPosition(spotB.x, spotB.y, tran, spot.x, spot.y); - if (!channelsAvg(ri, W, H, cblacksom, spot, spotSize, currentParams, denseVals)) { + + if (!channelsAvg(ri, W, H, cblacksom, spot, spotSize, denseVals)) { return false; } // Detect which one is the dense spot, based on green channel if (clearVals[1] < denseVals[1]) { - std::swap(clearVals, denseVals); + std::swap(clearVals, denseVals); } if (settings->verbose) { @@ -152,7 +269,32 @@ bool rtengine::RawImageSource::getFilmNegativeExponents(Coord2D spotA, Coord2D s return true; } -void rtengine::RawImageSource::filmNegativeProcess(const procparams::FilmNegativeParams ¶ms) +bool rtengine::RawImageSource::getRawSpotValues(Coord2D spotCoord, int spotSize, int tran, const procparams::FilmNegativeParams ¶ms, std::array& rawValues) +{ + Coord spot; + transformPosition(spotCoord.x, spotCoord.y, tran, spot.x, spot.y); + + if (settings->verbose) { + printf("Transformed coords: %d,%d\n", spot.x, spot.y); + } + + if (spotSize < 4) { + return false; + } + + // Calculate averages of raw unscaled channels + if (!channelsAvg(ri, W, H, cblacksom, spot, spotSize, rawValues)) { + return false; + } + + if (settings->verbose) { + printf("Raw spot values: R=%g, G=%g, B=%g\n", rawValues[0], rawValues[1], rawValues[2]); + } + + return true; +} + +void rtengine::RawImageSource::filmNegativeProcess(const procparams::FilmNegativeParams ¶ms, std::array& filmBaseValues) { // BENCHFUNMICRO @@ -168,92 +310,114 @@ void rtengine::RawImageSource::filmNegativeProcess(const procparams::FilmNegativ static_cast(-params.blueRatio * params.greenExp) }; - MyTime t1, t2, t3,t4, t5; - - t1.set(); - - // Channel vectors to calculate medians - std::array, 3> cvs; - - // Sample one every 5 pixels, and push the value in the appropriate channel vector. - // Choose an odd step, not a multiple of the CFA size, to get a chance to visit each channel. - if (ri->getSensorType() == ST_BAYER) { - for (int row = 0; row < H; row += 5) { - const int c0 = ri->FC(row, 0); - const int c1 = ri->FC(row, 5); - int col = 0; - for (; col < W - 5; col += 10) { - cvs[c0].push_back(rawData[row][col]); - cvs[c1].push_back(rawData[row][col + 5]); - } - if (col < W) { - cvs[c0].push_back(rawData[row][col]); - } - } - } - else if (ri->getSensorType() == ST_FUJI_XTRANS) { - for (int row = 0; row < H; row += 5) { - const std::array cs = { - ri->XTRANSFC(row, 0), - ri->XTRANSFC(row, 5), - ri->XTRANSFC(row, 10), - ri->XTRANSFC(row, 15), - ri->XTRANSFC(row, 20), - ri->XTRANSFC(row, 25) - }; - int col = 0; - for (; col < W - 25; col += 30) { - for (int c = 0; c < 6; ++c) { - cvs[cs[c]].push_back(rawData[row][col + c * 5]); - } - } - for (int c = 0; col < W; col += 5, ++c) { - cvs[cs[c]].push_back(rawData[row][col]); - } - } - } - constexpr float MAX_OUT_VALUE = 65000.f; - t2.set(); + // Get multipliers for a known, fixed WB setting, that will be the starting point + // for balancing the converted image. + const std::array wb_mul = calcWBMults( + ColorTemp(3500., 1., 1., "Custom"), imatrices, ri, ref_pre_mul); - if (settings->verbose) { - printf("Median vector fill loop time us: %d\n", t2.etime(t1)); + + if (rtengine::settings->verbose) { + printf("Fixed WB mults: %g %g %g\n", wb_mul[0], wb_mul[1], wb_mul[2]); } - t2.set(); + // Compensation factor to restore the non-autoWB initialGain (see RawImageSource::load) + const float autoGainComp = camInitialGain / initialGain; - std::array medians; // Channel median values - std::array mults = { - 1.f, - 1.f, - 1.f - }; // Channel normalization multipliers + std::array mults; // Channel normalization multipliers + + // If film base values are set in params, use those + if (filmBaseValues[0] <= 0.f) { + // ...otherwise, the film negative tool might have just been enabled on this image, + // whithout any previous setting. So, estimate film base values from channel medians + + std::array medians; + + // Special value for backwards compatibility with profiles saved by RT 5.7 + const bool oldChannelScaling = filmBaseValues[0] == -1.f; + + // If using the old channel scaling method, get medians from the whole current image, + // reading values from the already-scaled rawData buffer. + if (oldChannelScaling) { + calcMedians(ri, rawData, 0, 0, W, H, medians); + } else { + // Cut 20% border from medians calculation. It will probably contain outlier values + // from the film holder, which will bias the median result. + const int bW = W * 20 / 100; + const int bH = H * 20 / 100; + calcMedians(ri, rawData, bW, bH, W - bW, H - bH, medians); + } + + // Un-scale rawData medians + for (int c = 0; c < 3; ++c) { + medians[c] /= scale_mul[c]; + } + + if (settings->verbose) { + printf("Channel medians: R=%g, G=%g, B=%g\n", medians[0], medians[1], medians[2]); + } + + for (int c = 0; c < 3; ++c) { + + // Estimate film base values, so that in the output data, each channel + // median will correspond to 1/24th of MAX. + filmBaseValues[c] = pow_F(24.f / 512.f, 1.f / exps[c]) * medians[c]; + + if (oldChannelScaling) { + // If using the old channel scaling method, apply WB multipliers here to undo their + // effect later, since fixed wb compensation was not used in previous version. + // Also, undo the effect of the autoGainComp factor (see below). + filmBaseValues[c] /= pow_F((wb_mul[c] / autoGainComp), 1.f / exps[c]);// / autoGainComp; + } - for (int c = 0; c < 3; ++c) { - // Find median values for each channel - if (!cvs[c].empty()) { - findMinMaxPercentile(cvs[c].data(), cvs[c].size(), 0.5f, medians[c], 0.5f, medians[c], true); - medians[c] = pow_F(rtengine::max(medians[c], 1.f), exps[c]); - // Determine the channel multiplier so that N times the median becomes 65k. This clips away - // the values in the dark border surrounding the negative (due to the film holder, for example), - // the reciprocal of which have blown up to stellar values. - mults[c] = MAX_OUT_VALUE / (medians[c] * 24.f); } } - t3.set(); + + // Calculate multipliers based on previously obtained film base input values. + + // Apply current scaling coefficients to raw, unscaled base values. + std::array fb = { + filmBaseValues[0] * scale_mul[0], + filmBaseValues[1] * scale_mul[1], + filmBaseValues[2] * scale_mul[2] + }; if (settings->verbose) { - printf("Sample count: %zu, %zu, %zu\n", cvs[0].size(), cvs[1].size(), cvs[2].size()); - printf("Medians: %g %g %g\n", static_cast(medians[0]), static_cast(medians[1]), static_cast(medians[2])); - printf("Computed multipliers: %g %g %g\n", static_cast(mults[0]), static_cast(mults[1]), static_cast(mults[2])); - printf("Median calc time us: %d\n", t3.etime(t2)); + printf("Input film base values: %g %g %g\n", fb[0], fb[1], fb[2]); } + for (int c = 0; c < 3; ++c) { + // Apply channel exponents, to obtain the corresponding base values in the output data + fb[c] = pow_F(rtengine::max(fb[c], 1.f), exps[c]); + + // Determine the channel multiplier so that the film base value is 1/512th of max. + mults[c] = (MAX_OUT_VALUE / 512.f) / fb[c]; + + // Un-apply the fixed WB multipliers, to reverse their effect later in the WB tool. + // This way, the output image will be adapted to this fixed WB setting + mults[c] /= wb_mul[c]; + + // Also compensate for the initialGain difference between the default scaling (forceAutoWB=true) + // and the non-autoWB scaling (see camInitialGain). + // This effectively restores camera scaling multipliers, and gives us stable multipliers + // (not depending on image content). + mults[c] *= autoGainComp; + + } + + if (settings->verbose) { + printf("Output film base values: %g %g %g\n", static_cast(fb[0]), static_cast(fb[1]), static_cast(fb[2])); + printf("Computed multipliers: %g %g %g\n", static_cast(mults[0]), static_cast(mults[1]), static_cast(mults[2])); + } + + constexpr float CLIP_VAL = 65535.f; - t3.set(); + MyTime t1, t2, t3; + + t1.set(); if (ri->getSensorType() == ST_BAYER) { #ifdef __SSE2__ @@ -264,6 +428,7 @@ void rtengine::RawImageSource::filmNegativeProcess(const procparams::FilmNegativ #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 16) #endif + for (int row = 0; row < H; ++row) { int col = 0; // Avoid trouble with zeroes, minimum pixel value is 1. @@ -274,14 +439,18 @@ void rtengine::RawImageSource::filmNegativeProcess(const procparams::FilmNegativ #ifdef __SSE2__ const vfloat expsv = _mm_setr_ps(exps0, exps1, exps0, exps1); const vfloat multsv = _mm_setr_ps(mult0, mult1, mult0, mult1); + for (; col < W - 3; col += 4) { STVFU(rawData[row][col], vminf(multsv * pow_F(vmaxf(LVFU(rawData[row][col]), onev), expsv), clipv)); } + #endif // __SSE2__ + for (; col < W - 1; col += 2) { rawData[row][col] = rtengine::min(mult0 * pow_F(rtengine::max(rawData[row][col], 1.f), exps0), CLIP_VAL); rawData[row][col + 1] = rtengine::min(mult1 * pow_F(rtengine::max(rawData[row][col + 1], 1.f), exps1), CLIP_VAL); } + if (col < W) { rawData[row][col] = rtengine::min(mult0 * pow_F(rtengine::max(rawData[row][col], 1.f), exps0), CLIP_VAL); } @@ -295,6 +464,7 @@ void rtengine::RawImageSource::filmNegativeProcess(const procparams::FilmNegativ #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 16) #endif + for (int row = 0; row < H; row ++) { int col = 0; // Avoid trouble with zeroes, minimum pixel value is 1. @@ -321,30 +491,34 @@ void rtengine::RawImageSource::filmNegativeProcess(const procparams::FilmNegativ const vfloat multsv0 = _mm_setr_ps(multsc[0], multsc[1], multsc[2], multsc[3]); const vfloat multsv1 = _mm_setr_ps(multsc[4], multsc[5], multsc[0], multsc[1]); const vfloat multsv2 = _mm_setr_ps(multsc[2], multsc[3], multsc[4], multsc[5]); + for (; col < W - 11; col += 12) { STVFU(rawData[row][col], vminf(multsv0 * pow_F(vmaxf(LVFU(rawData[row][col]), onev), expsv0), clipv)); STVFU(rawData[row][col + 4], vminf(multsv1 * pow_F(vmaxf(LVFU(rawData[row][col + 4]), onev), expsv1), clipv)); STVFU(rawData[row][col + 8], vminf(multsv2 * pow_F(vmaxf(LVFU(rawData[row][col + 8]), onev), expsv2), clipv)); } + #endif // __SSE2__ + for (; col < W - 5; col += 6) { for (int c = 0; c < 6; ++c) { rawData[row][col + c] = rtengine::min(multsc[c] * pow_F(rtengine::max(rawData[row][col + c], 1.f), expsc[c]), CLIP_VAL); } } + for (int c = 0; col < W; col++, c++) { rawData[row][col + c] = rtengine::min(multsc[c] * pow_F(rtengine::max(rawData[row][col + c], 1.f), expsc[c]), CLIP_VAL); } } } - t4.set(); + t2.set(); if (settings->verbose) { - printf("Pow loop time us: %d\n", t4.etime(t3)); + printf("Pow loop time us: %d\n", t2.etime(t1)); } - t4.set(); + t2.set(); PixelsMap bitmapBads(W, H); @@ -354,6 +528,7 @@ void rtengine::RawImageSource::filmNegativeProcess(const procparams::FilmNegativ #ifdef _OPENMP #pragma omp parallel for reduction(+:totBP) schedule(dynamic,16) #endif + for (int i = 0; i < H; ++i) { for (int j = 0; j < W; ++j) { if (rawData[i][j] >= MAX_OUT_VALUE) { @@ -367,11 +542,11 @@ void rtengine::RawImageSource::filmNegativeProcess(const procparams::FilmNegativ interpolateBadPixelsBayer(bitmapBads, rawData); } - } - else if (ri->getSensorType() == ST_FUJI_XTRANS) { + } else if (ri->getSensorType() == ST_FUJI_XTRANS) { #ifdef _OPENMP #pragma omp parallel for reduction(+:totBP) schedule(dynamic,16) #endif + for (int i = 0; i < H; ++i) { for (int j = 0; j < W; ++j) { if (rawData[i][j] >= MAX_OUT_VALUE) { @@ -386,10 +561,10 @@ void rtengine::RawImageSource::filmNegativeProcess(const procparams::FilmNegativ } } - t5.set(); + t3.set(); if (settings->verbose) { printf("Bad pixels count: %d\n", totBP); - printf("Bad pixels interpolation time us: %d\n", t5.etime(t4)); + printf("Bad pixels interpolation time us: %d\n", t3.etime(t2)); } } diff --git a/rtengine/filmnegativethumb.cc b/rtengine/filmnegativethumb.cc index 003fab8e0..57f2601f9 100644 --- a/rtengine/filmnegativethumb.cc +++ b/rtengine/filmnegativethumb.cc @@ -18,6 +18,7 @@ */ #include +#include "colortemp.h" #include "LUT.h" #include "rtengine.h" #include "rtthumbnail.h" @@ -29,70 +30,179 @@ #define BENCHMARK #include "StopWatch.h" +namespace +{ + +using rtengine::Imagefloat; +using rtengine::findMinMaxPercentile; + + +void calcMedians( + const Imagefloat* baseImg, + const int x1, const int y1, + const int x2, const int y2, + float &rmed, float &gmed, float &bmed +) +{ + // Channel vectors to calculate medians + std::vector rv, gv, bv; + + const int sz = std::max(0, (y2 - y1) * (x2 - x1)); + rv.reserve(sz); + gv.reserve(sz); + bv.reserve(sz); + + for (int i = y1; i < y2; i++) { + for (int j = x1; j < x2; j++) { + rv.push_back(baseImg->r(i, j)); + gv.push_back(baseImg->g(i, j)); + bv.push_back(baseImg->b(i, j)); + } + } + + // Calculate channel medians from whole image + findMinMaxPercentile(rv.data(), rv.size(), 0.5f, rmed, 0.5f, rmed, true); + findMinMaxPercentile(gv.data(), gv.size(), 0.5f, gmed, 0.5f, gmed, true); + findMinMaxPercentile(bv.data(), bv.size(), 0.5f, bmed, 0.5f, bmed, true); +} + +} + void rtengine::Thumbnail::processFilmNegative( const procparams::ProcParams ¶ms, const Imagefloat* baseImg, - const int rwidth, const int rheight, - float &rmi, float &gmi, float &bmi -) { + const int rwidth, const int rheight +) +{ // Channel exponents const float rexp = -params.filmNegative.redRatio * params.filmNegative.greenExp; const float gexp = -params.filmNegative.greenExp; const float bexp = -params.filmNegative.blueRatio * params.filmNegative.greenExp; - // Need to calculate channel averages, to fake the same conditions - // found in rawimagesource, where get_ColorsCoeff is called with - // forceAutoWB=true. - float rsum = 0.f, gsum = 0.f, bsum = 0.f; - - // Channel vectors to calculate medians - std::vector rv, gv, bv; - - for (int i = 0; i < rheight; i++) { - for (int j = 0; j < rwidth; j++) { - const float r = baseImg->r(i, j); - const float g = baseImg->g(i, j); - const float b = baseImg->b(i, j); - - rsum += r; - gsum += g; - bsum += b; - - rv.push_back(r); - gv.push_back(g); - bv.push_back(b); - } - } - - const float ravg = rsum / (rheight*rwidth); - const float gavg = gsum / (rheight*rwidth); - const float bavg = bsum / (rheight*rwidth); - - // Shifting current WB multipliers, based on channel averages. - rmi /= (gavg/ravg); - // gmi /= (gAvg/gAvg); green chosen as reference channel - bmi /= (gavg/bavg); - - float rmed, gmed, bmed; - findMinMaxPercentile(rv.data(), rv.size(), 0.5f, rmed, 0.5f, rmed, true); - findMinMaxPercentile(gv.data(), gv.size(), 0.5f, gmed, 0.5f, gmed, true); - findMinMaxPercentile(bv.data(), bv.size(), 0.5f, bmed, 0.5f, bmed, true); - - rmed = powf(rmed, rexp); - gmed = powf(gmed, gexp); - bmed = powf(bmed, bexp); + // Calculate output multipliers + float rmult, gmult, bmult; const float MAX_OUT_VALUE = 65000.f; - const float rmult = (MAX_OUT_VALUE / (rmed * 24)) ; - const float gmult = (MAX_OUT_VALUE / (gmed * 24)) ; - const float bmult = (MAX_OUT_VALUE / (bmed * 24)) ; + + // For backwards compatibility with profiles saved by RT 5.7 + const bool oldChannelScaling = params.filmNegative.redBase == -1.f; + + // If the film base values are not set in params, estimate multipliers from each channel's median value. + if (params.filmNegative.redBase <= 0.f) { + + // Channel medians + float rmed, gmed, bmed; + + if (oldChannelScaling) { + // If using the old method, calculate nedians on the whole image + calcMedians(baseImg, 0, 0, rwidth, rheight, rmed, gmed, bmed); + } else { + // The new method cuts out a 20% border from medians calculation. + const int bW = rwidth * 20 / 100; + const int bH = rheight * 20 / 100; + calcMedians(baseImg, bW, bH, rwidth - bW, rheight - bH, rmed, gmed, bmed); + } + + if (settings->verbose) { + printf("Thumbnail input channel medians: %g %g %g\n", rmed, gmed, bmed); + } + + // Calculate output medians + rmed = powf(rmed, rexp); + gmed = powf(gmed, gexp); + bmed = powf(bmed, bexp); + + // Calculate output multipliers so that the median value is 1/24 of the output range. + rmult = (MAX_OUT_VALUE / 24.f) / rmed; + gmult = (MAX_OUT_VALUE / 24.f) / gmed; + bmult = (MAX_OUT_VALUE / 24.f) / bmed; + + } else { + + // Read film-base values from params + float rbase = params.filmNegative.redBase; + float gbase = params.filmNegative.greenBase; + float bbase = params.filmNegative.blueBase; + + // Reconstruct scale_mul coefficients from thumbnail metadata: + // redMultiplier / camwbRed is pre_mul[0] + // pre_mul[0] * scaleGain is scale_mul[0] + // Apply channel scaling to raw (unscaled) input base values, to + // match with actual (scaled) data in baseImg + rbase *= (redMultiplier / camwbRed) * scaleGain; + gbase *= (greenMultiplier / camwbGreen) * scaleGain; + bbase *= (blueMultiplier / camwbBlue) * scaleGain; + + if (settings->verbose) { + printf("Thumbnail input film base values: %g %g %g\n", rbase, gbase, bbase); + } + + // Apply exponents to get output film base values + rbase = powf(rbase, rexp); + gbase = powf(gbase, gexp); + bbase = powf(bbase, bexp); + + if (settings->verbose) { + printf("Thumbnail output film base values: %g %g %g\n", rbase, gbase, bbase); + } + + // Calculate multipliers so that film base value is 1/512th of the output range. + rmult = (MAX_OUT_VALUE / 512.f) / rbase; + gmult = (MAX_OUT_VALUE / 512.f) / gbase; + bmult = (MAX_OUT_VALUE / 512.f) / bbase; + + } + + + if (oldChannelScaling) { + // Need to calculate channel averages, to fake the same conditions + // found in rawimagesource, where get_ColorsCoeff is called with + // forceAutoWB=true. + float rsum = 0.f, gsum = 0.f, bsum = 0.f; + + for (int i = 0; i < rheight; i++) { + for (int j = 0; j < rwidth; j++) { + rsum += baseImg->r(i, j); + gsum += baseImg->g(i, j); + bsum += baseImg->b(i, j); + } + } + + const float ravg = rsum / (rheight * rwidth); + const float gavg = gsum / (rheight * rwidth); + const float bavg = bsum / (rheight * rwidth); + + // Shifting current WB multipliers, based on channel averages. + rmult /= gavg / ravg; + // gmult /= gAvg / gAvg; green chosen as reference channel + bmult /= gavg / bavg; + + } else { + + // Get and un-apply multipliers to adapt the thumbnail to a known fixed WB setting, + // as in the main image processing. + + double r, g, b; + ColorTemp(3500., 1., 1., "Custom").getMultipliers(r, g, b); + //iColorMatrix is cam_rgb + const double rm = camwbRed / (iColorMatrix[0][0] * r + iColorMatrix[0][1] * g + iColorMatrix[0][2] * b); + const double gm = camwbGreen / (iColorMatrix[1][0] * r + iColorMatrix[1][1] * g + iColorMatrix[1][2] * b); + const double bm = camwbBlue / (iColorMatrix[2][0] * r + iColorMatrix[2][1] * g + iColorMatrix[2][2] * b); + + // Normalize max WB multiplier to 1.f + const double m = max(rm, gm, bm); + rmult /= rm / m; + gmult /= gm / m; + bmult /= bm / m; + } + if (settings->verbose) { - printf("Thumbnail channel medians: %g %g %g\n", static_cast(rmed), static_cast(gmed), static_cast(bmed)); printf("Thumbnail computed multipliers: %g %g %g\n", static_cast(rmult), static_cast(gmult), static_cast(bmult)); } + #ifdef __SSE2__ const vfloat clipv = F2V(MAXVALF); const vfloat rexpv = F2V(rexp); @@ -109,12 +219,15 @@ void rtengine::Thumbnail::processFilmNegative( float *bline = baseImg->b(i); int j = 0; #ifdef __SSE2__ - for (; j < rwidth - 3; j +=4) { + + for (; j < rwidth - 3; j += 4) { STVFU(rline[j], vminf(rmultv * pow_F(LVFU(rline[j]), rexpv), clipv)); STVFU(gline[j], vminf(gmultv * pow_F(LVFU(gline[j]), gexpv), clipv)); STVFU(bline[j], vminf(bmultv * pow_F(LVFU(bline[j]), bexpv), clipv)); } + #endif + for (; j < rwidth; ++j) { rline[j] = CLIP(rmult * pow_F(rline[j], rexp)); gline[j] = CLIP(gmult * pow_F(gline[j], gexp)); diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index d1008837d..ea049d37c 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -92,8 +92,9 @@ public: ~ImageSource () override {} virtual int load (const Glib::ustring &fname) = 0; virtual void preprocess (const procparams::RAWParams &raw, const procparams::LensProfParams &lensProf, const procparams::CoarseTransformParams& coarse, bool prepareDenoise = true) {}; - virtual void filmNegativeProcess (const procparams::FilmNegativeParams ¶ms) {}; + virtual void filmNegativeProcess (const procparams::FilmNegativeParams ¶ms, std::array& filmBaseValues) {}; virtual bool getFilmNegativeExponents (Coord2D spotA, Coord2D spotB, int tran, const procparams::FilmNegativeParams& currentParams, std::array& newExps) { return false; }; + virtual bool getRawSpotValues (Coord2D spot, int spotSize, int tran, const procparams::FilmNegativeParams ¶ms, std::array& rawValues) { return false; }; virtual void demosaic (const procparams::RAWParams &raw, bool autoContrast, double &contrastThreshold, bool cache = false) {}; virtual void retinex (const procparams::ColorManagementParams& cmp, const procparams::RetinexParams &deh, const procparams::ToneCurveParams& Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) {}; virtual void retinexPrepareCurves (const procparams::RetinexParams &retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI) {}; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 6374cb837..f68616b96 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -44,6 +44,22 @@ #include #endif +namespace +{ +using rtengine::Coord2D; +Coord2D translateCoord(const rtengine::ImProcFunctions& ipf, int fw, int fh, int x, int y) { + + const std::vector points = {Coord2D(x, y)}; + + std::vector red; + std::vector green; + std::vector blue; + ipf.transCoord(fw, fh, points, red, green, blue); + + return green[0]; +} + +} namespace rtengine { @@ -300,7 +316,15 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) ) && params->filmNegative.enabled ) { - imgsrc->filmNegativeProcess(params->filmNegative); + std::array filmBaseValues = { + static_cast(params->filmNegative.redBase), + static_cast(params->filmNegative.greenBase), + static_cast(params->filmNegative.blueBase) + }; + imgsrc->filmNegativeProcess(params->filmNegative, filmBaseValues); + if (filmNegListener && params->filmNegative.redBase <= 0.f) { + filmNegListener->filmBaseValuesChanged(filmBaseValues); + } } } @@ -1481,27 +1505,22 @@ bool ImProcCoordinator::getFilmNegativeExponents(int xA, int yA, int xB, int yB, { MyMutex::MyLock lock(mProcessing); - const auto xlate = - [this](int x, int y) -> Coord2D - { - const std::vector points = {Coord2D(x, y)}; - - std::vector red; - std::vector green; - std::vector blue; - ipf.transCoord(fw, fh, points, red, green, blue); - - return green[0]; - }; - const int tr = getCoarseBitMask(params->coarse); - const Coord2D p1 = xlate(xA, yA); - const Coord2D p2 = xlate(xB, yB); + const Coord2D p1 = translateCoord(ipf, fw, fh, xA, yA); + const Coord2D p2 = translateCoord(ipf, fw, fh, xB, yB); return imgsrc->getFilmNegativeExponents(p1, p2, tr, params->filmNegative, newExps); } +bool ImProcCoordinator::getRawSpotValues(int x, int y, int spotSize, std::array& rawValues) +{ + MyMutex::MyLock lock(mProcessing); + + return imgsrc->getRawSpotValues(translateCoord(ipf, fw, fh, x, y), spotSize, + getCoarseBitMask(params->coarse), params->filmNegative, rawValues); +} + void ImProcCoordinator::getAutoCrop(double ratio, int &x, int &y, int &w, int &h) { diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index d7d6052e9..e17d88183 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -175,6 +175,7 @@ protected: AutoRadiusListener *pdSharpenAutoRadiusListener; FrameCountListener *frameCountListener; ImageTypeListener *imageTypeListener; + FilmNegListener *filmNegListener; AutoColorTonListener* actListener; AutoChromaListener* adnListener; @@ -281,6 +282,7 @@ public: void getCamWB (double& temp, double& green) override; void getSpotWB (int x, int y, int rectSize, double& temp, double& green) override; bool getFilmNegativeExponents(int xA, int yA, int xB, int yB, std::array& newExps) override; + bool getRawSpotValues(int x, int y, int spotSize, std::array& rawValues) override; void getAutoCrop (double ratio, int &x, int &y, int &w, int &h) override; bool getHighQualComputed() override; void setHighQualComputed() override; @@ -389,6 +391,11 @@ public: imageTypeListener = itl; } + void setFilmNegListener (FilmNegListener* fnl) override + { + filmNegListener = fnl; + } + void saveInputICCReference (const Glib::ustring& fname, bool apply_wb) override; InitialImage* getInitialImage () override diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index b02f1970c..a198a6813 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2890,7 +2890,10 @@ FilmNegativeParams::FilmNegativeParams() : enabled(false), redRatio(1.36), greenExp(1.5), - blueRatio(0.86) + blueRatio(0.86), + redBase(0), + greenBase(0), + blueBase(0) { } @@ -2898,9 +2901,12 @@ bool FilmNegativeParams::operator ==(const FilmNegativeParams& other) const { return enabled == other.enabled - && redRatio == other.redRatio + && redRatio == other.redRatio && greenExp == other.greenExp - && blueRatio == other.blueRatio; + && blueRatio == other.blueRatio + && redBase == other.redBase + && greenBase == other.greenBase + && blueBase == other.blueBase; } bool FilmNegativeParams::operator !=(const FilmNegativeParams& other) const @@ -3789,6 +3795,9 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->filmNegative.redRatio, "Film Negative", "RedRatio", filmNegative.redRatio, keyFile); saveToKeyfile(!pedited || pedited->filmNegative.greenExp, "Film Negative", "GreenExponent", filmNegative.greenExp, keyFile); saveToKeyfile(!pedited || pedited->filmNegative.blueRatio, "Film Negative", "BlueRatio", filmNegative.blueRatio, keyFile); + saveToKeyfile(!pedited || pedited->filmNegative.baseValues, "Film Negative", "RedBase", filmNegative.redBase, keyFile); + saveToKeyfile(!pedited || pedited->filmNegative.baseValues, "Film Negative", "GreenBase", filmNegative.greenBase, keyFile); + saveToKeyfile(!pedited || pedited->filmNegative.baseValues, "Film Negative", "BlueBase", filmNegative.blueBase, keyFile); // EXIF change list if (!pedited || pedited->exif) { @@ -5386,6 +5395,24 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Film Negative", "RedRatio", pedited, filmNegative.redRatio, pedited->filmNegative.redRatio); assignFromKeyfile(keyFile, "Film Negative", "GreenExponent", pedited, filmNegative.greenExp, pedited->filmNegative.greenExp); assignFromKeyfile(keyFile, "Film Negative", "BlueRatio", pedited, filmNegative.blueRatio, pedited->filmNegative.blueRatio); + if (ppVersion >= 347) { + bool r, g, b; + assignFromKeyfile(keyFile, "Film Negative", "RedBase", pedited, filmNegative.redBase, r); + assignFromKeyfile(keyFile, "Film Negative", "GreenBase", pedited, filmNegative.greenBase, g); + assignFromKeyfile(keyFile, "Film Negative", "BlueBase", pedited, filmNegative.blueBase, b); + if (pedited) { + pedited->filmNegative.baseValues = r || g || b; + } + } else { + // Backwards compatibility with film negative in RT 5.7: use special film base value -1, + // to signal that the old channel scaling method should be used. + filmNegative.redBase = -1.f; + filmNegative.greenBase = -1.f; + filmNegative.blueBase = -1.f; + if (pedited) { + pedited->filmNegative.baseValues = true; + } + } } if (keyFile.has_group("MetaData")) { diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 4e2b0c275..f9710b01d 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1559,6 +1559,10 @@ struct FilmNegativeParams { double greenExp; double blueRatio; + double redBase; + double greenBase; + double blueBase; + FilmNegativeParams(); bool operator ==(const FilmNegativeParams& other) const; diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 71478fbed..770c18ae3 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -124,8 +124,9 @@ public: int load(const Glib::ustring &fname) override { return load(fname, false); } int load(const Glib::ustring &fname, bool firstFrameOnly); void preprocess (const procparams::RAWParams &raw, const procparams::LensProfParams &lensProf, const procparams::CoarseTransformParams& coarse, bool prepareDenoise = true) override; - void filmNegativeProcess (const procparams::FilmNegativeParams ¶ms) override; + void filmNegativeProcess (const procparams::FilmNegativeParams ¶ms, std::array& filmBaseValues) override; bool getFilmNegativeExponents (Coord2D spotA, Coord2D spotB, int tran, const procparams::FilmNegativeParams ¤tParams, std::array& newExps) override; + bool getRawSpotValues(Coord2D spot, int spotSize, int tran, const procparams::FilmNegativeParams ¶ms, std::array& rawValues) override; void demosaic (const procparams::RAWParams &raw, bool autoContrast, double &contrastThreshold, bool cache = false) override; void retinex (const procparams::ColorManagementParams& cmp, const procparams::RetinexParams &deh, const procparams::ToneCurveParams& Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) override; void retinexPrepareCurves (const procparams::RetinexParams &retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI) override; diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index e6074d50b..028cedec9 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -439,6 +439,13 @@ public: }; +class FilmNegListener +{ +public: + virtual ~FilmNegListener() = default; + virtual void filmBaseValuesChanged(std::array rgb) = 0; +}; + /** This class represents a detailed part of the image (looking through a kind of window). * It can be created and destroyed with the appropriate members of StagedImageProcessor. * Several crops can be assigned to the same image. */ @@ -524,6 +531,8 @@ public: virtual void getCamWB (double& temp, double& green) = 0; virtual void getSpotWB (int x, int y, int rectSize, double& temp, double& green) = 0; virtual bool getFilmNegativeExponents(int xA, int yA, int xB, int yB, std::array& newExps) = 0; + virtual bool getRawSpotValues (int x, int y, int spotSize, std::array& rawValues) = 0; + virtual void getAutoCrop (double ratio, int &x, int &y, int &w, int &h) = 0; virtual void saveInputICCReference (const Glib::ustring& fname, bool apply_wb) = 0; @@ -548,6 +557,7 @@ public: virtual void setRetinexListener (RetinexListener* l) = 0; virtual void setWaveletListener (WaveletListener* l) = 0; virtual void setImageTypeListener (ImageTypeListener* l) = 0; + virtual void setFilmNegListener (FilmNegListener* l) = 0; virtual void setMonitorProfile (const Glib::ustring& monitorProfile, RenderingIntent intent) = 0; virtual void getMonitorProfile (Glib::ustring& monitorProfile, RenderingIntent& intent) const = 0; diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index a063d965b..e8126be36 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -594,6 +594,8 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati tpp->defGain = max (scale_mul[0], scale_mul[1], scale_mul[2], scale_mul[3]) / min (scale_mul[0], scale_mul[1], scale_mul[2], scale_mul[3]); tpp->defGain *= std::pow(2, ri->getBaselineExposure()); + tpp->scaleGain = scale_mul[0] / pre_mul[0]; // used to reconstruct scale_mul from filmnegativethumb.cc + tpp->gammaCorrected = true; unsigned filter = ri->get_filters(); @@ -1042,6 +1044,7 @@ Thumbnail::Thumbnail () : scaleForSave (8192), gammaCorrected (false), colorMatrix{}, + scaleGain (1.0), isRaw (true) { } @@ -1179,7 +1182,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT Imagefloat* baseImg = resizeTo (rwidth, rheight, interp, thumbImg); if (isRaw && params.filmNegative.enabled) { - processFilmNegative(params, baseImg, rwidth, rheight, rmi, gmi, bmi); + processFilmNegative(params, baseImg, rwidth, rheight); } if (params.coarse.rotate) { @@ -2122,6 +2125,10 @@ bool Thumbnail::readData (const Glib::ustring& fname) colorMatrix[i][j] = cm[ix++]; } } + + if (keyFile.has_key ("LiveThumbData", "ScaleGain")) { + scaleGain = keyFile.get_double ("LiveThumbData", "ScaleGain"); + } } return true; @@ -2173,6 +2180,7 @@ bool Thumbnail::writeData (const Glib::ustring& fname) keyFile.set_boolean ("LiveThumbData", "GammaCorrected", gammaCorrected); Glib::ArrayHandle cm ((double*)colorMatrix, 9, Glib::OWNERSHIP_NONE); keyFile.set_double_list ("LiveThumbData", "ColorMatrix", cm); + keyFile.set_double ("LiveThumbData", "ScaleGain", scaleGain); keyData = keyFile.to_data (); diff --git a/rtengine/rtthumbnail.h b/rtengine/rtthumbnail.h index ccca1c582..a0033d35f 100644 --- a/rtengine/rtthumbnail.h +++ b/rtengine/rtthumbnail.h @@ -75,8 +75,9 @@ class Thumbnail int scaleForSave; bool gammaCorrected; double colorMatrix[3][3]; + double scaleGain; - void processFilmNegative(const procparams::ProcParams& params, const Imagefloat* baseImg, int rwidth, int rheight, float &rmi, float &gmi, float &bmi); + void processFilmNegative(const procparams::ProcParams& params, const Imagefloat* baseImg, int rwidth, int rheight); public: diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 14df16550..14a594ac2 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -221,7 +221,12 @@ private: // After preprocess, run film negative processing if enabled if ((imgsrc->getSensorType() == ST_BAYER || (imgsrc->getSensorType() == ST_FUJI_XTRANS)) && params.filmNegative.enabled) { - imgsrc->filmNegativeProcess (params.filmNegative); + std::array filmBaseValues = { + static_cast(params.filmNegative.redBase), + static_cast(params.filmNegative.greenBase), + static_cast(params.filmNegative.blueBase) + }; + imgsrc->filmNegativeProcess (params.filmNegative, filmBaseValues); } if (pl) { diff --git a/rtgui/filmnegative.cc b/rtgui/filmnegative.cc index 90cedf148..1b105a3ec 100644 --- a/rtgui/filmnegative.cc +++ b/rtgui/filmnegative.cc @@ -44,6 +44,17 @@ Adjuster* createExponentAdjuster(AdjusterListener* listener, const Glib::ustring return adj; } +Glib::ustring formatBaseValues(const std::array& rgb) +{ + if (rgb[0] <= 0.f && rgb[1] <= 0.f && rgb[2] <= 0.f) { + return "- - -"; + } else { + return Glib::ustring::format(std::fixed, std::setprecision(1), rgb[0]) + " " + + Glib::ustring::format(std::fixed, std::setprecision(1), rgb[1]) + " " + + Glib::ustring::format(std::fixed, std::setprecision(1), rgb[2]); + } +} + } FilmNegative::FilmNegative() : @@ -51,12 +62,17 @@ FilmNegative::FilmNegative() : EditSubscriber(ET_OBJECTS), evFilmNegativeExponents(ProcEventMapper::getInstance()->newEvent(FIRST, "HISTORY_MSG_FILMNEGATIVE_VALUES")), evFilmNegativeEnabled(ProcEventMapper::getInstance()->newEvent(FIRST, "HISTORY_MSG_FILMNEGATIVE_ENABLED")), + evFilmBaseValues(ProcEventMapper::getInstance()->newEvent(FIRST, "HISTORY_MSG_FILMNEGATIVE_FILMBASE")), + filmBaseValues({0.f, 0.f, 0.f}), fnp(nullptr), greenExp(createExponentAdjuster(this, M("TP_FILMNEGATIVE_GREEN"), 0.3, 4, 1.5)), // master exponent (green channel) redRatio(createExponentAdjuster(this, M("TP_FILMNEGATIVE_RED"), 0.3, 3, (2.04 / 1.5))), // ratio of red exponent to master exponent blueRatio(createExponentAdjuster(this, M("TP_FILMNEGATIVE_BLUE"), 0.3, 3, (1.29 / 1.5))), // ratio of blue exponent to master exponent spotgrid(Gtk::manage(new Gtk::Grid())), - spotbutton(Gtk::manage(new Gtk::ToggleButton(M("TP_FILMNEGATIVE_PICK")))) + spotbutton(Gtk::manage(new Gtk::ToggleButton(M("TP_FILMNEGATIVE_PICK")))), + filmBaseLabel(Gtk::manage(new Gtk::Label(M("TP_FILMNEGATIVE_FILMBASE_VALUES"), Gtk::ALIGN_START))), + filmBaseValuesLabel(Gtk::manage(new Gtk::Label("- - -"))), + filmBaseSpotButton(Gtk::manage(new Gtk::ToggleButton(M("TP_FILMNEGATIVE_FILMBASE_PICK")))) { spotgrid->get_style_context()->add_class("grid-spacing"); setExpandAlignProperties(spotgrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); @@ -64,7 +80,10 @@ FilmNegative::FilmNegative() : setExpandAlignProperties(spotbutton, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); spotbutton->get_style_context()->add_class("independent"); spotbutton->set_tooltip_text(M("TP_FILMNEGATIVE_GUESS_TOOLTIP")); - spotbutton->set_image (*Gtk::manage (new RTImage ("color-picker-small.png"))); + spotbutton->set_image(*Gtk::manage(new RTImage("color-picker-small.png"))); + + filmBaseSpotButton->set_tooltip_text(M("TP_FILMNEGATIVE_FILMBASE_TOOLTIP")); + setExpandAlignProperties(filmBaseValuesLabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); // TODO make spot size configurable ? @@ -81,7 +100,7 @@ FilmNegative::FilmNegative() : // spotsize->set_active(0); // spotsize->append ("4"); - spotgrid->attach (*spotbutton, 0, 1, 1, 1); + spotgrid->attach(*spotbutton, 0, 1, 1, 1); // spotgrid->attach (*slab, 1, 0, 1, 1); // spotgrid->attach (*wbsizehelper, 2, 0, 1, 1); @@ -90,13 +109,26 @@ FilmNegative::FilmNegative() : pack_start(*blueRatio, Gtk::PACK_SHRINK, 0); pack_start(*spotgrid, Gtk::PACK_SHRINK, 0); + Gtk::HSeparator* const sep = Gtk::manage(new Gtk::HSeparator()); + sep->get_style_context()->add_class("grid-row-separator"); + pack_start(*sep, Gtk::PACK_SHRINK, 0); + + Gtk::Grid* const fbGrid = Gtk::manage(new Gtk::Grid()); + fbGrid->attach(*filmBaseLabel, 0, 0, 1, 1); + fbGrid->attach(*filmBaseValuesLabel, 1, 0, 1, 1); + pack_start(*fbGrid, Gtk::PACK_SHRINK, 0); + + pack_start(*filmBaseSpotButton, Gtk::PACK_SHRINK, 0); + spotbutton->signal_toggled().connect(sigc::mem_fun(*this, &FilmNegative::editToggled)); // spotsize->signal_changed().connect( sigc::mem_fun(*this, &WhiteBalance::spotSizeChanged) ); + filmBaseSpotButton->signal_toggled().connect(sigc::mem_fun(*this, &FilmNegative::baseSpotToggled)); + // Editing geometry; create the spot rectangle Rectangle* const spotRect = new Rectangle(); spotRect->filled = false; - + visibleGeometry.push_back(spotRect); // Stick a dummy rectangle over the whole image in mouseOverGeometry. @@ -134,6 +166,14 @@ void FilmNegative::read(const rtengine::procparams::ProcParams* pp, const Params greenExp->setValue(pp->filmNegative.greenExp); blueRatio->setValue(pp->filmNegative.blueRatio); + filmBaseValues[0] = pp->filmNegative.redBase; + filmBaseValues[1] = pp->filmNegative.greenBase; + filmBaseValues[2] = pp->filmNegative.blueBase; + + // If base values are not set in params, estimated values will be passed in later + // (after processing) via FilmNegListener + filmBaseValuesLabel->set_text(formatBaseValues(filmBaseValues)); + enableListener(); } @@ -142,14 +182,23 @@ void FilmNegative::write(rtengine::procparams::ProcParams* pp, ParamsEdited* ped pp->filmNegative.redRatio = redRatio->getValue(); pp->filmNegative.greenExp = greenExp->getValue(); pp->filmNegative.blueRatio = blueRatio->getValue(); + pp->filmNegative.enabled = getEnabled(); if (pedited) { pedited->filmNegative.redRatio = redRatio->getEditedState(); pedited->filmNegative.greenExp = greenExp->getEditedState(); pedited->filmNegative.blueRatio = blueRatio->getEditedState(); + pedited->filmNegative.baseValues = filmBaseValues[0] != pp->filmNegative.redBase + || filmBaseValues[1] != pp->filmNegative.greenBase + || filmBaseValues[2] != pp->filmNegative.blueBase; pedited->filmNegative.enabled = !get_inconsistent(); } + + pp->filmNegative.redBase = filmBaseValues[0]; + pp->filmNegative.greenBase = filmBaseValues[1]; + pp->filmNegative.blueBase = filmBaseValues[2]; + } void FilmNegative::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) @@ -172,8 +221,8 @@ void FilmNegative::setDefaults(const rtengine::procparams::ProcParams* defParams void FilmNegative::setBatchMode(bool batchMode) { if (batchMode) { - spotConn.disconnect(); removeIfThere(this, spotgrid, false); + removeIfThere(this, filmBaseSpotButton, false); ToolPanel::setBatchMode(batchMode); redRatio->showEditedCB(); greenExp->showEditedCB(); @@ -205,16 +254,20 @@ void FilmNegative::enabledChanged() if (listener) { if (get_inconsistent()) { listener->panelChanged(evFilmNegativeEnabled, M("GENERAL_UNCHANGED")); - } - else if (getEnabled()) { + } else if (getEnabled()) { listener->panelChanged(evFilmNegativeEnabled, M("GENERAL_ENABLED")); - } - else { + } else { listener->panelChanged(evFilmNegativeEnabled, M("GENERAL_DISABLED")); } } } +void FilmNegative::filmBaseValuesChanged(std::array rgb) +{ + filmBaseValues = rgb; + filmBaseValuesLabel->set_text(formatBaseValues(filmBaseValues)); +} + void FilmNegative::setFilmNegProvider(FilmNegProvider* provider) { fnp = provider; @@ -227,7 +280,7 @@ void FilmNegative::setEditProvider(EditDataProvider* provider) CursorShape FilmNegative::getCursor(int objectID) const { - return CSSpotWB; + return CSSpotWB; } bool FilmNegative::mouseOver(int modifierKey) @@ -246,31 +299,57 @@ bool FilmNegative::button1Pressed(int modifierKey) EditSubscriber::action = EditSubscriber::Action::NONE; if (listener) { - refSpotCoords.push_back(provider->posImage); + if (spotbutton->get_active()) { - if (refSpotCoords.size() == 2) { - // User has selected 2 reference gray spots. Calculating new exponents - // from channel values and updating parameters. + refSpotCoords.push_back(provider->posImage); - std::array newExps; - if (fnp->getFilmNegativeExponents(refSpotCoords[0], refSpotCoords[1], newExps)) { + if (refSpotCoords.size() == 2) { + // User has selected 2 reference gray spots. Calculating new exponents + // from channel values and updating parameters. + + std::array newExps; + + if (fnp->getFilmNegativeExponents(refSpotCoords[0], refSpotCoords[1], newExps)) { + disableListener(); + // Leaving green exponent unchanged, setting red and blue exponents based on + // the ratios between newly calculated exponents. + redRatio->setValue(newExps[0] / newExps[1]); + blueRatio->setValue(newExps[2] / newExps[1]); + enableListener(); + + if (listener && getEnabled()) { + listener->panelChanged( + evFilmNegativeExponents, + Glib::ustring::compose( + "Ref=%1\nR=%2\nB=%3", + greenExp->getValue(), + redRatio->getValue(), + blueRatio->getValue() + ) + ); + } + } + + switchOffEditMode(); + } + + } else if (filmBaseSpotButton->get_active()) { + + std::array newBaseLev; + + if (fnp->getRawSpotValues(provider->posImage, 32, newBaseLev)) { disableListener(); - // Leaving green exponent unchanged, setting red and blue exponents based on - // the ratios between newly calculated exponents. - redRatio->setValue(newExps[0] / newExps[1]); - blueRatio->setValue(newExps[2] / newExps[1]); + + filmBaseValues = newBaseLev; + enableListener(); + const Glib::ustring vs = formatBaseValues(filmBaseValues); + + filmBaseValuesLabel->set_text(vs); + if (listener && getEnabled()) { - listener->panelChanged( - evFilmNegativeExponents, - Glib::ustring::compose( - "Ref=%1\nR=%2\nB=%3", - greenExp->getValue(), - redRatio->getValue(), - blueRatio->getValue() - ) - ); + listener->panelChanged(evFilmBaseValues, vs); } } @@ -292,11 +371,38 @@ void FilmNegative::switchOffEditMode() refSpotCoords.clear(); unsubscribe(); spotbutton->set_active(false); + filmBaseSpotButton->set_active(false); } void FilmNegative::editToggled() { if (spotbutton->get_active()) { + + filmBaseSpotButton->set_active(false); + refSpotCoords.clear(); + + subscribe(); + + int w, h; + getEditProvider()->getImageSize(w, h); + + // Stick a dummy rectangle over the whole image in mouseOverGeometry. + // This is to make sure the getCursor() call is fired everywhere. + Rectangle* const imgRect = static_cast(mouseOverGeometry.at(0)); + imgRect->setXYWH(0, 0, w, h); + } else { + refSpotCoords.clear(); + unsubscribe(); + } +} + +void FilmNegative::baseSpotToggled() +{ + if (filmBaseSpotButton->get_active()) { + + spotbutton->set_active(false); + refSpotCoords.clear(); + subscribe(); int w, h; diff --git a/rtgui/filmnegative.h b/rtgui/filmnegative.h index bca155ceb..0810a8c57 100644 --- a/rtgui/filmnegative.h +++ b/rtgui/filmnegative.h @@ -33,13 +33,15 @@ public: virtual ~FilmNegProvider() = default; virtual bool getFilmNegativeExponents(rtengine::Coord spotA, rtengine::Coord spotB, std::array& newExps) = 0; + virtual bool getRawSpotValues(rtengine::Coord spot, int spotSize, std::array& rawValues) = 0; }; class FilmNegative final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, - public EditSubscriber + public EditSubscriber, + public rtengine::FilmNegListener { public: FilmNegative(); @@ -53,6 +55,8 @@ public: void adjusterChanged(Adjuster* a, double newval) override; void enabledChanged() override; + void filmBaseValuesChanged(std::array rgb) override; + void setFilmNegProvider(FilmNegProvider* provider); void setEditProvider(EditDataProvider* provider) override; @@ -66,12 +70,16 @@ public: private: void editToggled(); + void baseSpotToggled(); const rtengine::ProcEvent evFilmNegativeExponents; const rtengine::ProcEvent evFilmNegativeEnabled; + const rtengine::ProcEvent evFilmBaseValues; std::vector refSpotCoords; + std::array filmBaseValues; + FilmNegProvider* fnp; Adjuster* const greenExp; @@ -80,5 +88,9 @@ private: Gtk::Grid* const spotgrid; Gtk::ToggleButton* const spotbutton; - sigc::connection spotConn; + + Gtk::Label* const filmBaseLabel; + Gtk::Label* const filmBaseValuesLabel; + Gtk::ToggleButton* const filmBaseSpotButton; + }; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 0faee0fd3..6a25a9d64 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -623,6 +623,7 @@ void ParamsEdited::set(bool v) filmNegative.redRatio = v; filmNegative.greenExp = v; filmNegative.blueRatio = v; + filmNegative.baseValues = v; exif = v; iptc = v; @@ -1225,6 +1226,9 @@ void ParamsEdited::initFrom(const std::vector& filmNegative.redRatio = filmNegative.redRatio && p.filmNegative.redRatio == other.filmNegative.redRatio; filmNegative.greenExp = filmNegative.greenExp && p.filmNegative.greenExp == other.filmNegative.greenExp; filmNegative.blueRatio = filmNegative.blueRatio && p.filmNegative.blueRatio == other.filmNegative.blueRatio; + filmNegative.baseValues = filmNegative.baseValues && p.filmNegative.redBase == other.filmNegative.redBase + && p.filmNegative.greenBase == other.filmNegative.greenBase + && p.filmNegative.blueBase == other.filmNegative.blueBase; // How the hell can we handle that??? // exif = exif && p.exif==other.exif @@ -3430,6 +3434,12 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.filmNegative.blueRatio = mods.filmNegative.blueRatio; } + if (filmNegative.baseValues) { + toEdit.filmNegative.redBase = mods.filmNegative.redBase; + toEdit.filmNegative.greenBase = mods.filmNegative.greenBase; + toEdit.filmNegative.blueBase = mods.filmNegative.blueBase; + } + // Exif changes are added to the existing ones if (exif) { for (procparams::ExifPairs::const_iterator i = mods.exif.begin(); i != mods.exif.end(); ++i) { @@ -3476,7 +3486,7 @@ bool RetinexParamsEdited::isUnchanged() const bool FilmNegativeParamsEdited::isUnchanged() const { - return enabled && redRatio && greenExp && blueRatio; + return enabled && redRatio && greenExp && blueRatio && baseValues; } bool CaptureSharpeningParamsEdited::isUnchanged() const diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index d1be2c57e..1feedd774 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -727,6 +727,7 @@ struct FilmNegativeParamsEdited { bool redRatio; bool greenExp; bool blueRatio; + bool baseValues; bool isUnchanged() const; }; diff --git a/rtgui/partialpastedlg.cc b/rtgui/partialpastedlg.cc index 22f608ae4..b31852af2 100644 --- a/rtgui/partialpastedlg.cc +++ b/rtgui/partialpastedlg.cc @@ -986,6 +986,7 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param filterPE.filmNegative.redRatio = falsePE.filmNegative.redRatio; filterPE.filmNegative.greenExp = falsePE.filmNegative.greenExp; filterPE.filmNegative.blueRatio = falsePE.filmNegative.blueRatio; + filterPE.filmNegative.baseValues = falsePE.filmNegative.baseValues; } if (!captureSharpening->get_active ()) { diff --git a/rtgui/ppversion.h b/rtgui/ppversion.h index 89f93ed44..6a670733b 100644 --- a/rtgui/ppversion.h +++ b/rtgui/ppversion.h @@ -1,11 +1,13 @@ #pragma once // This number has to be incremented whenever the PP3 file format is modified or the behaviour of a tool changes -#define PPVERSION 346 +#define PPVERSION 347 #define PPVERSION_AEXP 301 //value of PPVERSION when auto exposure algorithm was modified /* Log of version changes + 347 2019-11-17 + added special values in filmNegative for backwards compatibility with previous channel scaling method 346 2019-01-01 changed microcontrast uniformity 345 2018-10-21 diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index 00ad96328..a9c3231d4 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -609,6 +609,7 @@ void ToolPanelCoordinator::initImage (rtengine::StagedImageProcessor* ipc_, bool ipc->setSizeListener (crop); ipc->setSizeListener (resize); ipc->setImageTypeListener (this); + ipc->setFilmNegListener (filmNegative); flatfield->setShortcutPath (Glib::path_get_dirname (ipc->getInitialImage()->getFileName())); icm->setRawMeta (raw, (const rtengine::FramesData*)pMetaData); @@ -1073,3 +1074,8 @@ bool ToolPanelCoordinator::getFilmNegativeExponents(rtengine::Coord spotA, rteng { return ipc && ipc->getFilmNegativeExponents(spotA.x, spotA.y, spotB.x, spotB.y, newExps); } + +bool ToolPanelCoordinator::getRawSpotValues(rtengine::Coord spot, int spotSize, std::array& rawValues) +{ + return ipc && ipc->getRawSpotValues(spot.x, spot.y, spotSize, rawValues); +} \ No newline at end of file diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index 0fc1a9070..1b51bca31 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -297,6 +297,7 @@ public: // FilmNegProvider interface bool getFilmNegativeExponents(rtengine::Coord spotA, rtengine::Coord spotB, std::array& newExps) override; + bool getRawSpotValues(rtengine::Coord spot, int spotSize, std::array& rawValues) override; // rotatelistener interface void straightenRequested () override; From 25513c85bce07ebc0f2ff15f4688fa02cee5e31a Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 13 Apr 2020 17:52:56 +0200 Subject: [PATCH 086/109] Improve toning with meanab sigmaab and damper --- rtdata/languages/default | 1 + rtengine/improcfun.h | 2 +- rtengine/ipwavelet.cc | 92 ++++++++++++++++++++++++++++------------ rtengine/procparams.cc | 4 ++ rtengine/procparams.h | 1 + rtgui/paramsedited.cc | 6 +++ rtgui/paramsedited.h | 1 + rtgui/wavelet.cc | 15 ++++++- rtgui/wavelet.h | 2 + 9 files changed, 96 insertions(+), 28 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index a5cd7746e..7dd47e154 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -817,6 +817,7 @@ HISTORY_MSG_BLURWAV;Blur luminance HISTORY_MSG_BLURCWAV;Blur chroma HISTORY_MSG_EDGEFFECT;Edge Damper HISTORY_MSG_SIGMAFIN;Final contrast Damper +HISTORY_MSG_SIGMATON;Toning Damper HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index d003df644..9d4a0235c 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -216,7 +216,7 @@ public: void finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, const cont_params &cp, int W_L, int H_L, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL); void ContAllAB(LabImage * lab, int maxlvl, float **varhue, float **varchrom, float ** WavCoeffs_a, float * WavCoeffs_a0, int level, int dir, const WavOpacityCurveW & waOpacityCurveW, struct cont_params &cp, - int W_ab, int H_ab, const bool useChannelA); + int W_ab, int H_ab, const bool useChannelA, float *meanab, float *sigmaab); void Evaluate2(const wavelet_decomposition &WaveletCoeffs_L, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN); void Eval2(float ** WavCoeffs_L, int level, diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 157fb6239..9d50dedff 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -114,6 +114,7 @@ struct cont_params { float tmstrength; float balan; float sigmafin; + float sigmaton; int ite; int contmet; bool opaW; @@ -193,6 +194,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.tonemap = params->wavelet.tmrs != 0; cp.bam = false; cp.sigmafin = params->wavelet.sigmafin; + cp.sigmaton = params->wavelet.sigmaton; if (params->wavelet.TMmethod == "cont") { cp.contmet = 1; @@ -931,9 +933,11 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const vari[1] = rtengine::max(0.000001f, vari[1]); vari[2] = rtengine::max(0.000001f, vari[2]); vari[3] = rtengine::max(0.000001f, kr3 * vari[3]); + if (settings->verbose) { - printf("LUM var0=%f var1=%f var2=%f var3=%f\n",vari[0], vari[1], vari[2], vari[3]); + printf("LUM var0=%f var1=%f var2=%f var3=%f\n", vari[0], vari[1], vari[2], vari[3]); } + // float* noisevarlum = nullptr; // we need a dummy to pass it to WaveletDenoiseAllL int GWL = labco->W; int GHL = labco->H; @@ -1176,9 +1180,11 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const variC[6] = max(0.00001f, k6 * variC[6]); variCb[6] = max(0.00001f, k6 * variCb[6]); + if (settings->verbose) { - printf("CHRO var0=%f va1=%f va2=%f va3=%f va4=%f val5=%f va6=%f\n", variC[0], variC[1], variC[2], variC[3],variC[4],variC[5], variC[6]); + printf("CHRO var0=%f va1=%f va2=%f va3=%f va4=%f val5=%f va6=%f\n", variC[0], variC[1], variC[2], variC[3], variC[4], variC[5], variC[6]); } + /* for (int y = 0; y < 7; y++) { printf("y=%i madL=%f varia=%f variab=%f\n", y, madL[y][1], variC[y], variCb[y]); @@ -2203,27 +2209,28 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * //Blur luma if (cp.blurres != 0.f && cp.resena) { - int minWL = min(W_L, H_L); - float k = 0.5f; - //printf("skip=%i WL=%i HL=%i min=%i\n", skip, W_L, H_L, minWL); - if(minWL > 140) {//disabled if too low windows - float rad = k * cp.blurres / skip; - float * bef = new float[W_L * H_L]; - float * aft = new float[W_L * H_L]; - - for (int i = 0; i < H_L * W_L; i++) { - bef[i] = WavCoeffs_L0[i]; - } + int minWL = min(W_L, H_L); + float k = 0.5f; - boxblur(bef, aft, rad, W_L, H_L, false); + //printf("skip=%i WL=%i HL=%i min=%i\n", skip, W_L, H_L, minWL); + if (minWL > 140) { //disabled if too low windows + float rad = k * cp.blurres / skip; + float * bef = new float[W_L * H_L]; + float * aft = new float[W_L * H_L]; - for (int i = 0; i < H_L * W_L; i++) { - WavCoeffs_L0[i] = aft[i]; - } - - delete[] bef; - delete[] aft; + for (int i = 0; i < H_L * W_L; i++) { + bef[i] = WavCoeffs_L0[i]; } + + boxblur(bef, aft, rad, W_L, H_L, false); + + for (int i = 0; i < H_L * W_L; i++) { + WavCoeffs_L0[i] = aft[i]; + } + + delete[] bef; + delete[] aft; + } } // @@ -2679,8 +2686,9 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float if (cp.blurcres != 0.f && cp.resena) { int minWL = min(W_L, H_L); float k = 0.5f; + //printf("skip=%i WL=%i HL=%i min=%i\n", skip, W_L, H_L, minWL); - if(minWL > 140) {//disabled if too low windows + if (minWL > 140) { //disabled if too low windows float rad = k * cp.blurcres / skip; float * bef = new float[W_L * H_L]; float * aft = new float[W_L * H_L]; @@ -2722,7 +2730,7 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float int Hlvl_ab = WaveletCoeffs_ab.level_H(lvl); float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); - ContAllAB(labco, maxlvl, varhue, varchrom, WavCoeffs_ab, WavCoeffs_ab0, lvl, dir, waOpacityCurveW, cp, Wlvl_ab, Hlvl_ab, useChannelA); + ContAllAB(labco, maxlvl, varhue, varchrom, WavCoeffs_ab, WavCoeffs_ab0, lvl, dir, waOpacityCurveW, cp, Wlvl_ab, Hlvl_ab, useChannelA, meanab, sigmaab); if (wavblcurve && wavcurvecomp && cp.blena && cp.chrwav > 0.f) { @@ -3846,7 +3854,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz } void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, float **varchrom, float ** WavCoeffs_ab, float * WavCoeffs_ab0, int level, int dir, const WavOpacityCurveW & waOpacityCurveW, struct cont_params &cp, - int W_ab, int H_ab, const bool useChannelA) + int W_ab, int H_ab, const bool useChannelA, float *meanab, float *sigmaab) { float cpMul = cp.mul[level]; @@ -3981,15 +3989,47 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f } if ((useOpacity && level < 9 && mulOpacity != 0.f) && cp.toningena) { //toning + float mea[10]; + float effect = cp.sigmaton; + float betaab = 0.f; + float offs = 1.f; - float beta = (1024.f + 20.f * mulOpacity) / 1024.f ; + calceffect(level, meanab, sigmaab, mea, effect, offs); + + for (int co = 0; co < W_ab * H_ab; co++) { + float WavCab = std::fabs(WavCoeffs_ab[dir][co]); + + if (WavCab < mea[0]) { + betaab = 0.05f; + } else if (WavCab < mea[1]) { + betaab = 0.2f; + } else if (WavCab < mea[2]) { + betaab = 0.7f; + } else if (WavCab < mea[3]) { + betaab = 1.f; //standard + } else if (WavCab < mea[4]) { + betaab = 1.f; + } else if (WavCab < mea[5]) { + betaab = 0.8f; //+sigma + } else if (WavCab < mea[6]) { + betaab = 0.6f; + } else if (WavCab < mea[7]) { + betaab = 0.4f; + } else if (WavCab < mea[8]) { + betaab = 0.2f; // + 2 sigma + } else if (WavCab < mea[9]) { + betaab = 0.1f; + } else { + betaab = 0.0f; + } + } + + float beta = (1024.f + 50.f * mulOpacity * betaab) / 1024.f ; - //float beta = (1000.f * mulOpacity); for (int i = 0; i < W_ab * H_ab; i++) { WavCoeffs_ab[dir][i] *= beta; } - // WavCoeffs_ab[dir][i] += beta; } if (waOpacityCurveW) { diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 0d8324d4e..bac9e86ff 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2264,6 +2264,7 @@ WaveletParams::WaveletParams() : strength(100), balance(0), sigmafin(1.0), + sigmaton(1.0), iter(0), expcontrast(false), expchroma(false), @@ -2379,6 +2380,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && strength == other.strength && balance == other.balance && sigmafin == other.sigmafin + && sigmaton == other.sigmaton && iter == other.iter && expcontrast == other.expcontrast && expchroma == other.expchroma @@ -3517,6 +3519,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.strength, "Wavelet", "Strength", wavelet.strength, keyFile); saveToKeyfile(!pedited || pedited->wavelet.balance, "Wavelet", "Balance", wavelet.balance, keyFile); saveToKeyfile(!pedited || pedited->wavelet.sigmafin, "Wavelet", "Sigmafin", wavelet.sigmafin, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.sigmaton, "Wavelet", "Sigmaton", wavelet.sigmaton, keyFile); saveToKeyfile(!pedited || pedited->wavelet.iter, "Wavelet", "Iter", wavelet.iter, keyFile); saveToKeyfile(!pedited || pedited->wavelet.thres, "Wavelet", "MaxLev", wavelet.thres, keyFile); saveToKeyfile(!pedited || pedited->wavelet.Tilesmethod, "Wavelet", "TilesMethod", wavelet.Tilesmethod, keyFile); @@ -4695,6 +4698,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "Strength", pedited, wavelet.strength, pedited->wavelet.strength); assignFromKeyfile(keyFile, "Wavelet", "Balance", pedited, wavelet.balance, pedited->wavelet.balance); assignFromKeyfile(keyFile, "Wavelet", "Sigmafin", pedited, wavelet.sigmafin, pedited->wavelet.sigmafin); + assignFromKeyfile(keyFile, "Wavelet", "Sigmaton", pedited, wavelet.sigmaton, pedited->wavelet.sigmaton); assignFromKeyfile(keyFile, "Wavelet", "Iter", pedited, wavelet.iter, pedited->wavelet.iter); assignFromKeyfile(keyFile, "Wavelet", "Median", pedited, wavelet.median, pedited->wavelet.median); assignFromKeyfile(keyFile, "Wavelet", "Medianlev", pedited, wavelet.medianlev, pedited->wavelet.medianlev); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index c26b02de4..e5ac570af 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1222,6 +1222,7 @@ struct WaveletParams { int strength; int balance; double sigmafin; + double sigmaton; int iter; bool expcontrast; bool expchroma; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 9eff3c4ce..e83e74bc9 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -476,6 +476,7 @@ void ParamsEdited::set(bool v) wavelet.balance = v; wavelet.iter = v; wavelet.sigmafin = v; + wavelet.sigmaton = v; wavelet.median = v; wavelet.medianlev = v; wavelet.linkedg = v; @@ -1087,6 +1088,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.balance = wavelet.balance && p.wavelet.balance == other.wavelet.balance; wavelet.iter = wavelet.iter && p.wavelet.iter == other.wavelet.iter; wavelet.sigmafin = wavelet.sigmafin && p.wavelet.sigmafin == other.wavelet.sigmafin; + wavelet.sigmaton = wavelet.sigmaton && p.wavelet.sigmaton == other.wavelet.sigmaton; wavelet.median = wavelet.median && p.wavelet.median == other.wavelet.median; wavelet.medianlev = wavelet.medianlev && p.wavelet.medianlev == other.wavelet.medianlev; wavelet.linkedg = wavelet.linkedg && p.wavelet.linkedg == other.wavelet.linkedg; @@ -2899,6 +2901,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.sigmafin = mods.wavelet.sigmafin; } + if (wavelet.sigmaton) { + toEdit.wavelet.sigmaton = mods.wavelet.sigmaton; + } + if (wavelet.iter) { toEdit.wavelet.iter = mods.wavelet.iter; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 351096a7e..773f5592d 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -500,6 +500,7 @@ struct WaveletParamsEdited { bool balance; bool iter; bool sigmafin; + bool sigmaton; bool median; bool medianlev; bool linkedg; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index c12e216cf..db3687b3e 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -113,6 +113,7 @@ Wavelet::Wavelet() : balance(Gtk::manage(new Adjuster(M("TP_WAVELET_BALANCE"), -30, 100, 1, 0))), iter(Gtk::manage(new Adjuster(M("TP_WAVELET_ITER"), -3, 3, 1, 0))), sigmafin(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMAFIN"), 0.025, 2.5, 0.01, 1.))), + sigmaton(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMAFIN"), 0.025, 2.5, 0.01, 1.))), hueskin(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_HUESKIN"), -314., 314., -5., 25., 170., 120., 0, false))), hueskin2(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_HUESKY"), -314., 314., -260., -250, -130., -140., 0, false))), hllev(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_HIGHLIGHT"), 0., 100., 50., 75., 100., 98., 0, false))), @@ -210,6 +211,7 @@ Wavelet::Wavelet() : EvWavresblurc = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLURCWAV"); EvWavedgeffect = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_EDGEFFECT"); EvWavsigmafin = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SIGMAFIN"); + EvWavsigmaton = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SIGMATON"); expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings)); @@ -487,6 +489,7 @@ Wavelet::Wavelet() : // Toning ToolParamBlock* const tonBox = Gtk::manage(new ToolParamBlock()); + sigmaton->setAdjusterListener(this); opaCurveEditorG->setCurveListener(this); @@ -498,7 +501,7 @@ Wavelet::Wavelet() : opaCurveEditorG->curveListComplete(); opaCurveEditorG->show(); - + tonBox->pack_start(*sigmaton); tonBox->pack_start(*opaCurveEditorG, Gtk::PACK_SHRINK, 2); opacityCurveEditorG->setCurveListener(this); @@ -1434,6 +1437,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) balance->setValue(pp->wavelet.balance); iter->setValue(pp->wavelet.iter); sigmafin->setValue(pp->wavelet.sigmafin); + sigmaton->setValue(pp->wavelet.sigmaton); for (int i = 0; i < 9; i++) { correction[i]->setValue(pp->wavelet.c[i]); @@ -1552,6 +1556,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) balance->setEditedState(pedited->wavelet.balance ? Edited : UnEdited); iter->setEditedState(pedited->wavelet.iter ? Edited : UnEdited); sigmafin->setEditedState(pedited->wavelet.sigmafin ? Edited : UnEdited); + sigmaton->setEditedState(pedited->wavelet.sigmaton ? Edited : UnEdited); threshold->setEditedState(pedited->wavelet.threshold ? Edited : UnEdited); threshold2->setEditedState(pedited->wavelet.threshold2 ? Edited : UnEdited); edgedetect->setEditedState(pedited->wavelet.edgedetect ? Edited : UnEdited); @@ -1824,6 +1829,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.iter = (int) iter->getValue(); pp->wavelet.wavclCurve = clshape->getCurve(); pp->wavelet.sigmafin = sigmafin->getValue(); + pp->wavelet.sigmaton = sigmaton->getValue(); for (int i = 0; i < 9; i++) { pp->wavelet.c[i] = (int) correction[i]->getValue(); @@ -1931,6 +1937,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.balance = balance->getEditedState(); pedited->wavelet.iter = iter->getEditedState(); pedited->wavelet.sigmafin = sigmafin->getEditedState(); + pedited->wavelet.sigmaton = sigmaton->getEditedState(); pedited->wavelet.wavclCurve = !clshape->isUnChanged(); pedited->wavelet.expcontrast = !expcontrast->get_inconsistent(); pedited->wavelet.expchroma = !expchroma->get_inconsistent(); @@ -2112,6 +2119,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit balance->setDefault(defParams->wavelet.balance); iter->setDefault(defParams->wavelet.iter); sigmafin->setDefault(defParams->wavelet.sigmafin); + sigmaton->setDefault(defParams->wavelet.sigmaton); sigma->setDefault(defParams->wavelet.sigma); offset->setDefault(defParams->wavelet.offset); lowthr->setDefault(defParams->wavelet.lowthr); @@ -2235,6 +2243,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit balance->setDefaultEditedState(pedited->wavelet.balance ? Edited : UnEdited); iter->setDefaultEditedState(pedited->wavelet.iter ? Edited : UnEdited); sigmafin->setDefaultEditedState(pedited->wavelet.sigmafin ? Edited : UnEdited); + sigmaton->setDefaultEditedState(pedited->wavelet.sigmaton ? Edited : UnEdited); level0noise->setDefaultEditedState(pedited->wavelet.level0noise ? Edited : UnEdited); level1noise->setDefaultEditedState(pedited->wavelet.level1noise ? Edited : UnEdited); level2noise->setDefaultEditedState(pedited->wavelet.level2noise ? Edited : UnEdited); @@ -2298,6 +2307,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit balance->setDefaultEditedState(Irrelevant); iter->setDefaultEditedState(Irrelevant); sigmafin->setDefaultEditedState(Irrelevant); + sigmaton->setDefaultEditedState(Irrelevant); for (int i = 0; i < 9; i++) { correction[i]->setDefaultEditedState(Irrelevant); @@ -2831,6 +2841,7 @@ void Wavelet::setBatchMode(bool batchMode) balance->showEditedCB(); iter->showEditedCB(); sigmafin->showEditedCB(); + sigmaton->showEditedCB(); level0noise->showEditedCB(); level1noise->showEditedCB(); level2noise->showEditedCB(); @@ -2982,6 +2993,8 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWaviter, iter->getTextValue()); } else if (a == sigmafin) { listener->panelChanged(EvWavsigmafin, sigmafin->getTextValue()); + } else if (a == sigmaton) { + listener->panelChanged(EvWavsigmaton, sigmaton->getTextValue()); } else if (a == greenhigh) { listener->panelChanged(EvWavgreenhigh, greenhigh->getTextValue()); } else if (a == bluehigh) { diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index 271aea5b2..e8154b680 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -94,6 +94,7 @@ private: rtengine::ProcEvent EvWavresblurc; rtengine::ProcEvent EvWavedgeffect; rtengine::ProcEvent EvWavsigmafin; + rtengine::ProcEvent EvWavsigmaton; void foldAllButMe(GdkEventButton* event, MyExpander *expander); @@ -220,6 +221,7 @@ private: Adjuster* const balance; Adjuster* const iter; Adjuster* const sigmafin; + Adjuster* const sigmaton; Adjuster* greenlow; Adjuster* bluelow; From 2c3c658171d2fa831b3355fa5db532fb70d18a7d Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 14 Apr 2020 08:36:51 +0200 Subject: [PATCH 087/109] Wavelet - added meanab sigmaab damper to chroma -Fixed bug in toning --- rtdata/languages/default | 1 + rtengine/ipwavelet.cc | 50 ++++++++++++++++++++++++++++++++++++---- rtengine/procparams.cc | 4 ++++ rtengine/procparams.h | 1 + rtgui/paramsedited.cc | 6 +++++ rtgui/paramsedited.h | 1 + rtgui/wavelet.cc | 19 ++++++++++++++- rtgui/wavelet.h | 2 ++ 8 files changed, 78 insertions(+), 6 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 5832406de..8d4472f04 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -819,6 +819,7 @@ HISTORY_MSG_BLURCWAV;Blur chroma HISTORY_MSG_EDGEFFECT;Edge Damper HISTORY_MSG_SIGMAFIN;Final contrast Damper HISTORY_MSG_SIGMATON;Toning Damper +HISTORY_MSG_SIGMACOL;Chroma Damper HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 9d50dedff..6fe88c209 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -115,6 +115,7 @@ struct cont_params { float balan; float sigmafin; float sigmaton; + float sigmacol; int ite; int contmet; bool opaW; @@ -195,6 +196,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.bam = false; cp.sigmafin = params->wavelet.sigmafin; cp.sigmaton = params->wavelet.sigmaton; + cp.sigmacol = params->wavelet.sigmacol; if (params->wavelet.TMmethod == "cont") { cp.contmet = 1; @@ -3866,6 +3868,11 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f //to adjust increase contrast with local contrast bool useSkinControl = (skinprot != 0.f); + + + + + float alphaC = (1024.f + 15.f * cpMul * cpChrom / 50.f) / 1024.f ; for (int i = 0; i < W_ab * H_ab; i++) { @@ -3903,7 +3910,41 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f const float factorHard = (1.f - skinprotneg / 100.f); bool useSkinControl = (skinprot != 0.f); + + float mea[10]; + float effect = cp.sigmacol; + float betaab = 0.f; + float offs = 1.f; + + calceffect(level, meanab, sigmaab, mea, effect, offs); + for (int i = 0; i < W_ab * H_ab; i++) { + float WavCab = std::fabs(WavCoeffs_ab[dir][i]); + + if (WavCab < mea[0]) { + betaab = 0.05f; + } else if (WavCab < mea[1]) { + betaab = 0.2f; + } else if (WavCab < mea[2]) { + betaab = 0.7f; + } else if (WavCab < mea[3]) { + betaab = 1.f; //standard + } else if (WavCab < mea[4]) { + betaab = 1.f; + } else if (WavCab < mea[5]) { + betaab = 0.8f; //+sigma + } else if (WavCab < mea[6]) { + betaab = 0.6f; + } else if (WavCab < mea[7]) { + betaab = 0.4f; + } else if (WavCab < mea[8]) { + betaab = 0.2f; // + 2 sigma + } else if (WavCab < mea[9]) { + betaab = 0.1f; + } else { + betaab = 0.0f; + } + int ii = i / W_ab; int jj = i - ii * W_ab; //WL and W_ab are identical @@ -3923,7 +3964,7 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f } } - float beta = (1024.f + 20.f * cpMulC * scale) / 1024.f ; + float beta = (1024.f + 20.f * cpMulC * scale * betaab) / 1024.f ; if (beta < 0.02f) { beta = 0.02f; @@ -4022,12 +4063,11 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f } else { betaab = 0.0f; } - } - float beta = (1024.f + 50.f * mulOpacity * betaab) / 1024.f ; - for (int i = 0; i < W_ab * H_ab; i++) { - WavCoeffs_ab[dir][i] *= beta; + float beta = (1024.f + 50.f * mulOpacity * betaab) / 1024.f ; + + WavCoeffs_ab[dir][co] *= beta; } } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 8306f9a55..7b6a8f123 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2265,6 +2265,7 @@ WaveletParams::WaveletParams() : balance(0), sigmafin(1.0), sigmaton(1.0), + sigmacol(1.0), iter(0), expcontrast(false), expchroma(false), @@ -2381,6 +2382,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && balance == other.balance && sigmafin == other.sigmafin && sigmaton == other.sigmaton + && sigmacol == other.sigmacol && iter == other.iter && expcontrast == other.expcontrast && expchroma == other.expchroma @@ -3526,6 +3528,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.balance, "Wavelet", "Balance", wavelet.balance, keyFile); saveToKeyfile(!pedited || pedited->wavelet.sigmafin, "Wavelet", "Sigmafin", wavelet.sigmafin, keyFile); saveToKeyfile(!pedited || pedited->wavelet.sigmaton, "Wavelet", "Sigmaton", wavelet.sigmaton, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.sigmacol, "Wavelet", "Sigmacol", wavelet.sigmacol, keyFile); saveToKeyfile(!pedited || pedited->wavelet.iter, "Wavelet", "Iter", wavelet.iter, keyFile); saveToKeyfile(!pedited || pedited->wavelet.thres, "Wavelet", "MaxLev", wavelet.thres, keyFile); saveToKeyfile(!pedited || pedited->wavelet.Tilesmethod, "Wavelet", "TilesMethod", wavelet.Tilesmethod, keyFile); @@ -4708,6 +4711,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "Balance", pedited, wavelet.balance, pedited->wavelet.balance); assignFromKeyfile(keyFile, "Wavelet", "Sigmafin", pedited, wavelet.sigmafin, pedited->wavelet.sigmafin); assignFromKeyfile(keyFile, "Wavelet", "Sigmaton", pedited, wavelet.sigmaton, pedited->wavelet.sigmaton); + assignFromKeyfile(keyFile, "Wavelet", "Sigmacol", pedited, wavelet.sigmacol, pedited->wavelet.sigmacol); assignFromKeyfile(keyFile, "Wavelet", "Iter", pedited, wavelet.iter, pedited->wavelet.iter); assignFromKeyfile(keyFile, "Wavelet", "Median", pedited, wavelet.median, pedited->wavelet.median); assignFromKeyfile(keyFile, "Wavelet", "Medianlev", pedited, wavelet.medianlev, pedited->wavelet.medianlev); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 38883110b..536f260bc 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1223,6 +1223,7 @@ struct WaveletParams { int balance; double sigmafin; double sigmaton; + double sigmacol; int iter; bool expcontrast; bool expchroma; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index f6cfb78f9..8a97681e4 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -477,6 +477,7 @@ void ParamsEdited::set(bool v) wavelet.iter = v; wavelet.sigmafin = v; wavelet.sigmaton = v; + wavelet.sigmacol = v; wavelet.median = v; wavelet.medianlev = v; wavelet.linkedg = v; @@ -1090,6 +1091,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.iter = wavelet.iter && p.wavelet.iter == other.wavelet.iter; wavelet.sigmafin = wavelet.sigmafin && p.wavelet.sigmafin == other.wavelet.sigmafin; wavelet.sigmaton = wavelet.sigmaton && p.wavelet.sigmaton == other.wavelet.sigmaton; + wavelet.sigmacol = wavelet.sigmacol && p.wavelet.sigmacol == other.wavelet.sigmacol; wavelet.median = wavelet.median && p.wavelet.median == other.wavelet.median; wavelet.medianlev = wavelet.medianlev && p.wavelet.medianlev == other.wavelet.medianlev; wavelet.linkedg = wavelet.linkedg && p.wavelet.linkedg == other.wavelet.linkedg; @@ -2909,6 +2911,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.sigmaton = mods.wavelet.sigmaton; } + if (wavelet.sigmacol) { + toEdit.wavelet.sigmacol = mods.wavelet.sigmacol; + } + if (wavelet.iter) { toEdit.wavelet.iter = mods.wavelet.iter; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index f602c04f1..c17ea52c7 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -501,6 +501,7 @@ struct WaveletParamsEdited { bool iter; bool sigmafin; bool sigmaton; + bool sigmacol; bool median; bool medianlev; bool linkedg; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index db3687b3e..475c6d866 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -114,6 +114,7 @@ Wavelet::Wavelet() : iter(Gtk::manage(new Adjuster(M("TP_WAVELET_ITER"), -3, 3, 1, 0))), sigmafin(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMAFIN"), 0.025, 2.5, 0.01, 1.))), sigmaton(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMAFIN"), 0.025, 2.5, 0.01, 1.))), + sigmacol(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMAFIN"), 0.025, 2.5, 0.01, 1.))), hueskin(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_HUESKIN"), -314., 314., -5., 25., 170., 120., 0, false))), hueskin2(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_HUESKY"), -314., 314., -260., -250, -130., -140., 0, false))), hllev(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_HIGHLIGHT"), 0., 100., 50., 75., 100., 98., 0, false))), @@ -212,6 +213,7 @@ Wavelet::Wavelet() : EvWavedgeffect = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_EDGEFFECT"); EvWavsigmafin = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SIGMAFIN"); EvWavsigmaton = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SIGMATON"); + EvWavsigmacol = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SIGMACOL"); expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings)); @@ -456,8 +458,10 @@ Wavelet::Wavelet() : chBox->pack_start(*satlev); chro->set_tooltip_text(M("TP_WAVELET_CHR_TOOLTIP")); - chBox->pack_start(*chro); chro->setAdjusterListener(this); + sigmacol->setAdjusterListener(this); + chBox->pack_start(*chro); + chBox->pack_start(*sigmacol); Gtk::HBox* const buttonchBox = Gtk::manage(new Gtk::HBox(true, 10)); neutralchPressedConn = neutralchButton->signal_pressed().connect(sigc::mem_fun(*this, &Wavelet::neutralchPressed)); @@ -1438,6 +1442,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) iter->setValue(pp->wavelet.iter); sigmafin->setValue(pp->wavelet.sigmafin); sigmaton->setValue(pp->wavelet.sigmaton); + sigmacol->setValue(pp->wavelet.sigmacol); for (int i = 0; i < 9; i++) { correction[i]->setValue(pp->wavelet.c[i]); @@ -1557,6 +1562,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) iter->setEditedState(pedited->wavelet.iter ? Edited : UnEdited); sigmafin->setEditedState(pedited->wavelet.sigmafin ? Edited : UnEdited); sigmaton->setEditedState(pedited->wavelet.sigmaton ? Edited : UnEdited); + sigmacol->setEditedState(pedited->wavelet.sigmacol ? Edited : UnEdited); threshold->setEditedState(pedited->wavelet.threshold ? Edited : UnEdited); threshold2->setEditedState(pedited->wavelet.threshold2 ? Edited : UnEdited); edgedetect->setEditedState(pedited->wavelet.edgedetect ? Edited : UnEdited); @@ -1830,6 +1836,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.wavclCurve = clshape->getCurve(); pp->wavelet.sigmafin = sigmafin->getValue(); pp->wavelet.sigmaton = sigmaton->getValue(); + pp->wavelet.sigmacol = sigmacol->getValue(); for (int i = 0; i < 9; i++) { pp->wavelet.c[i] = (int) correction[i]->getValue(); @@ -1938,6 +1945,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.iter = iter->getEditedState(); pedited->wavelet.sigmafin = sigmafin->getEditedState(); pedited->wavelet.sigmaton = sigmaton->getEditedState(); + pedited->wavelet.sigmacol = sigmacol->getEditedState(); pedited->wavelet.wavclCurve = !clshape->isUnChanged(); pedited->wavelet.expcontrast = !expcontrast->get_inconsistent(); pedited->wavelet.expchroma = !expchroma->get_inconsistent(); @@ -2120,6 +2128,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit iter->setDefault(defParams->wavelet.iter); sigmafin->setDefault(defParams->wavelet.sigmafin); sigmaton->setDefault(defParams->wavelet.sigmaton); + sigmacol->setDefault(defParams->wavelet.sigmacol); sigma->setDefault(defParams->wavelet.sigma); offset->setDefault(defParams->wavelet.offset); lowthr->setDefault(defParams->wavelet.lowthr); @@ -2244,6 +2253,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit iter->setDefaultEditedState(pedited->wavelet.iter ? Edited : UnEdited); sigmafin->setDefaultEditedState(pedited->wavelet.sigmafin ? Edited : UnEdited); sigmaton->setDefaultEditedState(pedited->wavelet.sigmaton ? Edited : UnEdited); + sigmacol->setDefaultEditedState(pedited->wavelet.sigmacol ? Edited : UnEdited); level0noise->setDefaultEditedState(pedited->wavelet.level0noise ? Edited : UnEdited); level1noise->setDefaultEditedState(pedited->wavelet.level1noise ? Edited : UnEdited); level2noise->setDefaultEditedState(pedited->wavelet.level2noise ? Edited : UnEdited); @@ -2308,6 +2318,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit iter->setDefaultEditedState(Irrelevant); sigmafin->setDefaultEditedState(Irrelevant); sigmaton->setDefaultEditedState(Irrelevant); + sigmacol->setDefaultEditedState(Irrelevant); for (int i = 0; i < 9; i++) { correction[i]->setDefaultEditedState(Irrelevant); @@ -2403,6 +2414,7 @@ void Wavelet::CHmethodUpdateUI() if (!batchMode) { if (CHmethod->get_active_row_number() == 0) { CHSLmethod->show(); + sigmacol->show(); pastlev->hide(); satlev->hide(); chroma->hide(); @@ -2422,6 +2434,7 @@ void Wavelet::CHmethodUpdateUI() } } else if (CHmethod->get_active_row_number() == 1) { CHSLmethod->show(); + sigmacol->show(); pastlev->show(); satlev->show(); chroma->show(); @@ -2441,6 +2454,7 @@ void Wavelet::CHmethodUpdateUI() } } else { chro->show(); + sigmacol->hide(); pastlev->hide(); satlev->hide(); chroma->hide(); @@ -2842,6 +2856,7 @@ void Wavelet::setBatchMode(bool batchMode) iter->showEditedCB(); sigmafin->showEditedCB(); sigmaton->showEditedCB(); + sigmacol->showEditedCB(); level0noise->showEditedCB(); level1noise->showEditedCB(); level2noise->showEditedCB(); @@ -2995,6 +3010,8 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavsigmafin, sigmafin->getTextValue()); } else if (a == sigmaton) { listener->panelChanged(EvWavsigmaton, sigmaton->getTextValue()); + } else if (a == sigmacol) { + listener->panelChanged(EvWavsigmacol, sigmacol->getTextValue()); } else if (a == greenhigh) { listener->panelChanged(EvWavgreenhigh, greenhigh->getTextValue()); } else if (a == bluehigh) { diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index e8154b680..4a4947b2a 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -95,6 +95,7 @@ private: rtengine::ProcEvent EvWavedgeffect; rtengine::ProcEvent EvWavsigmafin; rtengine::ProcEvent EvWavsigmaton; + rtengine::ProcEvent EvWavsigmacol; void foldAllButMe(GdkEventButton* event, MyExpander *expander); @@ -222,6 +223,7 @@ private: Adjuster* const iter; Adjuster* const sigmafin; Adjuster* const sigmaton; + Adjuster* const sigmacol; Adjuster* greenlow; Adjuster* bluelow; From e3c802f6106a3679826f9c98c46238b42df218d5 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 14 Apr 2020 09:11:32 +0200 Subject: [PATCH 088/109] Wavelet levels - Fixed bad behavior edge sharpness with damper --- rtengine/ipwavelet.cc | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 6fe88c209..38c873824 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -3141,7 +3141,12 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz constexpr float bedstr = 1.f - 10.f * aedstr; float mea[10]; - float beta = 1.f; + // float beta = 1.f; + float * beta = new float[W_L * H_L]; + + for (int co = 0; co < H_L * W_L; co++) { + beta[co] = 1.f; + } if (cp.eff < 2.5f) { float effect = cp.eff; @@ -3153,27 +3158,27 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz float WavCL = std::fabs(WavCoeffs_L[dir][co]); if (WavCL < mea[0]) { - beta = 0.05f; + beta[co] = 0.05f; } else if (WavCL < mea[1]) { - beta = 0.2f; + beta[co] = 0.2f; } else if (WavCL < mea[2]) { - beta = 0.7f; + beta[co] = 0.7f; } else if (WavCL < mea[3]) { - beta = 1.f; //standard + beta[co] = 1.f; //standard } else if (WavCL < mea[4]) { - beta = 1.f; + beta[co] = 1.f; } else if (WavCL < mea[5]) { - beta = 0.8f; //+sigma + beta[co] = 0.8f; //+sigma } else if (WavCL < mea[6]) { - beta = 0.6f; + beta[co] = 0.6f; } else if (WavCL < mea[7]) { - beta = 0.4f; + beta[co] = 0.4f; } else if (WavCL < mea[8]) { - beta = 0.2f; // + 2 sigma + beta[co] = 0.2f; // + 2 sigma } else if (WavCL < mea[9]) { - beta = 0.1f; + beta[co] = 0.1f; } else { - beta = 0.0f; + beta[co] = 0.0f; } } @@ -3272,7 +3277,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz value *= (atten01234 * scaleskip[1]); //for zoom < 100% reduce strength...I choose level 1...but!! } - value *= beta; + // value *= beta; float edge = 1.f; float lim0 = 20.f; //arbitrary limit for low radius and level between 2 or 3 to 30 maxi float lev = float (level); @@ -3432,7 +3437,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz edge = rtengine::max(edge, 1.f); } - WavCoeffs_L[dir][k] *= edge; + WavCoeffs_L[dir][k] *= (1.f + (edge - 1.f) * beta[k]); } } } else if (cp.EDmet == 1) { //threshold adjuster @@ -3549,7 +3554,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz } } - WavCoeffs_L[dir][k] *= edge; + WavCoeffs_L[dir][k] *= (1.f + (edge - 1.f) * beta[k]); } } } @@ -3557,6 +3562,8 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz if (!lipschitz) { delete [] koe; } + + delete[] beta; } From cb700cc67642c2c1462bd2257f3125cf38f8a57b Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 14 Apr 2020 09:38:05 +0200 Subject: [PATCH 089/109] Fixed bad behavior blur levels damper --- rtengine/ipwavelet.cc | 63 +++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 26 deletions(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 38c873824..92fe16f98 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -2414,8 +2414,11 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * // printf("Blur level L\n"); float mea[10]; float effect = cp.bluwav; - float beta = 0.f; float offs = 1.f; + float * beta = new float[Wlvl_L * Hlvl_L]; + for (int co = 0; co < Hlvl_L * Wlvl_L; co++) { + beta[co] = 1.f; + } calceffect(lvl, mean, sigma, mea, effect, offs); @@ -2427,41 +2430,41 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * float WavCL = std::fabs(WavCoeffs_L[dir][co]); if (WavCL < mea[0]) { - beta = 0.05f; + beta[co] = 0.05f; n0++; if (WavCL < 32.7) { n32++; } } else if (WavCL < mea[1]) { - beta = 0.2f; + beta[co] = 0.2f; n1++; } else if (WavCL < mea[2]) { - beta = 0.7f; + beta[co] = 0.7f; n2++; } else if (WavCL < mea[3]) { - beta = 1.f; //standard + beta[co] = 1.f; //standard n3++; } else if (WavCL < mea[4]) { - beta = 1.f; + beta[co] = 1.f; n4++; } else if (WavCL < mea[5]) { - beta = 0.8f; //+sigma + beta[co] = 0.8f; //+sigma n5++; } else if (WavCL < mea[6]) { - beta = 0.6f; + beta[co] = 0.6f; n6++; } else if (WavCL < mea[7]) { - beta = 0.4f; + beta[co] = 0.4f; n7++; } else if (WavCL < mea[8]) { - beta = 0.2f; // + 2 sigma + beta[co] = 0.2f; // + 2 sigma n8++; } else if (WavCL < mea[9]) { - beta = 0.1f; + beta[co] = 0.1f; n9++; } else { - beta = 0.01f; + beta[co] = 0.01f; n10++; } @@ -2474,15 +2477,18 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * klev = (wavblcurve[lvl * 55.5f]); - klev *= beta * 100.f / skip; + // klev *= beta * 100.f / skip; + klev *= 100.f / skip; boxblur(bef, aft, klev, Wlvl_L, Hlvl_L, false); for (int co = 0; co < Hlvl_L * Wlvl_L; co++) { + aft[co] = bef[co] * (1.f - beta[co]) + aft[co] * beta[co]; WavCoeffs_L[dir][co] = aft[co]; } delete[] bef; delete[] aft; + delete[] beta; } } } @@ -2738,8 +2744,11 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float float mea[10]; float effect = cp.bluwav; - float beta = 0.f; float offs = 1.f; + float * beta = new float[Wlvl_ab * Hlvl_ab]; + for (int co = 0; co < Wlvl_ab * Hlvl_ab; co++) { + beta[co] = 1.f; + } calceffect(lvl, meanab, sigmaab, mea, effect, offs); @@ -2752,27 +2761,27 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float float WavCab = std::fabs(WavCoeffs_ab[dir][co]); if (WavCab < mea[0]) { - beta = 0.05f; + beta[co] = 0.05f; } else if (WavCab < mea[1]) { - beta = 0.2f; + beta[co] = 0.2f; } else if (WavCab < mea[2]) { - beta = 0.7f; + beta[co] = 0.7f; } else if (WavCab < mea[3]) { - beta = 1.f; //standard + beta[co] = 1.f; //standard } else if (WavCab < mea[4]) { - beta = 1.f; + beta[co] = 1.f; } else if (WavCab < mea[5]) { - beta = 0.8f; //+sigma + beta[co] = 0.8f; //+sigma } else if (WavCab < mea[6]) { - beta = 0.6f; + beta[co] = 0.6f; } else if (WavCab < mea[7]) { - beta = 0.4f; + beta[co] = 0.4f; } else if (WavCab < mea[8]) { - beta = 0.2f; // + 2 sigma + beta[co] = 0.2f; // + 2 sigma } else if (WavCab < mea[9]) { - beta = 0.1f; + beta[co] = 0.1f; } else { - beta = 0.0f; + beta[co] = 0.0f; } @@ -2780,16 +2789,18 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float klev = (wavblcurve[lvl * 55.5f]); - klev *= beta * cp.chrwav * 100.f / skip; + klev *= cp.chrwav * 100.f / skip; boxblur(bef, aft, klev, Wlvl_ab, Hlvl_ab, false); for (int co = 0; co < Hlvl_ab * Wlvl_ab; co++) { + aft[co] = bef[co] * (1.f - beta[co]) + aft[co] * beta[co]; WavCoeffs_ab[dir][co] = aft[co]; } delete[] bef; delete[] aft; + delete[] beta; } From 62fd0a0401e779c896e4e1b1453dfdfe49b3dda2 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 14 Apr 2020 10:18:10 +0200 Subject: [PATCH 090/109] Wavelet - Add colored left bar to toning curve --- rtgui/wavelet.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 475c6d866..1d4ad8315 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -502,6 +502,12 @@ Wavelet::Wavelet() : opacityShapeRG = static_cast(opaCurveEditorG->addCurve(CT_Flat, "", nullptr, false, false)); opacityShapeRG->setIdentityValue(0.); opacityShapeRG->setResetCurve(FlatCurveType(default_params.opacityCurveRG.at(0)), default_params.opacityCurveRG); + //from green to magenta + std::vector mileston = { + GradientMilestone(0., 0., 1., 0.), + GradientMilestone(1., 1., 0., 1.) + }; + opacityShapeRG->setLeftBarBgGradient(mileston); opaCurveEditorG->curveListComplete(); opaCurveEditorG->show(); @@ -513,6 +519,12 @@ Wavelet::Wavelet() : opacityShapeBY = static_cast(opacityCurveEditorG->addCurve(CT_Flat, "", nullptr, false, false)); opacityShapeBY->setIdentityValue(0.); opacityShapeBY->setResetCurve(FlatCurveType(default_params.opacityCurveBY.at(0)), default_params.opacityCurveBY); + //from blue to yellow + mileston = { + GradientMilestone(0., 0., 0., 1.), + GradientMilestone(1., 1., 1., 0.) + }; + opacityShapeBY->setLeftBarBgGradient(mileston); opacityCurveEditorG->curveListComplete(); opacityCurveEditorG->show(); From ad207e003caeba2dc5dae90e9968ede5cc7d3528 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 14 Apr 2020 13:08:02 +0200 Subject: [PATCH 091/109] Wavelet Improve Chroma with link contrast levels --- rtengine/ipwavelet.cc | 46 ++++++++++++++++++++++++++++++++++++------- rtgui/wavelet.cc | 6 +++--- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 92fe16f98..f6055a3e1 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -2416,6 +2416,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * float effect = cp.bluwav; float offs = 1.f; float * beta = new float[Wlvl_L * Hlvl_L]; + for (int co = 0; co < Hlvl_L * Wlvl_L; co++) { beta[co] = 1.f; } @@ -2477,7 +2478,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * klev = (wavblcurve[lvl * 55.5f]); - // klev *= beta * 100.f / skip; + // klev *= beta * 100.f / skip; klev *= 100.f / skip; boxblur(bef, aft, klev, Wlvl_L, Hlvl_L, false); @@ -2746,6 +2747,7 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float float effect = cp.bluwav; float offs = 1.f; float * beta = new float[Wlvl_ab * Hlvl_ab]; + for (int co = 0; co < Wlvl_ab * Hlvl_ab; co++) { beta[co] = 1.f; } @@ -3887,13 +3889,43 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f //to adjust increase contrast with local contrast bool useSkinControl = (skinprot != 0.f); + float mea[10]; + float effect = cp.sigmacol; + float betaab = 1.f; + float offs = 1.f; + float alphaC = 1.f; - - - - float alphaC = (1024.f + 15.f * cpMul * cpChrom / 50.f) / 1024.f ; + calceffect(level, meanab, sigmaab, mea, effect, offs); for (int i = 0; i < W_ab * H_ab; i++) { + float WavCab = std::fabs(WavCoeffs_ab[dir][i]); + + if (WavCab < mea[0]) { + betaab = 0.05f; + } else if (WavCab < mea[1]) { + betaab = 0.2f; + } else if (WavCab < mea[2]) { + betaab = 0.7f; + } else if (WavCab < mea[3]) { + betaab = 1.f; //standard + } else if (WavCab < mea[4]) { + betaab = 1.f; + } else if (WavCab < mea[5]) { + betaab = 0.8f; //+sigma + } else if (WavCab < mea[6]) { + betaab = 0.6f; + } else if (WavCab < mea[7]) { + betaab = 0.4f; + } else if (WavCab < mea[8]) { + betaab = 0.2f; // + 2 sigma + } else if (WavCab < mea[9]) { + betaab = 0.1f; + } else { + betaab = 0.0f; + } + + float scale = 1.f; + if (useSkinControl) { int ii = i / W_ab; int jj = i - ii * W_ab; @@ -3901,7 +3933,6 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f float modhue = varhue[ii][jj]; float modchro = varchrom[ii * 2][jj * 2]; // hue chroma skin with initial lab data - float scale = 1.f; if (skinprot > 0.f) { Color::SkinSatCbdl2(LL100, modhue, modchro, skinprot, scale, true, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 0); //0 for skin and extand @@ -3910,9 +3941,10 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f scale = (scale == 1.f) ? factorHard : 1.f; } - alphaC = (1024.f + 15.f * cpMul * cpChrom * scale / 50.f) / 1024.f ; } + alphaC = (1024.f + 15.f * cpMul * cpChrom * betaab * scale / 50.f) / 1024.f ; + WavCoeffs_ab[dir][i] *= alphaC; } } diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 1d4ad8315..d84277693 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -2426,7 +2426,7 @@ void Wavelet::CHmethodUpdateUI() if (!batchMode) { if (CHmethod->get_active_row_number() == 0) { CHSLmethod->show(); - sigmacol->show(); + // sigmacol->show(); pastlev->hide(); satlev->hide(); chroma->hide(); @@ -2446,7 +2446,7 @@ void Wavelet::CHmethodUpdateUI() } } else if (CHmethod->get_active_row_number() == 1) { CHSLmethod->show(); - sigmacol->show(); + // sigmacol->show(); pastlev->show(); satlev->show(); chroma->show(); @@ -2466,7 +2466,7 @@ void Wavelet::CHmethodUpdateUI() } } else { chro->show(); - sigmacol->hide(); + // sigmacol->hide(); pastlev->hide(); satlev->hide(); chroma->hide(); From feb2c7c77f78d59c9cf12c11c95d81097190b16f Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 14 Apr 2020 16:20:15 +0200 Subject: [PATCH 092/109] Improve GUI final Touchup --- rtdata/languages/default | 1 + rtgui/wavelet.cc | 24 +++++++++++++----------- rtgui/wavelet.h | 1 + 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 8d4472f04..10fb47e89 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2209,6 +2209,7 @@ TP_WAVELET_DAUB6;D6 - standard plus TP_WAVELET_DAUB10;D10 - medium TP_WAVELET_DAUB14;D14 - high TP_WAVELET_DAUB_TOOLTIP;Changes Daubechies coefficients:\nD4 = Standard,\nD14 = Often best performance, 10% more time-intensive.\n\nAffects edge detection as well as the general quality of the firsts levels. However the quality is not strictly related to this coefficient and can vary with images and uses. +TP_WAVELET_DIRFRAME;Directional contrast TP_WAVELET_DONE;Vertical TP_WAVELET_DTHR;Diagonal TP_WAVELET_DTWO;Horizontal diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index d84277693..1649b0afe 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -166,6 +166,7 @@ Wavelet::Wavelet() : chromaFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_CHROMAFRAME")))), chroFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_CHROFRAME")))), fincFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_FINCFRAME")))), + dirFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_DIRFRAME")))), wavLabels(Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER))), labmC(Gtk::manage(new Gtk::Label(M("TP_WAVELET_CTYPE") + ":"))), labmNP(Gtk::manage(new Gtk::Label(M("TP_WAVELET_NPTYPE") + ":"))), @@ -1034,20 +1035,18 @@ Wavelet::Wavelet() : fincBox->pack_start(*sigmafin); fincFrame->add(*fincBox); + dirFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const dirBox = Gtk::manage(new ToolParamBlock()); + dirBox->pack_start(*ctboxBA); + dirBox->pack_start(*balance); + dirBox->pack_start(*opacityCurveEditorW, Gtk::PACK_SHRINK, 2); + dirBox->pack_start(*iter); + dirBox->pack_start(*tmr); + dirFrame->add(*dirBox); ToolParamBlock* const finalBox = Gtk::manage(new ToolParamBlock()); + finalBox->pack_start(*dirFrame); - finalBox->pack_start(*ctboxBA); - finalBox->pack_start(*balance); - - finalBox->pack_start(*opacityCurveEditorW, Gtk::PACK_SHRINK, 2); - - finalBox->pack_start(*iter); - - finalBox->pack_start(*tmr); -// finalBox->pack_start(*separatorbalend, Gtk::PACK_SHRINK, 2); -// finalBox->pack_start(*opacityCurveEditorWL, Gtk::PACK_SHRINK, 2); -// finalBox->pack_start(*sigmafin); finalBox->pack_start(*fincFrame); finalBox->pack_start(*curveEditorG, Gtk::PACK_SHRINK, 4); finalBox->pack_start(*softradend); @@ -2568,15 +2567,18 @@ void Wavelet::BAmethodUpdateUI() balance->hide(); opacityCurveEditorW->hide(); iter->hide(); + tmr->hide(); } else if (BAmethod->get_active_row_number() == 1) { //sli opacityCurveEditorW->hide(); balance->show(); iter->show(); + tmr->show(); } else if (BAmethod->get_active_row_number() == 2) { //CU opacityCurveEditorW->show(); balance->hide(); iter->show(); + tmr->show(); } } } diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index 4a4947b2a..644d8f6b9 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -301,6 +301,7 @@ private: Gtk::Frame* const chromaFrame; Gtk::Frame* const chroFrame; Gtk::Frame* const fincFrame; + Gtk::Frame* const dirFrame; Gtk::Label* const wavLabels; Gtk::Label* const labmC; From b0f73d7cd3329d2fbcc5a5d6699bf4e6d4ca1eb9 Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 15 Apr 2020 08:48:18 +0200 Subject: [PATCH 093/109] Wavelet - added damper to directionnal contrast --- rtdata/languages/default | 1 + rtengine/ipwavelet.cc | 53 +++++++++++++++++++++++++++++++++++++--- rtengine/procparams.cc | 4 +++ rtengine/procparams.h | 1 + rtgui/paramsedited.cc | 6 +++++ rtgui/paramsedited.h | 1 + rtgui/wavelet.cc | 14 +++++++++++ rtgui/wavelet.h | 2 ++ 8 files changed, 79 insertions(+), 3 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 10fb47e89..21b3da555 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -820,6 +820,7 @@ HISTORY_MSG_EDGEFFECT;Edge Damper HISTORY_MSG_SIGMAFIN;Final contrast Damper HISTORY_MSG_SIGMATON;Toning Damper HISTORY_MSG_SIGMACOL;Chroma Damper +HISTORY_MSG_SIGMADIR;Dir Damper HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index f6055a3e1..f53ad083f 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -116,6 +116,7 @@ struct cont_params { float sigmafin; float sigmaton; float sigmacol; + float sigmadir; int ite; int contmet; bool opaW; @@ -197,6 +198,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.sigmafin = params->wavelet.sigmafin; cp.sigmaton = params->wavelet.sigmaton; cp.sigmacol = params->wavelet.sigmacol; + cp.sigmadir = params->wavelet.sigmadir; if (params->wavelet.TMmethod == "cont") { cp.contmet = 1; @@ -3768,7 +3770,52 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz } if (cp.bam && cp.finena) { + float effect = cp.sigmadir; + float offs = 1.f; + float mea[10]; + float * beta = new float[W_L * H_L]; + + for (int co = 0; co < H_L * W_L; co++) { + beta[co] = 1.f; + } + + calceffect(level, mean, sigma, mea, effect, offs); + + + for (int co = 0; co < H_L * W_L; co++) { + float WavCL = std::fabs(WavCoeffs_L[dir][co]); + + if (WavCL < mea[0]) { + beta[co] = 0.05f; + } else if (WavCL < mea[1]) { + beta[co] = 0.2f; + } else if (WavCL < mea[2]) { + beta[co] = 0.7f; + } else if (WavCL < mea[3]) { + beta[co] = 1.f; //standard + } else if (WavCL < mea[4]) { + beta[co] = 1.f; + } else if (WavCL < mea[5]) { + beta[co] = 0.8f; //+sigma + } else if (WavCL < mea[6]) { + beta[co] = 0.6f; + } else if (WavCL < mea[7]) { + beta[co] = 0.4f; + } else if (WavCL < mea[8]) { + beta[co] = 0.2f; // + 2 sigma + } else if (WavCL < mea[9]) { + beta[co] = 0.1f; + } else { + beta[co] = 0.01f; + } + } + + if (cp.opaW && cp.BAmet == 2) { + + + + int iteration = cp.ite; int itplus = 7 + iteration; int itmoins = 7 - iteration; @@ -3804,7 +3851,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz kba = 1.f - k2; } - WavCoeffs_L[dir][i] *= (kba); + WavCoeffs_L[dir][i] *= (1.f + (kba -1.f) * beta[i]); } } } @@ -3863,11 +3910,11 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz kba = 1.f - bal / k2; } - WavCoeffs_L[dir][i] *= (kba); + WavCoeffs_L[dir][i] *= (1.f + (kba -1.f) * beta[i]); } } } - + delete[] beta; } // to see each level of wavelet ...level from 0 to 8 diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 7b6a8f123..110d9368f 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2266,6 +2266,7 @@ WaveletParams::WaveletParams() : sigmafin(1.0), sigmaton(1.0), sigmacol(1.0), + sigmadir(1.0), iter(0), expcontrast(false), expchroma(false), @@ -2383,6 +2384,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && sigmafin == other.sigmafin && sigmaton == other.sigmaton && sigmacol == other.sigmacol + && sigmadir == other.sigmadir && iter == other.iter && expcontrast == other.expcontrast && expchroma == other.expchroma @@ -3529,6 +3531,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.sigmafin, "Wavelet", "Sigmafin", wavelet.sigmafin, keyFile); saveToKeyfile(!pedited || pedited->wavelet.sigmaton, "Wavelet", "Sigmaton", wavelet.sigmaton, keyFile); saveToKeyfile(!pedited || pedited->wavelet.sigmacol, "Wavelet", "Sigmacol", wavelet.sigmacol, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.sigmadir, "Wavelet", "Sigmadir", wavelet.sigmadir, keyFile); saveToKeyfile(!pedited || pedited->wavelet.iter, "Wavelet", "Iter", wavelet.iter, keyFile); saveToKeyfile(!pedited || pedited->wavelet.thres, "Wavelet", "MaxLev", wavelet.thres, keyFile); saveToKeyfile(!pedited || pedited->wavelet.Tilesmethod, "Wavelet", "TilesMethod", wavelet.Tilesmethod, keyFile); @@ -4712,6 +4715,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "Sigmafin", pedited, wavelet.sigmafin, pedited->wavelet.sigmafin); assignFromKeyfile(keyFile, "Wavelet", "Sigmaton", pedited, wavelet.sigmaton, pedited->wavelet.sigmaton); assignFromKeyfile(keyFile, "Wavelet", "Sigmacol", pedited, wavelet.sigmacol, pedited->wavelet.sigmacol); + assignFromKeyfile(keyFile, "Wavelet", "Sigmadir", pedited, wavelet.sigmadir, pedited->wavelet.sigmadir); assignFromKeyfile(keyFile, "Wavelet", "Iter", pedited, wavelet.iter, pedited->wavelet.iter); assignFromKeyfile(keyFile, "Wavelet", "Median", pedited, wavelet.median, pedited->wavelet.median); assignFromKeyfile(keyFile, "Wavelet", "Medianlev", pedited, wavelet.medianlev, pedited->wavelet.medianlev); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 536f260bc..cd09c2e6d 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1224,6 +1224,7 @@ struct WaveletParams { double sigmafin; double sigmaton; double sigmacol; + double sigmadir; int iter; bool expcontrast; bool expchroma; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 8a97681e4..a367b3db4 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -478,6 +478,7 @@ void ParamsEdited::set(bool v) wavelet.sigmafin = v; wavelet.sigmaton = v; wavelet.sigmacol = v; + wavelet.sigmadir = v; wavelet.median = v; wavelet.medianlev = v; wavelet.linkedg = v; @@ -1092,6 +1093,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.sigmafin = wavelet.sigmafin && p.wavelet.sigmafin == other.wavelet.sigmafin; wavelet.sigmaton = wavelet.sigmaton && p.wavelet.sigmaton == other.wavelet.sigmaton; wavelet.sigmacol = wavelet.sigmacol && p.wavelet.sigmacol == other.wavelet.sigmacol; + wavelet.sigmadir = wavelet.sigmadir && p.wavelet.sigmadir == other.wavelet.sigmadir; wavelet.median = wavelet.median && p.wavelet.median == other.wavelet.median; wavelet.medianlev = wavelet.medianlev && p.wavelet.medianlev == other.wavelet.medianlev; wavelet.linkedg = wavelet.linkedg && p.wavelet.linkedg == other.wavelet.linkedg; @@ -2915,6 +2917,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.sigmacol = mods.wavelet.sigmacol; } + if (wavelet.sigmadir) { + toEdit.wavelet.sigmadir = mods.wavelet.sigmadir; + } + if (wavelet.iter) { toEdit.wavelet.iter = mods.wavelet.iter; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index c17ea52c7..2cb4aa943 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -502,6 +502,7 @@ struct WaveletParamsEdited { bool sigmafin; bool sigmaton; bool sigmacol; + bool sigmadir; bool median; bool medianlev; bool linkedg; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 1649b0afe..3805ed4c6 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -115,6 +115,7 @@ Wavelet::Wavelet() : sigmafin(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMAFIN"), 0.025, 2.5, 0.01, 1.))), sigmaton(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMAFIN"), 0.025, 2.5, 0.01, 1.))), sigmacol(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMAFIN"), 0.025, 2.5, 0.01, 1.))), + sigmadir(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMAFIN"), 0.025, 2.5, 0.01, 1.))), hueskin(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_HUESKIN"), -314., 314., -5., 25., 170., 120., 0, false))), hueskin2(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_HUESKY"), -314., 314., -260., -250, -130., -140., 0, false))), hllev(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_HIGHLIGHT"), 0., 100., 50., 75., 100., 98., 0, false))), @@ -215,6 +216,7 @@ Wavelet::Wavelet() : EvWavsigmafin = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SIGMAFIN"); EvWavsigmaton = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SIGMATON"); EvWavsigmacol = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SIGMACOL"); + EvWavsigmadir = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SIGMADIR"); expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings)); @@ -1001,6 +1003,7 @@ Wavelet::Wavelet() : iter->setAdjusterListener(this); iter->set_tooltip_text(M("TP_WAVELET_ITER_TOOLTIP")); + sigmadir->setAdjusterListener(this); // Gtk::HSeparator* const separatorbalend = Gtk::manage(new Gtk::HSeparator()); @@ -1041,6 +1044,7 @@ Wavelet::Wavelet() : dirBox->pack_start(*balance); dirBox->pack_start(*opacityCurveEditorW, Gtk::PACK_SHRINK, 2); dirBox->pack_start(*iter); + dirBox->pack_start(*sigmadir); dirBox->pack_start(*tmr); dirFrame->add(*dirBox); @@ -1454,6 +1458,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) sigmafin->setValue(pp->wavelet.sigmafin); sigmaton->setValue(pp->wavelet.sigmaton); sigmacol->setValue(pp->wavelet.sigmacol); + sigmadir->setValue(pp->wavelet.sigmadir); for (int i = 0; i < 9; i++) { correction[i]->setValue(pp->wavelet.c[i]); @@ -1574,6 +1579,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) sigmafin->setEditedState(pedited->wavelet.sigmafin ? Edited : UnEdited); sigmaton->setEditedState(pedited->wavelet.sigmaton ? Edited : UnEdited); sigmacol->setEditedState(pedited->wavelet.sigmacol ? Edited : UnEdited); + sigmadir->setEditedState(pedited->wavelet.sigmadir ? Edited : UnEdited); threshold->setEditedState(pedited->wavelet.threshold ? Edited : UnEdited); threshold2->setEditedState(pedited->wavelet.threshold2 ? Edited : UnEdited); edgedetect->setEditedState(pedited->wavelet.edgedetect ? Edited : UnEdited); @@ -1848,6 +1854,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.sigmafin = sigmafin->getValue(); pp->wavelet.sigmaton = sigmaton->getValue(); pp->wavelet.sigmacol = sigmacol->getValue(); + pp->wavelet.sigmadir = sigmadir->getValue(); for (int i = 0; i < 9; i++) { pp->wavelet.c[i] = (int) correction[i]->getValue(); @@ -1957,6 +1964,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.sigmafin = sigmafin->getEditedState(); pedited->wavelet.sigmaton = sigmaton->getEditedState(); pedited->wavelet.sigmacol = sigmacol->getEditedState(); + pedited->wavelet.sigmadir = sigmadir->getEditedState(); pedited->wavelet.wavclCurve = !clshape->isUnChanged(); pedited->wavelet.expcontrast = !expcontrast->get_inconsistent(); pedited->wavelet.expchroma = !expchroma->get_inconsistent(); @@ -2140,6 +2148,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit sigmafin->setDefault(defParams->wavelet.sigmafin); sigmaton->setDefault(defParams->wavelet.sigmaton); sigmacol->setDefault(defParams->wavelet.sigmacol); + sigmadir->setDefault(defParams->wavelet.sigmadir); sigma->setDefault(defParams->wavelet.sigma); offset->setDefault(defParams->wavelet.offset); lowthr->setDefault(defParams->wavelet.lowthr); @@ -2265,6 +2274,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit sigmafin->setDefaultEditedState(pedited->wavelet.sigmafin ? Edited : UnEdited); sigmaton->setDefaultEditedState(pedited->wavelet.sigmaton ? Edited : UnEdited); sigmacol->setDefaultEditedState(pedited->wavelet.sigmacol ? Edited : UnEdited); + sigmadir->setDefaultEditedState(pedited->wavelet.sigmadir ? Edited : UnEdited); level0noise->setDefaultEditedState(pedited->wavelet.level0noise ? Edited : UnEdited); level1noise->setDefaultEditedState(pedited->wavelet.level1noise ? Edited : UnEdited); level2noise->setDefaultEditedState(pedited->wavelet.level2noise ? Edited : UnEdited); @@ -2330,6 +2340,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit sigmafin->setDefaultEditedState(Irrelevant); sigmaton->setDefaultEditedState(Irrelevant); sigmacol->setDefaultEditedState(Irrelevant); + sigmadir->setDefaultEditedState(Irrelevant); for (int i = 0; i < 9; i++) { correction[i]->setDefaultEditedState(Irrelevant); @@ -2871,6 +2882,7 @@ void Wavelet::setBatchMode(bool batchMode) sigmafin->showEditedCB(); sigmaton->showEditedCB(); sigmacol->showEditedCB(); + sigmadir->showEditedCB(); level0noise->showEditedCB(); level1noise->showEditedCB(); level2noise->showEditedCB(); @@ -3026,6 +3038,8 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavsigmaton, sigmaton->getTextValue()); } else if (a == sigmacol) { listener->panelChanged(EvWavsigmacol, sigmacol->getTextValue()); + } else if (a == sigmadir) { + listener->panelChanged(EvWavsigmadir, sigmadir->getTextValue()); } else if (a == greenhigh) { listener->panelChanged(EvWavgreenhigh, greenhigh->getTextValue()); } else if (a == bluehigh) { diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index 644d8f6b9..b235cde47 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -96,6 +96,7 @@ private: rtengine::ProcEvent EvWavsigmafin; rtengine::ProcEvent EvWavsigmaton; rtengine::ProcEvent EvWavsigmacol; + rtengine::ProcEvent EvWavsigmadir; void foldAllButMe(GdkEventButton* event, MyExpander *expander); @@ -224,6 +225,7 @@ private: Adjuster* const sigmafin; Adjuster* const sigmaton; Adjuster* const sigmacol; + Adjuster* const sigmadir; Adjuster* greenlow; Adjuster* bluelow; From a481b18e94cad95a380db0b19c43b6545191b717 Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 15 Apr 2020 15:37:13 +0200 Subject: [PATCH 094/109] Save provisory work on toning --- rtdata/languages/default | 4 +++ rtengine/ipwavelet.cc | 75 ++++++++++++++++++++++++++++++++++++++-- rtengine/procparams.cc | 28 +++++++++++++++ rtengine/procparams.h | 10 +++++- rtgui/paramsedited.cc | 36 +++++++++++++++++++ rtgui/paramsedited.h | 7 ++++ rtgui/wavelet.cc | 58 +++++++++++++++++++++++++++++++ rtgui/wavelet.h | 12 ++++++- 8 files changed, 225 insertions(+), 5 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 21b3da555..5627dab4c 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -821,6 +821,8 @@ HISTORY_MSG_SIGMAFIN;Final contrast Damper HISTORY_MSG_SIGMATON;Toning Damper HISTORY_MSG_SIGMACOL;Chroma Damper HISTORY_MSG_SIGMADIR;Dir Damper +HISTORY_MSG_RANGEAB;Range ab +HISTORY_MSG_PROTAB;Protection HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -2287,7 +2289,9 @@ TP_WAVELET_OPACITYWL;Local contrast TP_WAVELET_OPACITYWL_TOOLTIP;Modify the final local contrast at the end of the wavelet treatment.\n\nThe left side represents the smallest local contrast, progressing to the largest local contrast on the right. TP_WAVELET_PASTEL;Pastel chroma TP_WAVELET_PROC;Process +TP_WAVELET_PROTAB;Protection TP_WAVELET_RADIUS;Radius Shadows - Highlight +TP_WAVELET_RANGEAB;Range a and b % TP_WAVELET_RE1;Reinforced TP_WAVELET_RE2;Unchanged TP_WAVELET_RE3;Reduced diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index f53ad083f..5b170ff9b 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -146,6 +146,19 @@ struct cont_params { float balchrom; float chromfi; float chromco; + float factor; + float scaling; + float scaledirect; + float a_scale; + float a_base; + float b_scale; + float b_base; + float a_high; + float a_low; + float b_high; + float b_low; + float rangeab; + float protab; }; int wavNestedLevels = 1; @@ -318,6 +331,20 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.mulC[m] = waparams.ch[m]; } + cp.factor = WaveletParams::LABGRID_CORR_MAX * 3.276f; + cp.scaling = WaveletParams::LABGRID_CORR_SCALE; + cp.scaledirect = WaveletParams::LABGRIDL_DIRECT_SCALE; + cp.a_scale = (params->wavelet.labgridAHigh - params->wavelet.labgridALow) / cp.factor / cp.scaling; + cp.a_base = params->wavelet.labgridALow / cp.scaling; + cp.b_scale = (params->wavelet.labgridBHigh - params->wavelet.labgridBLow) / cp.factor / cp.scaling; + cp.b_base = params->wavelet.labgridBLow / cp.scaling; + cp.a_high = 3.276f * params->wavelet.labgridAHigh; + cp.a_low = 3.276f * params->wavelet.labgridALow; + cp.b_high = 3.276f * params->wavelet.labgridBHigh; + cp.b_low = 3.276f * params->wavelet.labgridBLow; + cp.rangeab = params->wavelet.rangeab; + cp.protab = params->wavelet.protab; + if (waOpacityCurveRG) { cp.opaRG = true; } @@ -3851,7 +3878,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz kba = 1.f - k2; } - WavCoeffs_L[dir][i] *= (1.f + (kba -1.f) * beta[i]); + WavCoeffs_L[dir][i] *= (1.f + (kba - 1.f) * beta[i]); } } } @@ -3910,10 +3937,11 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz kba = 1.f - bal / k2; } - WavCoeffs_L[dir][i] *= (1.f + (kba -1.f) * beta[i]); + WavCoeffs_L[dir][i] *= (1.f + (kba - 1.f) * beta[i]); } } } + delete[] beta; } @@ -4131,6 +4159,25 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f float effect = cp.sigmaton; float betaab = 0.f; float offs = 1.f; + float protec = 0.01f * cp.protab; + // printf("rangeab=%f \n", 0.01f * cp.rangeab); + // printf("protab=%f \n", 0.01f * cp.protab); + float aref1 = cp.a_high; + float bref1 = cp.b_high; + float aref2 = cp.a_low; + float bref2 = cp.b_low; + // printf("a1=%f b1=%f a2=%f b2=%f\n", aref1, bref1, aref2, bref2); + + float arefplus1 = aref1 * (1.f + 0.1f * cp.rangeab); + float arefmoins1 = aref1 * (1.f - 0.1f * cp.rangeab); + float brefplus1 = bref1 * (1.f + 0.1f * cp.rangeab); + float brefmoins1 = bref1 * (1.f - 0.1f * cp.rangeab); + // printf("a1+=%f a1-=%f b+=%f b-=%f\n", arefplus1, arefmoins1, brefplus1, brefmoins1); + + float arefplus2 = aref2 * (1.f + 0.1f * cp.rangeab); + float arefmoins2 = aref2 * (1.f - 0.1f * cp.rangeab); + float brefplus2 = bref2 * (1.f + 0.1f * cp.rangeab); + float brefmoins2 = bref2 * (1.f - 0.1f * cp.rangeab); calceffect(level, meanab, sigmaab, mea, effect, offs); @@ -4161,8 +4208,30 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f betaab = 0.0f; } + float kreduc1 = 1.f; + float kreduc2 = 1.f; + int ii = co / W_ab; + int jj = co - ii * W_ab; + cp.protab = 0.f;// always disabled provisory... + if (cp.protab > 0.f) { - float beta = (1024.f + 50.f * mulOpacity * betaab) / 1024.f ; + if ((labco->a[ii * 2][jj * 2] > arefmoins1) && (labco->a[ii * 2][jj * 2] < arefplus1) + && (labco->b[ii * 2][jj * 2] > brefmoins1) && (labco->b[ii * 2][jj * 2] < brefplus1)) { + kreduc1 = protec; + // printf("p "); + } + + if ((labco->a[ii * 2][jj * 2] > arefmoins2) && (labco->a[ii * 2][jj * 2] < arefplus2) + && (labco->b[ii * 2][jj * 2] > brefmoins2) && (labco->b[ii * 2][jj * 2] < brefplus2)) { + kreduc2 = protec; + // printf("P "); + } + + + // printf("pa1=%f pa2=%f\n", kreduc1, kredu2); + } + + float beta = (1024.f + 50.f * mulOpacity * betaab * kreduc1 * kreduc2) / 1024.f ; WavCoeffs_ab[dir][co] *= beta; } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 110d9368f..e1765a5f0 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2148,6 +2148,10 @@ bool ColorManagementParams::operator !=(const ColorManagementParams& other) cons return !(*this == other); } +const double WaveletParams::LABGRID_CORR_MAX = 12800.f; +const double WaveletParams::LABGRID_CORR_SCALE = 3.276f; +const double WaveletParams::LABGRIDL_DIRECT_SCALE = 41950.; + WaveletParams::WaveletParams() : ccwcurve{ static_cast(FCT_MinMaxCPoints), @@ -2267,6 +2271,8 @@ WaveletParams::WaveletParams() : sigmaton(1.0), sigmacol(1.0), sigmadir(1.0), + rangeab(20.0), + protab(0.0), iter(0), expcontrast(false), expchroma(false), @@ -2279,6 +2285,10 @@ WaveletParams::WaveletParams() : exptoning(false), expnoise(false), expclari(false), + labgridALow(0.0), + labgridBLow(0.0), + labgridAHigh(0.0), + labgridBHigh(0.0), Lmethod(4), CLmethod("all"), Backmethod("grey"), @@ -2385,7 +2395,13 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && sigmaton == other.sigmaton && sigmacol == other.sigmacol && sigmadir == other.sigmadir + && rangeab == other.rangeab + && protab == other.protab && iter == other.iter + && labgridALow == other.labgridALow + && labgridBLow == other.labgridBLow + && labgridAHigh == other.labgridAHigh + && labgridBHigh == other.labgridBHigh && expcontrast == other.expcontrast && expchroma == other.expchroma && [this, &other]() -> bool @@ -3532,6 +3548,8 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.sigmaton, "Wavelet", "Sigmaton", wavelet.sigmaton, keyFile); saveToKeyfile(!pedited || pedited->wavelet.sigmacol, "Wavelet", "Sigmacol", wavelet.sigmacol, keyFile); saveToKeyfile(!pedited || pedited->wavelet.sigmadir, "Wavelet", "Sigmadir", wavelet.sigmadir, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.rangeab, "Wavelet", "Rangeab", wavelet.rangeab, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.protab, "Wavelet", "Protab", wavelet.protab, keyFile); saveToKeyfile(!pedited || pedited->wavelet.iter, "Wavelet", "Iter", wavelet.iter, keyFile); saveToKeyfile(!pedited || pedited->wavelet.thres, "Wavelet", "MaxLev", wavelet.thres, keyFile); saveToKeyfile(!pedited || pedited->wavelet.Tilesmethod, "Wavelet", "TilesMethod", wavelet.Tilesmethod, keyFile); @@ -3563,6 +3581,10 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.exptoning, "Wavelet", "Exptoning", wavelet.exptoning, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expnoise, "Wavelet", "Expnoise", wavelet.expnoise, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expclari, "Wavelet", "Expclari", wavelet.expclari, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.labgridALow, "Wavelet", "LabGridALow", wavelet.labgridALow, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.labgridBLow, "Wavelet", "LabGridBLow", wavelet.labgridBLow, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.labgridAHigh, "Wavelet", "LabGridAHigh", wavelet.labgridAHigh, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.labgridBHigh, "Wavelet", "LabGridBHigh", wavelet.labgridBHigh, keyFile); for (int i = 0; i < 9; i++) { std::stringstream ss; @@ -4716,6 +4738,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "Sigmaton", pedited, wavelet.sigmaton, pedited->wavelet.sigmaton); assignFromKeyfile(keyFile, "Wavelet", "Sigmacol", pedited, wavelet.sigmacol, pedited->wavelet.sigmacol); assignFromKeyfile(keyFile, "Wavelet", "Sigmadir", pedited, wavelet.sigmadir, pedited->wavelet.sigmadir); + assignFromKeyfile(keyFile, "Wavelet", "Rangeab", pedited, wavelet.rangeab, pedited->wavelet.rangeab); + assignFromKeyfile(keyFile, "Wavelet", "Protab", pedited, wavelet.protab, pedited->wavelet.protab); assignFromKeyfile(keyFile, "Wavelet", "Iter", pedited, wavelet.iter, pedited->wavelet.iter); assignFromKeyfile(keyFile, "Wavelet", "Median", pedited, wavelet.median, pedited->wavelet.median); assignFromKeyfile(keyFile, "Wavelet", "Medianlev", pedited, wavelet.medianlev, pedited->wavelet.medianlev); @@ -4740,6 +4764,10 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "Showmask", pedited, wavelet.showmask, pedited->wavelet.showmask); assignFromKeyfile(keyFile, "Wavelet", "Oldsh", pedited, wavelet.oldsh, pedited->wavelet.oldsh); assignFromKeyfile(keyFile, "Wavelet", "TMr", pedited, wavelet.tmr, pedited->wavelet.tmr); + assignFromKeyfile(keyFile, "Wavelet", "LabGridALow", pedited, wavelet.labgridALow, pedited->wavelet.labgridALow); + assignFromKeyfile(keyFile, "Wavelet", "LabGridBLow", pedited, wavelet.labgridBLow, pedited->wavelet.labgridBLow); + assignFromKeyfile(keyFile, "Wavelet", "LabGridAHigh", pedited, wavelet.labgridAHigh, pedited->wavelet.labgridAHigh); + assignFromKeyfile(keyFile, "Wavelet", "LabGridBHigh", pedited, wavelet.labgridBHigh, pedited->wavelet.labgridBHigh); if (ppVersion < 331) { // wavelet.Lmethod was a string before version 331 Glib::ustring temp; diff --git a/rtengine/procparams.h b/rtengine/procparams.h index cd09c2e6d..24995525d 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1225,6 +1225,8 @@ struct WaveletParams { double sigmaton; double sigmacol; double sigmadir; + double rangeab; + double protab; int iter; bool expcontrast; bool expchroma; @@ -1237,7 +1239,13 @@ struct WaveletParams { bool exptoning; bool expnoise; bool expclari; - + double labgridALow; + double labgridBLow; + double labgridAHigh; + double labgridBHigh; + static const double LABGRID_CORR_MAX; + static const double LABGRID_CORR_SCALE; + static const double LABGRIDL_DIRECT_SCALE; int Lmethod; Glib::ustring CLmethod; Glib::ustring Backmethod; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index a367b3db4..85119fe80 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -479,6 +479,8 @@ void ParamsEdited::set(bool v) wavelet.sigmaton = v; wavelet.sigmacol = v; wavelet.sigmadir = v; + wavelet.rangeab = v; + wavelet.protab = v; wavelet.median = v; wavelet.medianlev = v; wavelet.linkedg = v; @@ -586,6 +588,10 @@ void ParamsEdited::set(bool v) wavelet.expresid = v; wavelet.exptoning = v; wavelet.expnoise = v; + wavelet.labgridALow = v; + wavelet.labgridBLow = v; + wavelet.labgridAHigh = v; + wavelet.labgridBHigh = v; for (int i = 0; i < 9; i++) { wavelet.c[i] = v; @@ -1094,6 +1100,8 @@ void ParamsEdited::initFrom(const std::vector& wavelet.sigmaton = wavelet.sigmaton && p.wavelet.sigmaton == other.wavelet.sigmaton; wavelet.sigmacol = wavelet.sigmacol && p.wavelet.sigmacol == other.wavelet.sigmacol; wavelet.sigmadir = wavelet.sigmadir && p.wavelet.sigmadir == other.wavelet.sigmadir; + wavelet.rangeab = wavelet.rangeab && p.wavelet.rangeab == other.wavelet.rangeab; + wavelet.protab = wavelet.protab && p.wavelet.protab == other.wavelet.protab; wavelet.median = wavelet.median && p.wavelet.median == other.wavelet.median; wavelet.medianlev = wavelet.medianlev && p.wavelet.medianlev == other.wavelet.medianlev; wavelet.linkedg = wavelet.linkedg && p.wavelet.linkedg == other.wavelet.linkedg; @@ -1197,6 +1205,10 @@ void ParamsEdited::initFrom(const std::vector& wavelet.exptoning = wavelet.exptoning && p.wavelet.exptoning == other.wavelet.exptoning; wavelet.expnoise = wavelet.expnoise && p.wavelet.expnoise == other.wavelet.expnoise; wavelet.expclari = wavelet.expclari && p.wavelet.expclari == other.wavelet.expclari; + wavelet.labgridALow = wavelet.labgridALow && p.wavelet.labgridALow == other.wavelet.labgridALow; + wavelet.labgridBLow = wavelet.labgridBLow && p.wavelet.labgridBLow == other.wavelet.labgridBLow; + wavelet.labgridAHigh = wavelet.labgridAHigh && p.wavelet.labgridAHigh == other.wavelet.labgridAHigh; + wavelet.labgridBHigh = wavelet.labgridBHigh && p.wavelet.labgridBHigh == other.wavelet.labgridBHigh; for (int level = 0; level < 9; ++level) { wavelet.c[level] = wavelet.c[level] && p.wavelet.c[level] == other.wavelet.c[level]; @@ -2897,6 +2909,22 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.enabled = mods.wavelet.enabled; } + if (wavelet.labgridALow) { + toEdit.wavelet.labgridALow = mods.wavelet.labgridALow; + } + + if (wavelet.labgridBLow) { + toEdit.wavelet.labgridBLow = mods.wavelet.labgridBLow; + } + + if (wavelet.labgridAHigh) { + toEdit.wavelet.labgridAHigh = mods.wavelet.labgridAHigh; + } + + if (wavelet.labgridBHigh) { + toEdit.wavelet.labgridBHigh = mods.wavelet.labgridBHigh; + } + if (wavelet.strength) { toEdit.wavelet.strength = mods.wavelet.strength; } @@ -2921,6 +2949,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.sigmadir = mods.wavelet.sigmadir; } + if (wavelet.rangeab) { + toEdit.wavelet.rangeab = mods.wavelet.rangeab; + } + + if (wavelet.protab) { + toEdit.wavelet.protab = mods.wavelet.protab; + } + if (wavelet.iter) { toEdit.wavelet.iter = mods.wavelet.iter; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 2cb4aa943..68340309d 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -503,6 +503,8 @@ struct WaveletParamsEdited { bool sigmaton; bool sigmacol; bool sigmadir; + bool rangeab; + bool protab; bool median; bool medianlev; bool linkedg; @@ -607,6 +609,11 @@ struct WaveletParamsEdited { bool exptoning; bool expnoise; bool expclari; + bool labgridALow; + bool labgridBLow; + bool labgridAHigh; + bool labgridBHigh; + }; struct DirPyrEqualizerParamsEdited { diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 3805ed4c6..08c4d6f4c 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -27,6 +27,7 @@ #include "rtimage.h" #include "options.h" #include "eventmapper.h" +#include "labgrid.h" #include "../rtengine/color.h" using namespace rtengine; @@ -116,6 +117,8 @@ Wavelet::Wavelet() : sigmaton(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMAFIN"), 0.025, 2.5, 0.01, 1.))), sigmacol(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMAFIN"), 0.025, 2.5, 0.01, 1.))), sigmadir(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMAFIN"), 0.025, 2.5, 0.01, 1.))), + rangeab(Gtk::manage(new Adjuster(M("TP_WAVELET_RANGEAB"), 0., 100., 0.1, 20.))), + protab(Gtk::manage(new Adjuster(M("TP_WAVELET_PROTAB"), 0., 100., 0.5, 0.))), hueskin(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_HUESKIN"), -314., 314., -5., 25., 170., 120., 0, false))), hueskin2(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_HUESKY"), -314., 314., -260., -250, -130., -140., 0, false))), hllev(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_HIGHLIGHT"), 0., 100., 50., 75., 100., 98., 0, false))), @@ -168,6 +171,7 @@ Wavelet::Wavelet() : chroFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_CHROFRAME")))), fincFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_FINCFRAME")))), dirFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_DIRFRAME")))), + tonFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_TONFRAME")))), wavLabels(Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER))), labmC(Gtk::manage(new Gtk::Label(M("TP_WAVELET_CTYPE") + ":"))), labmNP(Gtk::manage(new Gtk::Label(M("TP_WAVELET_NPTYPE") + ":"))), @@ -217,6 +221,11 @@ Wavelet::Wavelet() : EvWavsigmaton = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SIGMATON"); EvWavsigmacol = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SIGMACOL"); EvWavsigmadir = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SIGMADIR"); + EvWavLabGridValue = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVLABGRID_VALUE"); + EvWavrangeab = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_RANGEAB"); + EvWavprotab = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_PROTAB"); + + labgrid = Gtk::manage(new LabGrid(EvWavLabGridValue, M("TP_WAVELET_LABGRID_VALUES"))); expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings)); @@ -497,6 +506,8 @@ Wavelet::Wavelet() : // Toning ToolParamBlock* const tonBox = Gtk::manage(new ToolParamBlock()); sigmaton->setAdjusterListener(this); + rangeab->setAdjusterListener(this); + protab->setAdjusterListener(this); opaCurveEditorG->setCurveListener(this); @@ -515,6 +526,15 @@ Wavelet::Wavelet() : opaCurveEditorG->curveListComplete(); opaCurveEditorG->show(); tonBox->pack_start(*sigmaton); + + tonFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const ton2Box = Gtk::manage(new ToolParamBlock()); + ton2Box->pack_start(*labgrid, Gtk::PACK_EXPAND_WIDGET, 2); + ton2Box->pack_start(*rangeab); + ton2Box->pack_start(*protab); + tonFrame->add(*ton2Box); +// tonBox->pack_start(*tonFrame); + tonBox->pack_start(*opaCurveEditorG, Gtk::PACK_SHRINK, 2); opacityCurveEditorG->setCurveListener(this); @@ -1157,6 +1177,13 @@ void Wavelet::neutral_pressed() } } +void Wavelet::setListener(ToolPanelListener *tpl) +{ + ToolPanel::setListener(tpl); + labgrid->setListener(tpl); +} + + void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) { @@ -1443,6 +1470,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) mergeC->setValue(pp->wavelet.mergeC); softrad->setValue(pp->wavelet.softrad); softradend->setValue(pp->wavelet.softradend); + labgrid->setParams(pp->wavelet.labgridALow / WaveletParams::LABGRID_CORR_MAX, pp->wavelet.labgridBLow / WaveletParams::LABGRID_CORR_MAX, pp->wavelet.labgridAHigh / WaveletParams::LABGRID_CORR_MAX, pp->wavelet.labgridBHigh / WaveletParams::LABGRID_CORR_MAX, false); ballum->setValue(pp->wavelet.ballum); balchrom->setValue(pp->wavelet.balchrom); @@ -1459,6 +1487,8 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) sigmaton->setValue(pp->wavelet.sigmaton); sigmacol->setValue(pp->wavelet.sigmacol); sigmadir->setValue(pp->wavelet.sigmadir); + rangeab->setValue(pp->wavelet.rangeab); + protab->setValue(pp->wavelet.protab); for (int i = 0; i < 9; i++) { correction[i]->setValue(pp->wavelet.c[i]); @@ -1534,6 +1564,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) if (!pedited->wavelet.ushamethod) { ushamethod->set_active_text(M("GENERAL_UNCHANGED")); } + labgrid->setEdited(pedited->wavelet.labgridALow || pedited->wavelet.labgridBLow || pedited->wavelet.labgridAHigh || pedited->wavelet.labgridBHigh); set_inconsistent(multiImage && !pedited->wavelet.enabled); ccshape->setUnChanged(!pedited->wavelet.ccwcurve); @@ -1580,6 +1611,8 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) sigmaton->setEditedState(pedited->wavelet.sigmaton ? Edited : UnEdited); sigmacol->setEditedState(pedited->wavelet.sigmacol ? Edited : UnEdited); sigmadir->setEditedState(pedited->wavelet.sigmadir ? Edited : UnEdited); + rangeab->setEditedState(pedited->wavelet.rangeab ? Edited : UnEdited); + protab->setEditedState(pedited->wavelet.protab ? Edited : UnEdited); threshold->setEditedState(pedited->wavelet.threshold ? Edited : UnEdited); threshold2->setEditedState(pedited->wavelet.threshold2 ? Edited : UnEdited); edgedetect->setEditedState(pedited->wavelet.edgedetect ? Edited : UnEdited); @@ -1828,6 +1861,11 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.ballum = ballum->getValue(); pp->wavelet.chromfi = chromfi->getValue(); pp->wavelet.chromco = chromco->getValue(); + labgrid->getParams(pp->wavelet.labgridALow, pp->wavelet.labgridBLow, pp->wavelet.labgridAHigh, pp->wavelet.labgridBHigh); + pp->wavelet.labgridALow *= WaveletParams::LABGRID_CORR_MAX; + pp->wavelet.labgridAHigh *= WaveletParams::LABGRID_CORR_MAX; + pp->wavelet.labgridBLow *= WaveletParams::LABGRID_CORR_MAX; + pp->wavelet.labgridBHigh *= WaveletParams::LABGRID_CORR_MAX; pp->wavelet.greenlow = greenlow->getValue(); pp->wavelet.bluelow = bluelow->getValue(); @@ -1855,6 +1893,8 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.sigmaton = sigmaton->getValue(); pp->wavelet.sigmacol = sigmacol->getValue(); pp->wavelet.sigmadir = sigmadir->getValue(); + pp->wavelet.rangeab = rangeab->getValue(); + pp->wavelet.protab = protab->getValue(); for (int i = 0; i < 9; i++) { pp->wavelet.c[i] = (int) correction[i]->getValue(); @@ -1965,6 +2005,8 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.sigmaton = sigmaton->getEditedState(); pedited->wavelet.sigmacol = sigmacol->getEditedState(); pedited->wavelet.sigmadir = sigmadir->getEditedState(); + pedited->wavelet.rangeab = rangeab->getEditedState(); + pedited->wavelet.protab = protab->getEditedState(); pedited->wavelet.wavclCurve = !clshape->isUnChanged(); pedited->wavelet.expcontrast = !expcontrast->get_inconsistent(); pedited->wavelet.expchroma = !expchroma->get_inconsistent(); @@ -1975,6 +2017,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.exptoning = !exptoning->get_inconsistent(); pedited->wavelet.expnoise = !expnoise->get_inconsistent(); pedited->wavelet.expclari = !expclari->get_inconsistent(); + pedited->wavelet.labgridALow = pedited->wavelet.labgridBLow = pedited->wavelet.labgridAHigh = pedited->wavelet.labgridBHigh = labgrid->getEdited(); for (int i = 0; i < 9; i++) { pedited->wavelet.c[i] = correction[i]->getEditedState(); @@ -2150,6 +2193,8 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit sigmacol->setDefault(defParams->wavelet.sigmacol); sigmadir->setDefault(defParams->wavelet.sigmadir); sigma->setDefault(defParams->wavelet.sigma); + rangeab->setDefault(defParams->wavelet.rangeab); + protab->setDefault(defParams->wavelet.protab); offset->setDefault(defParams->wavelet.offset); lowthr->setDefault(defParams->wavelet.lowthr); rescon->setDefault(defParams->wavelet.rescon); @@ -2198,6 +2243,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit balchrom->setDefault(defParams->wavelet.balchrom); chromfi->setDefault(defParams->wavelet.chromfi); chromco->setDefault(defParams->wavelet.chromco); + labgrid->setDefault(defParams->wavelet.labgridALow / WaveletParams::LABGRID_CORR_MAX, defParams->wavelet.labgridBLow / WaveletParams::LABGRID_CORR_MAX, defParams->wavelet.labgridAHigh / WaveletParams::LABGRID_CORR_MAX, defParams->wavelet.labgridBHigh / WaveletParams::LABGRID_CORR_MAX); greenlow->setDefault(defParams->wavelet.greenlow); bluelow->setDefault(defParams->wavelet.bluelow); @@ -2225,6 +2271,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit balchrom->setDefaultEditedState(pedited->wavelet.balchrom ? Edited : UnEdited); chromfi->setDefaultEditedState(pedited->wavelet.chromfi ? Edited : UnEdited); chromco->setDefaultEditedState(pedited->wavelet.chromco ? Edited : UnEdited); + labgrid->setEdited((pedited->wavelet.labgridALow || pedited->wavelet.labgridBLow || pedited->wavelet.labgridAHigh || pedited->wavelet.labgridBHigh) ? Edited : UnEdited); sigma->setDefault(defParams->wavelet.sigma); offset->setDefault(defParams->wavelet.offset); @@ -2275,6 +2322,8 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit sigmaton->setDefaultEditedState(pedited->wavelet.sigmaton ? Edited : UnEdited); sigmacol->setDefaultEditedState(pedited->wavelet.sigmacol ? Edited : UnEdited); sigmadir->setDefaultEditedState(pedited->wavelet.sigmadir ? Edited : UnEdited); + rangeab->setDefaultEditedState(pedited->wavelet.rangeab ? Edited : UnEdited); + protab->setDefaultEditedState(pedited->wavelet.protab ? Edited : UnEdited); level0noise->setDefaultEditedState(pedited->wavelet.level0noise ? Edited : UnEdited); level1noise->setDefaultEditedState(pedited->wavelet.level1noise ? Edited : UnEdited); level2noise->setDefaultEditedState(pedited->wavelet.level2noise ? Edited : UnEdited); @@ -2341,6 +2390,9 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit sigmaton->setDefaultEditedState(Irrelevant); sigmacol->setDefaultEditedState(Irrelevant); sigmadir->setDefaultEditedState(Irrelevant); + rangeab->setDefaultEditedState(Irrelevant); + protab->setDefaultEditedState(Irrelevant); + labgrid->setEdited(Edited); for (int i = 0; i < 9; i++) { correction[i]->setDefaultEditedState(Irrelevant); @@ -2883,6 +2935,8 @@ void Wavelet::setBatchMode(bool batchMode) sigmaton->showEditedCB(); sigmacol->showEditedCB(); sigmadir->showEditedCB(); + rangeab->showEditedCB(); + protab->showEditedCB(); level0noise->showEditedCB(); level1noise->showEditedCB(); level2noise->showEditedCB(); @@ -3036,6 +3090,10 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavsigmafin, sigmafin->getTextValue()); } else if (a == sigmaton) { listener->panelChanged(EvWavsigmaton, sigmaton->getTextValue()); + } else if (a == rangeab) { + listener->panelChanged(EvWavrangeab, rangeab->getTextValue()); + } else if (a == protab) { + listener->panelChanged(EvWavprotab, protab->getTextValue()); } else if (a == sigmacol) { listener->panelChanged(EvWavsigmacol, sigmacol->getTextValue()); } else if (a == sigmadir) { diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index b235cde47..c9cd3dc4c 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -33,6 +33,7 @@ class CurveEditorGroup; class DiagonalCurveEditor; class EditDataProvider; class FlatCurveEditor; +class LabGrid; class Wavelet final : public ToolParamBlock, @@ -97,8 +98,14 @@ private: rtengine::ProcEvent EvWavsigmaton; rtengine::ProcEvent EvWavsigmacol; rtengine::ProcEvent EvWavsigmadir; + rtengine::ProcEvent EvWavLabGridValue; + rtengine::ProcEvent EvWavrangeab; + rtengine::ProcEvent EvWavprotab; + + LabGrid *labgrid; void foldAllButMe(GdkEventButton* event, MyExpander *expander); + void setListener(ToolPanelListener *tpl) override; void colorForValue(double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller) override; void BAmethodChanged(); @@ -226,7 +233,9 @@ private: Adjuster* const sigmaton; Adjuster* const sigmacol; Adjuster* const sigmadir; - + Adjuster* const rangeab; + Adjuster* const protab; + Adjuster* greenlow; Adjuster* bluelow; Adjuster* greenmed; @@ -304,6 +313,7 @@ private: Gtk::Frame* const chroFrame; Gtk::Frame* const fincFrame; Gtk::Frame* const dirFrame; + Gtk::Frame* const tonFrame; Gtk::Label* const wavLabels; Gtk::Label* const labmC; From c46eb298755bb58b468bfc95dac4530be9176ac7 Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 16 Apr 2020 08:43:25 +0200 Subject: [PATCH 095/109] Improve toning level (disabled) - add information verbose --- rtdata/languages/default | 1 + rtengine/ipwavelet.cc | 59 ++++++++++++++++++++++++---------------- 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 5627dab4c..5f8906b3d 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2337,6 +2337,7 @@ TP_WAVELET_TMSTRENGTH;Compression strength TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. TP_WAVELET_TMEDGS;Edge stopping TP_WAVELET_TON;Toning +TP_WAVELET_TONFRAME;Excluded Colors TP_WAVELET_TMTYPE;Compression method TP_WAVELET_USH;None TP_WAVELET_USHARP;Clarity method diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 5b170ff9b..8bc1d056a 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -918,6 +918,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const float ** WavCoeffs_L = Ldecomp->level_coeffs(lvl); madL[lvl][dir - 1] = SQR(Mad(WavCoeffs_L[dir], Wlvl_L * Hlvl_L)); + + if (settings->verbose) { + printf("sqrt madL=%f lvl=%i dir=%i\n", sqrt(madL[lvl][dir - 1]), lvl, dir - 1); + } } } @@ -4159,25 +4163,22 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f float effect = cp.sigmaton; float betaab = 0.f; float offs = 1.f; - float protec = 0.01f * cp.protab; - // printf("rangeab=%f \n", 0.01f * cp.rangeab); - // printf("protab=%f \n", 0.01f * cp.protab); + float protec = 0.01f * (100.f - cp.protab); float aref1 = cp.a_high; float bref1 = cp.b_high; float aref2 = cp.a_low; float bref2 = cp.b_low; - // printf("a1=%f b1=%f a2=%f b2=%f\n", aref1, bref1, aref2, bref2); - float arefplus1 = aref1 * (1.f + 0.1f * cp.rangeab); - float arefmoins1 = aref1 * (1.f - 0.1f * cp.rangeab); - float brefplus1 = bref1 * (1.f + 0.1f * cp.rangeab); - float brefmoins1 = bref1 * (1.f - 0.1f * cp.rangeab); - // printf("a1+=%f a1-=%f b+=%f b-=%f\n", arefplus1, arefmoins1, brefplus1, brefmoins1); + float kk = 100.f; + float arefplus1 = aref1 + cp.rangeab * kk; + float arefmoins1 = aref1 - cp.rangeab * kk; + float brefplus1 = bref1 + cp.rangeab * kk; + float brefmoins1 = bref1 - cp.rangeab * kk; - float arefplus2 = aref2 * (1.f + 0.1f * cp.rangeab); - float arefmoins2 = aref2 * (1.f - 0.1f * cp.rangeab); - float brefplus2 = bref2 * (1.f + 0.1f * cp.rangeab); - float brefmoins2 = bref2 * (1.f - 0.1f * cp.rangeab); + float arefplus2 = aref2 + cp.rangeab * kk; + float arefmoins2 = aref2 - cp.rangeab * kk; + float brefplus2 = bref2 + cp.rangeab * kk; + float brefmoins2 = bref2 - cp.rangeab * kk; calceffect(level, meanab, sigmaab, mea, effect, offs); @@ -4212,25 +4213,35 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f float kreduc2 = 1.f; int ii = co / W_ab; int jj = co - ii * W_ab; + cp.protab = 0.f;// always disabled provisory... if (cp.protab > 0.f) { - - if ((labco->a[ii * 2][jj * 2] > arefmoins1) && (labco->a[ii * 2][jj * 2] < arefplus1) - && (labco->b[ii * 2][jj * 2] > brefmoins1) && (labco->b[ii * 2][jj * 2] < brefplus1)) { - kreduc1 = protec; - // printf("p "); + if (useChannelA) { + if ((labco->a[ii * 2][jj * 2] > arefmoins1) && (labco->a[ii * 2][jj * 2] < arefplus1)) { + kreduc1 = protec; + } + } else { + if ((labco->b[ii * 2][jj * 2] > brefmoins1) && (labco->b[ii * 2][jj * 2] < brefplus1)) { + kreduc1 = protec; + } } - if ((labco->a[ii * 2][jj * 2] > arefmoins2) && (labco->a[ii * 2][jj * 2] < arefplus2) - && (labco->b[ii * 2][jj * 2] > brefmoins2) && (labco->b[ii * 2][jj * 2] < brefplus2)) { - kreduc2 = protec; - // printf("P "); + if (useChannelA) { + if ((labco->a[ii * 2][jj * 2] > arefmoins2) && (labco->a[ii * 2][jj * 2] < arefplus2)) { + kreduc2 = protec; + } + } else { + if ((labco->b[ii * 2][jj * 2] > brefmoins2) && (labco->b[ii * 2][jj * 2] < brefplus2)) { + kreduc2 = protec; + } } - - // printf("pa1=%f pa2=%f\n", kreduc1, kredu2); } + + // printf("pa1=%f pa2=%f\n", kreduc1, kredu2); + + float beta = (1024.f + 50.f * mulOpacity * betaab * kreduc1 * kreduc2) / 1024.f ; WavCoeffs_ab[dir][co] *= beta; From a70691caf1227f75e76ac18a9fddb99d6bd8884a Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 16 Apr 2020 10:57:52 +0200 Subject: [PATCH 096/109] Enabled Toning excluded colors - to test --- rtengine/ipwavelet.cc | 28 +++++++++++++++++++++++----- rtgui/wavelet.cc | 2 +- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 8bc1d056a..3b00d8aaf 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -4214,25 +4214,43 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f int ii = co / W_ab; int jj = co - ii * W_ab; - cp.protab = 0.f;// always disabled provisory... + // cp.protab = 0.f;// always disabled provisory... if (cp.protab > 0.f) { if (useChannelA) { if ((labco->a[ii * 2][jj * 2] > arefmoins1) && (labco->a[ii * 2][jj * 2] < arefplus1)) { - kreduc1 = protec; + kreduc1 = 0.5f * protec; + + if ((labco->a[ii * 2][jj * 2] > 0.8f * arefmoins1) && (labco->a[ii * 2][jj * 2] < 0.8f * arefplus1)) { + kreduc1 = protec; + } } + } else { if ((labco->b[ii * 2][jj * 2] > brefmoins1) && (labco->b[ii * 2][jj * 2] < brefplus1)) { - kreduc1 = protec; + kreduc1 = 0.5f * protec; + + if ((labco->b[ii * 2][jj * 2] > 0.8f * brefmoins1) && (labco->b[ii * 2][jj * 2] < 0.8f * brefplus1)) { + kreduc1 = protec; + } } } if (useChannelA) { if ((labco->a[ii * 2][jj * 2] > arefmoins2) && (labco->a[ii * 2][jj * 2] < arefplus2)) { - kreduc2 = protec; + kreduc2 = 0.5f * protec; + + if ((labco->a[ii * 2][jj * 2] > 0.8f * arefmoins2) && (labco->a[ii * 2][jj * 2] < 0.8f * arefplus2)) { + kreduc2 = protec; + } + } } else { if ((labco->b[ii * 2][jj * 2] > brefmoins2) && (labco->b[ii * 2][jj * 2] < brefplus2)) { - kreduc2 = protec; + kreduc2 = 0.5f * protec; + + if ((labco->b[ii * 2][jj * 2] > brefmoins2) && (labco->b[ii * 2][jj * 2] < brefplus2)) { + kreduc2 = protec; + } } } diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 08c4d6f4c..1f4714452 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -533,7 +533,7 @@ Wavelet::Wavelet() : ton2Box->pack_start(*rangeab); ton2Box->pack_start(*protab); tonFrame->add(*ton2Box); -// tonBox->pack_start(*tonFrame); + tonBox->pack_start(*tonFrame); tonBox->pack_start(*opaCurveEditorG, Gtk::PACK_SHRINK, 2); From d165a08e368c2ba174b08c1f4fd1df5472232273 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 20 Apr 2020 13:43:08 +0200 Subject: [PATCH 097/109] revert a801d76, fixes #5716 --- rtengine/dcraw.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 29796ea67..edb7dc317 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -9077,6 +9077,9 @@ void CLASS adobe_coeff (const char *make, const char *model) if (RT_blacklevel_from_constant == ThreeValBool::X || is_pentax_dng) { RT_blacklevel_from_constant = ThreeValBool::T; } + if (RT_matrix_from_constant == ThreeValBool::X) { + RT_matrix_from_constant = ThreeValBool::T; + } // -- RT -------------------------------------------------------------------- for (i=0; i < sizeof table / sizeof *table; i++) @@ -9096,9 +9099,6 @@ void CLASS adobe_coeff (const char *make, const char *model) } else if (load_raw == &CLASS panasonic_load_raw) { tiff_bps = RT_pana_info.bpp; } - if (RT_matrix_from_constant == ThreeValBool::X) { - RT_matrix_from_constant = ThreeValBool::T; - } { /* Check for RawTherapee table overrides and extensions */ int black_level, white_level; short trans[12]; @@ -10546,7 +10546,7 @@ dng_skip: * files. See #4129 */) { memcpy (rgb_cam, cmatrix, sizeof cmatrix); // raw_color = 0; - RT_matrix_from_constant = ThreeValBool::X; + RT_matrix_from_constant = ThreeValBool::F; } if(!strncmp(make, "Panasonic", 9) && !strncmp(model, "DMC-LX100",9)) adobe_coeff (make, model); From 687217a6afed3aa781d7bbcfdd45ca00dffef64f Mon Sep 17 00:00:00 2001 From: Thanatomanic <6567747+Thanatomanic@users.noreply.github.com> Date: Thu, 23 Apr 2020 10:10:42 +0200 Subject: [PATCH 098/109] Brighten the diagonal line in curves, tone down the gridlines. Fixes #5687. --- rtdata/themes/RawTherapee-GTK3-20_.css | 2 +- rtgui/mydiagonalcurve.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rtdata/themes/RawTherapee-GTK3-20_.css b/rtdata/themes/RawTherapee-GTK3-20_.css index a5f52a769..bdadc00db 100644 --- a/rtdata/themes/RawTherapee-GTK3-20_.css +++ b/rtdata/themes/RawTherapee-GTK3-20_.css @@ -565,7 +565,7 @@ button.text-button.toggle:hover:checked { .drawingarea { border-radius: 0; background-color: #2A2A2A; - border: 0.0833333333333333em solid #1D1D1D; + border: 0.0833333333333333em solid #888888; } .drawingarea:disabled { background-color: #444; diff --git a/rtgui/mydiagonalcurve.cc b/rtgui/mydiagonalcurve.cc index ac7976b7e..ce6c6f3ec 100644 --- a/rtgui/mydiagonalcurve.cc +++ b/rtgui/mydiagonalcurve.cc @@ -323,7 +323,7 @@ void MyDiagonalCurve::draw (int handle) // draw the grid lines: cr->set_line_width (1.0 * s); c = style->get_border_color(state); - cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); + cr->set_source_rgba (c.get_red(), c.get_green(), c.get_blue(), 0.3); cr->set_antialias (Cairo::ANTIALIAS_NONE); for (int i = 0; i <= 10; i++) { From 1beb3c91b43209d7f0430707164a25ad4c78d28d Mon Sep 17 00:00:00 2001 From: Thanatomanic <6567747+Thanatomanic@users.noreply.github.com> Date: Mon, 27 Apr 2020 18:13:47 +0200 Subject: [PATCH 099/109] Adjust white-point for Nikon COOLPIX P1000. Fixes #5734 --- rtengine/camconst.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 8bed22437..5fc7d4062 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1540,7 +1540,7 @@ Camera constants: { // Quality B "make_model": "NIKON COOLPIX P1000", "dcraw_matrix": [ 14294, -6116, -1333, -1628, 10219, 1637, -14, 1158, 5022 ], // ColorMatrix2 from Adobe DNG Converter 11.4 - "ranges": { "black": 200, "white": 4093 } + "ranges": { "black": 200, "white": 4087 } }, { // Quality B, no LENR samples From cec79084296570fb5b4a076d3f9a3c1fbad3ed04 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Sun, 3 May 2020 17:06:16 +0300 Subject: [PATCH 100/109] rtexif: Fix conversion from RATIONAL to int, double or string RATIONAL tags are defined as a ratio of two LONG, themselves defined as 32-bit unsigned integers. The value is misinterpreted when converting to an int, double or string, as the numerator and the denominator are interpreted as signed values. The problem has been noticed with the ExposureTime tag generated by libtiff, which sets the denominator to 0xffffffff for exposure times lower than 1. Fix it. Signed-off-by: Laurent Pinchart --- rtexif/rtexif.cc | 26 ++++++++++++++++++-------- rtexif/rtexif.h | 22 +++++++++++++++------- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index 06604ade5..95b46c2b9 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -1510,8 +1510,6 @@ int Tag::toInt (int ofs, TagType astype) const return attrib->interpreter->toInt (this, ofs, astype); } - int a; - if (astype == INVALID) { astype = type; } @@ -1537,10 +1535,15 @@ int Tag::toInt (int ofs, TagType astype) const case LONG: return (int)sget4 (value + ofs, getOrder()); - case SRATIONAL: - case RATIONAL: - a = (int)sget4 (value + ofs + 4, getOrder()); + case SRATIONAL: { + int a = (int)sget4 (value + ofs + 4, getOrder()); return a == 0 ? 0 : (int)sget4 (value + ofs, getOrder()) / a; + } + + case RATIONAL: { + uint32_t a = (uint32_t)sget4 (value + ofs + 4, getOrder()); + return a == 0 ? 0 : (uint32_t)sget4 (value + ofs, getOrder()) / a; + } case FLOAT: return (int)toDouble (ofs); @@ -1589,10 +1592,14 @@ double Tag::toDouble (int ofs) const return (double) ((int)sget4 (value + ofs, getOrder())); case SRATIONAL: - case RATIONAL: ud = (int)sget4 (value + ofs, getOrder()); dd = (int)sget4 (value + ofs + 4, getOrder()); - return dd == 0. ? 0. : (double)ud / (double)dd; + return dd == 0. ? 0. : ud / dd; + + case RATIONAL: + ud = (uint32_t)sget4 (value + ofs, getOrder()); + dd = (uint32_t)sget4 (value + ofs + 4, getOrder()); + return dd == 0. ? 0. : ud / dd; case FLOAT: conv.i = sget4 (value + ofs, getOrder()); @@ -1735,10 +1742,13 @@ void Tag::toString (char* buffer, int ofs) const break; case SRATIONAL: - case RATIONAL: sprintf (b, "%d/%d", (int)sget4 (value + 8 * i + ofs, getOrder()), (int)sget4 (value + 8 * i + ofs + 4, getOrder())); break; + case RATIONAL: + sprintf (b, "%u/%u", (uint32_t)sget4 (value + 8 * i + ofs, getOrder()), (uint32_t)sget4 (value + 8 * i + ofs + 4, getOrder())); + break; + case FLOAT: sprintf (b, "%g", toDouble (8 * i + ofs)); break; diff --git a/rtexif/rtexif.h b/rtexif/rtexif.h index 1a956a4a5..5084f70de 100644 --- a/rtexif/rtexif.h +++ b/rtexif/rtexif.h @@ -434,13 +434,18 @@ public: case LONG: return (double) ((int)sget4 (t->getValue() + ofs, t->getOrder())); - case SRATIONAL: - case RATIONAL: { + case SRATIONAL: { const double dividend = (int)sget4 (t->getValue() + ofs, t->getOrder()); const double divisor = (int)sget4 (t->getValue() + ofs + 4, t->getOrder()); return divisor == 0. ? 0. : dividend / divisor; } + case RATIONAL: { + const double dividend = (uint32_t)sget4 (t->getValue() + ofs, t->getOrder()); + const double divisor = (uint32_t)sget4 (t->getValue() + ofs + 4, t->getOrder()); + return divisor == 0. ? 0. : dividend / divisor; + } + case FLOAT: return double (sget4 (t->getValue() + ofs, t->getOrder())); @@ -454,8 +459,6 @@ public: // Get the value as an int virtual int toInt (const Tag* t, int ofs = 0, TagType astype = INVALID) { - int a; - if (astype == INVALID || astype == AUTO) { astype = t->getType(); } @@ -480,10 +483,15 @@ public: case LONG: return (int)sget4 (t->getValue() + ofs, t->getOrder()); - case SRATIONAL: - case RATIONAL: - a = (int)sget4 (t->getValue() + ofs + 4, t->getOrder()); + case SRATIONAL: { + int a = (int)sget4 (t->getValue() + ofs + 4, t->getOrder()); return a == 0 ? 0 : (int)sget4 (t->getValue() + ofs, t->getOrder()) / a; + } + + case RATIONAL: { + uint32_t a = (uint32_t)sget4 (t->getValue() + ofs + 4, t->getOrder()); + return a == 0 ? 0 : (uint32_t)sget4 (t->getValue() + ofs, t->getOrder()) / a; + } case FLOAT: return (int)toDouble (t, ofs); From 988d3a1a0d0bff2d1ddeca461d9f4f09bdea6692 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 7 May 2020 15:26:10 +0200 Subject: [PATCH 101/109] Do not set math errno --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index e3ae3b7ff..532353a8b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -128,6 +128,9 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${PROC_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=unused-label") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=delete-incomplete") +# Do net set math errno, as we never check its value. +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-math-errno") + # Special treatment for x87 and x86-32 SSE (see GitHub issue #4324) include(FindX87Math) if(HAVE_X87_MATH) From 8c851a1b3f389c2198ee5d85d3f0441d6f25d281 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 8 May 2020 14:02:40 +0200 Subject: [PATCH 102/109] Also tweak CMAKE_C_FLAGS, fixes #5742 --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 532353a8b..cbddde251 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -130,6 +130,7 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=delete-incomplete") # Do net set math errno, as we never check its value. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-math-errno") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-math-errno") # Special treatment for x87 and x86-32 SSE (see GitHub issue #4324) include(FindX87Math) From b5af6eec60f44112fe3e96f934d6b1abbca355a2 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 9 May 2020 19:57:39 +0200 Subject: [PATCH 103/109] Fixed crash when use extra --- rtengine/ipwavelet.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index f415c9c8e..39de7c938 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -866,7 +866,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (levwavL > 0) { const std::unique_ptr Ldecomp(new wavelet_decomposition(labco->data, labco->W, labco->H, levwavL, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); - float madL[8][3]; + float madL[10][3]; if (!Ldecomp->memoryAllocationFailed) { From 8581799a7a4e1adc6f4b93264bfa20cdd41f92c0 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 11 May 2020 22:33:43 +0200 Subject: [PATCH 104/109] make ipwavelets.cc cppcheck clean --- rtengine/improcfun.h | 4 - rtengine/ipwavelet.cc | 401 ++++++++---------------------------------- 2 files changed, 72 insertions(+), 333 deletions(-) diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 9d4a0235c..b2df86112 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -188,7 +188,6 @@ public: void EPDToneMapResid(float * WavCoeffs_L0, unsigned int Iterates, int skip, struct cont_params& cp, int W_L, int H_L, float max0, float min0); void CompressDR(float *Source, int W_L, int H_L, float Compression, float DetailBoost); - void Compresslevels2(float **Source, int W_L, int H_L, float compression, float detailattenuator, float thres, float mean, float maxp, float meanN, float maxN, float madL); void ContrastResid(float * WavCoeffs_L0, struct cont_params &cp, int W_L, int H_L, float max0, float min0); void EPDToneMap(LabImage *lab, unsigned int Iterates = 0, int skip = 1); @@ -228,9 +227,6 @@ public: void Sigma(float * HH_Coeffs, int datalen, float averagePlus, float averageNeg, float &sigmaPlus, float &sigmaNeg); void calckoe(float ** WavCoeffs_LL, const cont_params& cp, float ** koeLi, int level, int dir, int W_L, int H_L, float edd, float *maxkoeLi, float **tmC = nullptr); - void softproc2(const LabImage* bufcolorig, const LabImage* bufcolfin, float rad, int bfh, int bfw, double epsilmax, double epsilmin, float thres, int sk, bool multiThread, int flag); - - void Median_Denoise(float **src, float **dst, int width, int height, Median medianType, int iterations, int numThreads, float **buffer = nullptr); void Median_Denoise(float **src, float **dst, float upperBound, int width, int height, Median medianType, int iterations, int numThreads, float **buffer = nullptr); void RGB_denoise(int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & noiseLCurve, const NoiseCurve & noiseCCurve, float &nresi, float &highresi); diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index f67e82c77..445cfdd06 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -164,7 +164,7 @@ struct cont_params { int wavNestedLevels = 1; -void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip) +void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip) { @@ -540,11 +540,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const levwav = rtengine::min(maxlevelcrop, levwav); - // determine number of levels to process. - // for(levwav=rtengine::min(maxlevelcrop,levwav);levwav>0;levwav--) - // if(cp.mul[levwav-1]!=0.f || cp.curv) - // if(cp.mul[levwav-1]!=0.f) - // break; // I suppress this fonctionality ==> crash for level < 3 if (levwav < 1) { return; // nothing to do @@ -740,7 +735,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } #ifdef _OPENMP - #pragma omp parallel for num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel for num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif for (int i = tiletop; i < tilebottom; i++) { @@ -799,7 +794,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } #ifdef _OPENMP - #pragma omp parallel for num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel for num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif for (int i = 1; i < hei - 1; i++) { @@ -901,13 +896,13 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (levwavL > 0) { const std::unique_ptr Ldecomp(new wavelet_decomposition(labco->data, labco->W, labco->H, levwavL, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); - float madL[10][3]; if (!Ldecomp->memoryAllocationFailed) { + float madL[10][3]; // float madL[8][3]; #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic) collapse(2) num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel for schedule(dynamic) collapse(2) num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif for (int lvl = 0; lvl < levwavL; lvl++) { @@ -1297,7 +1292,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr adecomp(new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwava, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!adecomp->memoryAllocationFailed) { - if (cp.noiseena && (cp.chromfi > 0.f || cp.chromfi > 0.f)) { + if (cp.noiseena && (cp.chromfi > 0.f || cp.chromco > 0.f)) { WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); } @@ -1331,7 +1326,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!bdecomp->memoryAllocationFailed) { - if (cp.noiseena && (cp.chromfi > 0.f || cp.chromfi > 0.f)) { + if (cp.noiseena && (cp.chromfi > 0.f || cp.chromco > 0.f)) { WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); } @@ -1361,18 +1356,18 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!adecomp->memoryAllocationFailed && !bdecomp->memoryAllocationFailed) { - if (cp.noiseena && (cp.chromfi > 0.f || cp.chromfi > 0.f)) { + if (cp.noiseena && (cp.chromfi > 0.f || cp.chromco > 0.f)) { WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); } Evaluate2(*adecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); - WaveletcontAllAB(labco, varhue, varchro, *adecomp, wavblcurve, waOpacityCurveW, cp, true, skip, meanab, sigmaab); + WaveletcontAllAB(labco, varhue, varchro, *adecomp, wavblcurve, waOpacityCurveW, cp, true, skip, meanab, sigmaab); WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); Evaluate2(*bdecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); - if (cp.noiseena && (cp.chromfi > 0.f || cp.chromfi > 0.f)) { + if (cp.noiseena && (cp.chromfi > 0.f || cp.chromco > 0.f)) { WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip, meanab, sigmaab); WaveletAandBAllAB(*adecomp, *bdecomp, cp, hhCurve, hhutili); } @@ -1434,7 +1429,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const bool highlight = params->toneCurve.hrenabled; #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel for schedule(dynamic,16) num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif for (int i = tiletop; i < tilebottom; i++) { @@ -1661,7 +1656,7 @@ void ImProcFunctions::Aver(float * RESTRICT DataList, int datalen, float &averag max = 0.f; min = RT_INFINITY_F; #ifdef _OPENMP - #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif { float lmax = 0.f, lmin = 0.f; @@ -1712,7 +1707,7 @@ void ImProcFunctions::Sigma(float * RESTRICT DataList, int datalen, float avera float thres = 32.7f;//different fom zero to take into account only data large enough 32.7 = 0.1 in range 0..100 #ifdef _OPENMP - #pragma omp parallel for reduction(+:variP,variN,countP,countN) num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel for reduction(+:variP,variN,countP,countN) num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif for (int i = 0; i < datalen; i++) { @@ -1819,7 +1814,7 @@ void ImProcFunctions::Eval2(float ** WavCoeffs_L, int level, float AvL, AvN, SL, SN, maxLP, maxLN; for (int dir = 1; dir < 4; dir++) { - Aver(WavCoeffs_L[dir], W_L * H_L, avLP[dir], avLN[dir], maxL[dir], minL[dir]); + Aver(WavCoeffs_L[dir], W_L * H_L, avLP[dir], avLN[dir], maxL[dir], minL[dir]); Sigma(WavCoeffs_L[dir], W_L * H_L, avLP[dir], avLN[dir], sigP[dir], sigN[dir]); } @@ -1956,7 +1951,7 @@ void ImProcFunctions::ContrastResid(float * WavCoeffs_L0, struct cont_params &cp -void ImProcFunctions::EPDToneMapResid(float * WavCoeffs_L0, unsigned int Iterates, int skip, struct cont_params& cp, int W_L, int H_L, float max0, float min0) +void ImProcFunctions::EPDToneMapResid(float * WavCoeffs_L0, unsigned int Iterates, int skip, struct cont_params& cp, int W_L, int H_L, float max0, float min0) { @@ -2041,7 +2036,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * if (contrast != 0.f || (cp.tonemap && cp.resena)) { // contrast = 0.f means that all will be multiplied by 1.f, so we can skip this step #ifdef _OPENMP - #pragma omp parallel for reduction(+:avedbl) num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel for reduction(+:avedbl) num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif for (int i = 0; i < W_L * H_L; i++) { @@ -2049,7 +2044,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } #ifdef _OPENMP - #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif { float lminL = FLT_MAX; @@ -2134,7 +2129,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * #ifdef _OPENMP - #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif { if (contrast != 0.f && cp.resena && max0 > 0.f) { // contrast = 0.f means that all will be multiplied by 1.f, so we can skip this step @@ -2209,13 +2204,13 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * float LL100 = LL / 327.68f; float tran = 5.f;//transition //shadow - float alp = 3.f; //increase contrast sahdow in lowlights between 1 and ?? if (cp.th > (100.f - tran)) { tran = 100.f - cp.th; } if (LL100 < cp.th) { + constexpr float alp = 3.f; //increase contrast sahdow in lowlights between 1 and ?? float aalp = (1.f - alp) / cp.th; //no changes for LL100 = cp.th float kk = aalp * LL100 + alp; WavCoeffs_L0[i] *= (1.f + kk * cp.conres / 200.f); @@ -2245,10 +2240,10 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * //Blur luma if (cp.blurres != 0.f && cp.resena) { int minWL = min(W_L, H_L); - float k = 0.5f; //printf("skip=%i WL=%i HL=%i min=%i\n", skip, W_L, H_L, minWL); if (minWL > 140) { //disabled if too low windows + constexpr float k = 0.5f; float rad = k * cp.blurres / skip; float * bef = new float[W_L * H_L]; float * aft = new float[W_L * H_L]; @@ -2273,7 +2268,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * n0 = n1 = n2 = n3 = n4 = n5 = n6 = n7 = n8 = n9 = n10 = n32 = 0; #ifdef _OPENMP - #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif { //enabled Lipschitz..replace simple by complex edge detection @@ -2374,12 +2369,10 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * //if not no edge or reduction float bet = 1.f; - //if(cp.lip3) {//enhance algorithm if (alph > eddlipinfl && beta < 0.85f * eddlipinfl) { //0.85 arbitrary value ==> eliminate from edge if H V D too different bet = beta; } - //} float AmpLip = 1.f; if (alph > eddlipinfl) { @@ -2390,16 +2383,6 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * kampli = AmpLip / aamp; } - // comparison betwwen pixel and neighbours to do ==> I think 3 dir above is better - /* if(cp.lip3){ - koeLi[lvl*3][i*W_L + j] = (koeLi[lvl*3][i*W_L + j] + koeLi[lvl*3][(i-1)*W_L + j] + koeLi[lvl*3][(i+1)*W_L + j] - + koeLi[lvl*3][i*W_L + j+1] + koeLi[lvl*3][i*W_L + j-1] + koeLi[lvl*3][(i-1)*W_L + j-1] - + koeLi[lvl*3][(i-1)*W_L + j+1] +koeLi[lvl*3][(i+1)*W_L + j-1] +koeLi[lvl*3][(i+1)*W_L + j+1])/9.f; - } - */ - // apply to each direction Wavelet level : horizontal / vertiacle / diagonal - //interm += SQR(koeLi[lvl*3 + dir-1][i*W_L + j]); - interm *= kampli; if (interm < cp.eddetthr / eddlow) { @@ -2439,21 +2422,15 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl); - ContAllL(koeLi, maxkoeLi, true, maxlvl, labco, varhue, varchrom, WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); - //blur level - float klev = 1.f; + ContAllL(koeLi, maxkoeLi, true, maxlvl, labco, varhue, varchrom, WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); if (wavblcurve && wavcurvecomp && cp.blena) { // printf("Blur level L\n"); float mea[10]; - float effect = cp.bluwav; - float offs = 1.f; + const float effect = cp.bluwav; + constexpr float offs = 1.f; float * beta = new float[Wlvl_L * Hlvl_L]; - for (int co = 0; co < Hlvl_L * Wlvl_L; co++) { - beta[co] = 1.f; - } - calceffect(lvl, mean, sigma, mea, effect, offs); float * bef = new float[Wlvl_L * Hlvl_L]; @@ -2509,8 +2486,9 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * printf("lvl=%i n0=%i n32=%i n1=%i n2=%i n3=%i n4=%i n5=%i n6=%i n7=%i n8=%i n9=%i n10=%i\n", lvl, n0, n0 - n32, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10); } - klev = (wavblcurve[lvl * 55.5f]); + float klev = (wavblcurve[lvl * 55.5f]); + //blur level // klev *= beta * 100.f / skip; klev *= 100.f / skip; boxblur(bef, aft, klev, Wlvl_L, Hlvl_L, false); @@ -2545,7 +2523,7 @@ void ImProcFunctions::WaveletAandBAllAB(const wavelet_decomposition &WaveletCoef float * WavCoeffs_a0 = WaveletCoeffs_a.coeff0; float * WavCoeffs_b0 = WaveletCoeffs_b.coeff0; #ifdef _OPENMP - #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif { #ifdef __SSE2__ @@ -2611,7 +2589,7 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float float * WavCoeffs_ab0 = WaveletCoeffs_ab.coeff0; #ifdef _OPENMP - #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif { if (cp.chrores != 0.f && cp.resena) { // cp.chrores == 0.f means all will be multiplied by 1.f, so we can skip the processing of residual @@ -2646,20 +2624,6 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float if ((modhue > cp.t_ry || modhue < cp.t_ly)) { scale = (100.f + cp.sky) / 100.1f; } - - /* else if((modhue >= cp.t_ry && modhue < cp.b_ry)) { - scale=(100.f+cp.sky)/100.1f; - float ar=(scale-1.f)/(cp.t_ry- cp.b_ry); - float br=scale-cp.t_ry*ar; - scale=ar*modhue+br; - } - else if((modhue > cp.b_ly && modhue < cp.t_ly)) { - scale=(100.f+cp.sky)/100.1f; - float al=(scale-1.f)/(-cp.b_ly + cp.t_ly); - float bl=scale-cp.t_ly*al; - scale=al*modhue+bl; - } - */ } WavCoeffs_ab0[i] *= (1.f + cp.chrores * (scale) / 100.f); @@ -2727,10 +2691,10 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float //Blur chroma if (cp.blurcres != 0.f && cp.resena) { int minWL = min(W_L, H_L); - float k = 0.5f; //printf("skip=%i WL=%i HL=%i min=%i\n", skip, W_L, H_L, minWL); if (minWL > 140) { //disabled if too low windows + constexpr float k = 0.5f; float rad = k * cp.blurcres / skip; float * bef = new float[W_L * H_L]; float * aft = new float[W_L * H_L]; @@ -2772,7 +2736,7 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float int Hlvl_ab = WaveletCoeffs_ab.level_H(lvl); float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); - ContAllAB(labco, maxlvl, varhue, varchrom, WavCoeffs_ab, WavCoeffs_ab0, lvl, dir, waOpacityCurveW, cp, Wlvl_ab, Hlvl_ab, useChannelA, meanab, sigmaab); + ContAllAB(labco, maxlvl, varhue, varchrom, WavCoeffs_ab, WavCoeffs_ab0, lvl, dir, waOpacityCurveW, cp, Wlvl_ab, Hlvl_ab, useChannelA, meanab, sigmaab); if (wavblcurve && wavcurvecomp && cp.blena && cp.chrwav > 0.f) { @@ -2859,8 +2823,8 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, const cont_params& cp, floa // I calculate coefficients with r size matrix 3x3 r=1 ; 5x5 r=2; 7x7 r=3 /* float k[2*r][2*r]; - for(int i=1;i<=(2*r+1);i++) { - for(int j=1;j<=(2*r+1);j++) { + for (int i=1;i<=(2*r+1);i++) { + for (int j=1;j<=(2*r+1);j++) { k[i][j]=(1.f/6.283*sigma*sigma)*exp(-SQR(i-r-1)+SQR(j-r-1)/2.f*SQR(sigma)); } } @@ -2908,9 +2872,7 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, const cont_params& cp, floa else if (cp.eddetthr >= 75.f) { borderL = 2; - //if(cp.lip3 && level > 1) { if (level > 1) { // do not activate 5x5 if level 0 or 1 - for (int i = 2; i < H_L - 2; i++) { for (int j = 2; j < W_L - 2; j++) { // Gaussian 1.1 @@ -2958,21 +2920,6 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, const cont_params& cp, floa } - - /* - // I suppress these 2 convolutions ==> lees good results==> probably because structure data different and also I compare to original value which have + and - - for(int i = borderL; i < H_L-borderL; i++ ) {//[-1 0 1] x==>j - for(int j = borderL; j < W_L-borderL; j++) { - tmC[i][j]=- WavCoeffs_LL[dir][(i)*W_L + j-1] + WavCoeffs_LL[dir][(i)*W_L + j+1]; - } - } - for(int i = borderL; i < H_L-borderL; i++ ) {//[1 0 -1] y==>i - for(int j = borderL; j < W_L-borderL; j++) { - tmC[i][j]= - WavCoeffs_LL[dir][(i-1)*W_L + j] + WavCoeffs_LL[dir][(i+1)*W_L + j]; - } - } - */ - float thr = 40.f; //avoid artifact eg. noise...to test float thr2 = 1.5f * edd; //edd can be modified in option ed_detect thr2 += cp.eddet / 30.f; //to test @@ -2988,9 +2935,6 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, const cont_params& cp, floa for (int j = borderL; j < W_L - borderL; j++) { // my own algo : probably a little false, but simpler as Lipschitz ! // Thr2 = maximum of the function ==> Lipsitch says = probably edge -// float temp = WavCoeffs_LL[dir][i*W_L + j]; -// if(temp>=0.f && temp < thr) temp = thr; -// if(temp < 0.f && temp > -thr) temp = -thr; float temp = rtengine::max(std::fabs(WavCoeffs_LL[dir][i * W_L + j]), thr); koeLi[level * 3 + dir - 1][i * W_L + j] = rtengine::min(thr2, std::fabs(tmC[i][j] / temp)); // limit maxi @@ -3022,7 +2966,7 @@ void ImProcFunctions::finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, float amean = 0.5f / mean[level]; #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic, W_L * 16) num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel for schedule(dynamic, W_L * 16) num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif for (int i = 0; i < W_L * H_L; i++) { @@ -3186,9 +3130,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz constexpr float aedstr = (eddstrength - 1.f) / 90.f; constexpr float bedstr = 1.f - 10.f * aedstr; - float mea[10]; - // float beta = 1.f; - float * beta = new float[W_L * H_L]; + std::unique_ptr beta(new float[W_L * H_L]); for (int co = 0; co < H_L * W_L; co++) { beta[co] = 1.f; @@ -3197,6 +3139,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz if (cp.eff < 2.5f) { float effect = cp.eff; float offs = 1.f; + float mea[10]; calceffect(level, mean, sigma, mea, effect, offs); @@ -3388,7 +3331,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz float edgePrecalc = 1.f + refin; //estimate edge "pseudo variance" if (cp.EDmet == 2 && MaxP[level] > 0.f) { //curve - // if(exa) {//curve + // if (exa) {//curve float insigma = 0.666f; //SD float logmax = log(MaxP[level]); //log Max float rapX = (mean[level] + sigma[level]) / MaxP[level]; //rapport between sD / max @@ -3608,8 +3551,9 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz if (!lipschitz) { delete [] koe; } - - delete[] beta; + if (!(cp.bam && cp.finena)) { + beta.reset(); + } } @@ -3649,7 +3593,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz const float lowthr = params->wavelet.lowthr; float mea[10]; float effect = cp.sigm; - float beta; + float lbeta; calceffect(level, mean, sigma, mea, effect, offs); @@ -3664,34 +3608,34 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz float kLlev = 1.f; if (cpMul < 0.f) { - beta = 1.f; // disabled for negatives values "less contrast" + lbeta = 1.f; // disabled for negatives values "less contrast" } else { float WavCL = std::fabs(WavCoeffs_L[dir][i]); //reduction amplification: max action between mean / 2 and mean + sigma // arbitrary coefficient, we can add a slider !! if (WavCL < mea[0]) { - beta = 0.4f * red0;//preserve very low contrast (sky...) + lbeta = 0.4f * red0;//preserve very low contrast (sky...) } else if (WavCL < mea[1]) { - beta = 0.5f * red1; + lbeta = 0.5f * red1; } else if (WavCL < mea[2]) { - beta = 0.7f * red2; + lbeta = 0.7f * red2; } else if (WavCL < mea[3]) { - beta = 1.f; //standard + lbeta = 1.f; //standard } else if (WavCL < mea[4]) { - beta = 1.f; + lbeta = 1.f; } else if (WavCL < mea[5]) { - beta = 0.8f; //+sigma + lbeta = 0.8f; //+sigma } else if (WavCL < mea[6]) { - beta = 0.6f; + lbeta = 0.6f; } else if (WavCL < mea[7]) { - beta = 0.4f; + lbeta = 0.4f; } else if (WavCL < mea[8]) { - beta = 0.2f; // + 2 sigma + lbeta = 0.2f; // + 2 sigma } else if (WavCL < mea[9]) { - beta = 0.1f; + lbeta = 0.1f; } else { - beta = 0.0f; + lbeta = 0.0f; } } @@ -3751,7 +3695,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz //linear transition HL float diagacc = 1.f; - float alpha = (1024.f + 15.f * (float) cpMul * scale * scale2 * beta * diagacc) / 1024.f ; + float alpha = (1024.f + 15.f * (float) cpMul * scale * scale2 * lbeta * diagacc) / 1024.f ; if (cp.HSmet && cp.contena) { float aaal = (1.f - alpha) / ((cp.b_lhl - cp.t_lhl) * kH[level]); @@ -3801,18 +3745,12 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz } if (cp.bam && cp.finena) { - float effect = cp.sigmadir; - float offs = 1.f; + const float effect = cp.sigmadir; + constexpr float offs = 1.f; float mea[10]; - float * beta = new float[W_L * H_L]; - - for (int co = 0; co < H_L * W_L; co++) { - beta[co] = 1.f; - } calceffect(level, mean, sigma, mea, effect, offs); - for (int co = 0; co < H_L * W_L; co++) { float WavCL = std::fabs(WavCoeffs_L[dir][co]); @@ -3841,12 +3779,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz } } - if (cp.opaW && cp.BAmet == 2) { - - - - int iteration = cp.ite; int itplus = 7 + iteration; int itmoins = 7 - iteration; @@ -3857,7 +3790,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz it = itmoins; } else if (level == med) { it = 7; - } else { /*if(level > med)*/ + } else { /*if (level > med)*/ it = itplus; } @@ -3865,8 +3798,8 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz //float bal = cp.balan;//-100 +100 float kba = 1.f; - // if(dir <3) kba= 1.f + bal/600.f; - // if(dir==3) kba = 1.f - bal/300.f; + // if (dir <3) kba= 1.f + bal/600.f; + // if (dir==3) kba = 1.f - bal/300.f; for (int i = 0; i < W_L * H_L; i++) { int ii = i / W_L; int jj = i - ii * W_L; @@ -3898,7 +3831,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz it = itmoins; } else if (level == med) { it = 7; - } else { /*if(level > med)*/ + } else { /*if (level > med)*/ it = itplus; } @@ -3906,8 +3839,8 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz float bal = cp.balan;//-100 +100 float kba = 1.f; - // if(dir <3) kba= 1.f + bal/600.f; - // if(dir==3) kba = 1.f - bal/300.f; + // if (dir <3) kba= 1.f + bal/600.f; + // if (dir==3) kba = 1.f - bal/300.f; for (int i = 0; i < W_L * H_L; i++) { int ii = i / W_L; int jj = i - ii * W_L; @@ -3945,8 +3878,6 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz } } } - - delete[] beta; } // to see each level of wavelet ...level from 0 to 8 @@ -3970,9 +3901,8 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f float mea[10]; float effect = cp.sigmacol; - float betaab = 1.f; + float betaab; float offs = 1.f; - float alphaC = 1.f; calceffect(level, meanab, sigmaab, mea, effect, offs); @@ -4022,7 +3952,7 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f } - alphaC = (1024.f + 15.f * cpMul * cpChrom * betaab * scale / 50.f) / 1024.f ; + const float alphaC = (1024.f + 15.f * cpMul * cpChrom * betaab * scale / 50.f) / 1024.f ; WavCoeffs_ab[dir][i] *= alphaC; } @@ -4032,7 +3962,7 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f float cpMulC = cp.mulC[level]; - // if( (cp.curv || cp.CHSLmet==1) && cp.CHmet!=2 && level < 9 && cpMulC != 0.f) { // cpMulC == 0.f means all will be multiplied by 1.f, so we can skip + // if ( (cp.curv || cp.CHSLmet==1) && cp.CHmet!=2 && level < 9 && cpMulC != 0.f) { // cpMulC == 0.f means all will be multiplied by 1.f, so we can skip if (cp.CHmet != 2 && level < 9 && cpMulC != 0.f && cp.chromena) { // cpMulC == 0.f means all will be multiplied by 1.f, so we can skip const float skinprot = params->wavelet.skinprotect; const float skinprotneg = -skinprot; @@ -4042,7 +3972,7 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f float mea[10]; float effect = cp.sigmacol; - float betaab = 0.f; + float betaab; float offs = 1.f; calceffect(level, meanab, sigmaab, mea, effect, offs); @@ -4161,7 +4091,7 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f if ((useOpacity && level < 9 && mulOpacity != 0.f) && cp.toningena) { //toning float mea[10]; float effect = cp.sigmaton; - float betaab = 0.f; + float betaab; float offs = 1.f; float protec = 0.01f * (100.f - cp.protab); float aref1 = cp.a_high; @@ -4283,7 +4213,7 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f it = itmoins; } else if (level == med) { it = 7; - } else { /*if(level > med)*/ + } else { /*if (level > med)*/ it = itplus; } @@ -4291,8 +4221,8 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f //float bal = cp.balan;//-100 +100 float kba = 1.f; - // if(dir <3) kba= 1.f + bal/600.f; - // if(dir==3) kba = 1.f - bal/300.f; + // if (dir <3) kba= 1.f + bal/600.f; + // if (dir==3) kba = 1.f - bal/300.f; for (int i = 0; i < W_ab * H_ab; i++) { int ii = i / W_ab; int jj = i - ii * W_ab; @@ -4324,7 +4254,7 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f it = itmoins; } else if (level == med) { it = 7; - } else { /*if(level > med)*/ + } else { /*if (level > med)*/ it = itplus; } @@ -4332,8 +4262,8 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f float bal = cp.balan;//-100 +100 float kba = 1.f; - // if(dir <3) kba= 1.f + bal/600.f; - // if(dir==3) kba = 1.f - bal/300.f; + // if (dir <3) kba= 1.f + bal/600.f; + // if (dir==3) kba = 1.f - bal/300.f; for (int i = 0; i < W_ab * H_ab; i++) { int ii = i / W_ab; int jj = i - ii * W_ab; @@ -4477,191 +4407,4 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f } } -void ImProcFunctions::softproc2(const LabImage* bufcolorig, const LabImage* bufcolfin, float rad, int bfh, int bfw, double epsilmax, double epsilmin, float thres, int sk, bool multiThread, int flag) -{ - if (flag == 0) { - if (rad > 0.f) { - array2D ble(bfw, bfh); - array2D guid(bfw, bfh); - Imagefloat *tmpImage = nullptr; - tmpImage = new Imagefloat(bfw, bfh); - -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int ir = 0; ir < bfh; ir++) - for (int jr = 0; jr < bfw; jr++) { - - float X, Y, Z; - float L = bufcolorig->L[ir][jr]; - float a = bufcolorig->a[ir][jr]; - float b = bufcolorig->b[ir][jr]; - Color::Lab2XYZ(L, a, b, X, Y, Z); - - guid[ir][jr] = Y / 32768.f; - float La = bufcolfin->L[ir][jr]; - float aa = bufcolfin->a[ir][jr]; - float ba = bufcolfin->b[ir][jr]; - Color::Lab2XYZ(La, aa, ba, X, Y, Z); - tmpImage->r(ir, jr) = X; - tmpImage->g(ir, jr) = Y; - tmpImage->b(ir, jr) = Z; - - ble[ir][jr] = Y / 32768.f; - } - - double aepsil = (epsilmax - epsilmin) / 90.f; - double bepsil = epsilmax - 100.f * aepsil; - double epsil = aepsil * 0.1 * rad + bepsil; - - float blur = 10.f / sk * (thres + 0.8f * rad); - rtengine::guidedFilter(guid, ble, ble, blur, epsil, multiThread, 4); - - - -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int ir = 0; ir < bfh; ir++) - for (int jr = 0; jr < bfw; jr++) { - float X = tmpImage->r(ir, jr); - float Y = 32768.f * ble[ir][jr]; - float Z = tmpImage->b(ir, jr); - float L, a, b; - Color::XYZ2Lab(X, Y, Z, L, a, b); - bufcolfin->L[ir][jr] = L; - } - - delete tmpImage; - } - } else if (flag == 1) { - if (rad > 0.f) { - array2D ble(bfw, bfh); - array2D blechro(bfw, bfh); - array2D hue(bfw, bfh); - array2D guid(bfw, bfh); - -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int ir = 0; ir < bfh; ir++) - for (int jr = 0; jr < bfw; jr++) { -// hue[ir][jr] = xatan2f(bufcolfin->b[ir][jr], bufcolfin->a[ir][jr]); -// float chromah = sqrt(SQR(bufcolfin->b[ir][jr]) + SQR(bufcolfin->a[ir][jr])); - - ble[ir][jr] = (bufcolfin->L[ir][jr]) / 32768.f; -// blechro[ir][jr] = chromah / 32768.f; - guid[ir][jr] = bufcolorig->L[ir][jr] / 32768.f; - } - - double aepsil = (epsilmax - epsilmin) / 90.f; - double bepsil = epsilmax - 100.f * aepsil; - double epsil = aepsil * 0.1 * rad + bepsil; - - if (rad != 0.f) { - float blur = rad; - blur = blur < 0.f ? -1.f / blur : 1.f + blur; - // int r1 = max(int(4 / sk * blur + 0.5), 1); - int r2 = max(int(25 / sk * blur + 0.5), 1); - - if (rad < 0.f) { - epsil = 0.0001; - } - - rtengine::guidedFilter(guid, ble, ble, r2, epsil, multiThread); -// rtengine::guidedFilter(guid, blechro, blechro, r1, 0.5 * epsil, multiThread); - } - - - -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int ir = 0; ir < bfh; ir++) - for (int jr = 0; jr < bfw; jr++) { - // float2 sincosval = xsincosf(hue[ir][jr]); - - bufcolfin->L[ir][jr] = 32768.f * ble[ir][jr]; - // bufcolfin->a[ir][jr] = 32768.f * sincosval.y * blechro[ir][jr]; - // bufcolfin->b[ir][jr] = 32768.f * sincosval.x * blechro[ir][jr]; - } - } - - } -} - - -void ImProcFunctions::Compresslevels2(float **Source, int W_L, int H_L, float compression, float detailattenuator, float thres, float mean, float maxp, float meanN, float maxN, float madL) -{ - //J.Desmis 12-2019 - - float exponent; - - if (detailattenuator > 0.f && detailattenuator < 0.05f) { - float betemp = expf(-(2.f - detailattenuator + 0.693147f)) - 1.f; //0.69315 = log(2) - exponent = 1.2f * xlogf(-betemp); - exponent /= 20.f; - } else if (detailattenuator >= 0.05f && detailattenuator < 0.25f) { - float betemp = expf(-(2.f - detailattenuator + 0.693147f)) - 1.f; - exponent = 1.2f * xlogf(-betemp); - exponent /= (-75.f * detailattenuator + 23.75f); - } else if (detailattenuator >= 0.25f) { - float betemp = expf(-(2.f - detailattenuator + 0.693147f)) - 1.f; - exponent = 1.2f * xlogf(-betemp); - exponent /= (-2.f * detailattenuator + 5.5f); - } else { - exponent = (compression - 1.0f) / 20.f; - } - - exponent += 1.f; - - - float ap = (thres - 1.f) / (maxp - mean); - float bp = 1.f - ap * mean; - - float a0 = (1.33f * thres - 1.f) / (1.f - mean); - float b0 = 1.f - a0 * mean; - - float apn = (thres - 1.f) / (maxN - meanN); - float bpn = 1.f - apn * meanN; - - float a0n = (1.33f * thres - 1.f) / (1.f - meanN); - float b0n = 1.f - a0n * meanN; - - -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int y = 0; y < H_L; y++) { - for (int x = 0; x < W_L; x++) { - float expone = 1.f; - - if (Source[y][x] >= 0.f) { - - if (Source[y][x] > mean) { - expone = 1.f + (exponent - 1.f) * (ap * Source[y][x] + bp); - } else { - expone = 1.f + (exponent - 1.f) * (a0 * Source[y][x] + b0); - } - - Source[y][x] = xexpf(xlogf(Source[y][x] + 0.05f * madL) * expone); - } else if (Source[y][x] < 0.f) { - if (-Source[y][x] > mean) { - expone = 1.f + (exponent - 1.f) * (apn * -Source[y][x] + bpn); - } else { - expone = 1.f + (exponent - 1.f) * (a0n * -Source[y][x] + b0n); - } - - Source[y][x] = -xexpf(xlogf(-Source[y][x] + 0.05f * madL) * expone); - } - } - } - -} - } From e25f5aa455198a7bbaa89bb33170f74e80c11af5 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 12 May 2020 09:11:16 +0200 Subject: [PATCH 105/109] Rebuild wavtm with curve finerCoraser - language - various chnages to denoise --- rtdata/languages/default | 32 ++++++----- rtengine/curves.cc | 37 ++++++++++++ rtengine/curves.h | 26 +++++++++ rtengine/dcrop.cc | 8 ++- rtengine/improccoordinator.cc | 9 ++- rtengine/improccoordinator.h | 1 + rtengine/improcfun.h | 14 +++-- rtengine/ipwavelet.cc | 103 +++++++++++++++++++++++----------- rtengine/procparams.cc | 26 ++++++++- rtengine/procparams.h | 7 ++- rtengine/simpleprocess.cc | 10 +++- rtgui/paramsedited.cc | 6 ++ rtgui/paramsedited.h | 1 + rtgui/wavelet.cc | 44 ++++++++++++--- rtgui/wavelet.h | 3 + 15 files changed, 255 insertions(+), 72 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 5f8906b3d..69b7449e3 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -567,10 +567,10 @@ HISTORY_MSG_314;W - Gamut - Reduce artifacts HISTORY_MSG_315;W - Residual - Contrast HISTORY_MSG_316;W - Gamut - Skin tar/prot HISTORY_MSG_317;W - Gamut - Skin hue -HISTORY_MSG_318;W - Contrast - Highlight levels -HISTORY_MSG_319;W - Contrast - Highlight range -HISTORY_MSG_320;W - Contrast - Shadow range -HISTORY_MSG_321;W - Contrast - Shadow levels +HISTORY_MSG_318;W - Contrast - Fine levels +HISTORY_MSG_319;W - Contrast - Fine range +HISTORY_MSG_320;W - Contrast - Coarse range +HISTORY_MSG_321;W - Contrast - Coarse levels HISTORY_MSG_322;W - Gamut - Avoid color shift HISTORY_MSG_323;W - ES - Local contrast HISTORY_MSG_324;W - Chroma - Pastel @@ -2193,6 +2193,7 @@ TP_WAVELET_CONTEDIT;'After' contrast curve TP_WAVELET_CONTFRAME;Contrast - Compression TP_WAVELET_CONTR;Gamut TP_WAVELET_CONTRA;Contrast +TP_WAVELET_CONTRASTEDIT;Finer - Coarser levels TP_WAVELET_CONTRAST_MINUS;Contrast - TP_WAVELET_CONTRAST_PLUS;Contrast + TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image. @@ -2240,9 +2241,10 @@ TP_WAVELET_EDVAL;Strength TP_WAVELET_FINAL;Final Touchup TP_WAVELET_FINCFRAME;Final Local Contrast TP_WAVELET_FINEST;Finest -TP_WAVELET_HIGHLIGHT;Highlight luminance range +TP_WAVELET_HIGHLIGHT;Finer levels luminance range +TP_WAVELET_FINCOAR_TOOLTIP;The left (positive) part of the curve acts on the finer levels (increase).\nThe 2 points on the abscissa represent the respective action limits of finer and coarser levels 5 and 6 (default).\nThe right (negative) part of the curve acts on the coarser levels (increase).\nAvoid moving the left part of the curve with negative values. Avoid moving the right part of the curve with positives values TP_WAVELET_HS1;Whole luminance range -TP_WAVELET_HS2;Shadows/Highlights +TP_WAVELET_HS2;Selective luminance range TP_WAVELET_HUESKIN;Skin hue TP_WAVELET_HUESKIN_TOOLTIP;The bottom points set the beginning of the transition zone, and the upper points the end of it, where the effect is at its maximum.\n\nIf you need to move the area significantly, or if there are artifacts, then the white balance is incorrect. TP_WAVELET_HUESKY;Sky hue @@ -2252,8 +2254,8 @@ TP_WAVELET_ITER_TOOLTIP;Left: increase low levels and reduce high levels,\nRight TP_WAVELET_LABEL;Wavelet Levels TP_WAVELET_LARGEST;Coarsest TP_WAVELET_LEVCH;Chroma -TP_WAVELET_LEVDIR_ALL;All levels in all directions -TP_WAVELET_LEVDIR_INF;Below or equal the level +TP_WAVELET_LEVDIR_ALL;All levels, in all directions +TP_WAVELET_LEVDIR_INF;Finer details levels, with selected level TP_WAVELET_LEVDIR_ONE;One level TP_WAVELET_LEVDIR_SUP;Above the level TP_WAVELET_LEVELS;Wavelet levels @@ -2266,7 +2268,7 @@ TP_WAVELET_LEVTWO;Level 3 TP_WAVELET_LEVZERO;Level 1 TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength TP_WAVELET_LIPST;Enhanced algoritm -TP_WAVELET_LOWLIGHT;Shadow luminance range +TP_WAVELET_LOWLIGHT;Coarser levels luminance range TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise TP_WAVELET_MEDGREINF;First level TP_WAVELET_MEDI;Reduce artifacts in blue sky @@ -2277,6 +2279,7 @@ TP_WAVELET_MERGEL;Merge Luma TP_WAVELET_NEUTRAL;Neutral TP_WAVELET_NOIS;Denoise TP_WAVELET_NOISE;Denoise and Refine +TP_WAVELET_NOISE_TOOLTIP;If level 4 luminance denoise superior to 20, mode Agressive is used.\nIf chrominance coarse superior to 20, mode Agressive is used. TP_WAVELET_NPHIGH;High TP_WAVELET_NPLOW;Low TP_WAVELET_NPNONE;None @@ -2318,11 +2321,12 @@ TP_WAVELET_SOFTRAD;Soft Radius TP_WAVELET_STREN;Strength TP_WAVELET_STRENGTH;Strength TP_WAVELET_SUPE;Extra -TP_WAVELET_THR;Shadows threshold -TP_WAVELET_THRESHOLD;Highlight levels -TP_WAVELET_THRESHOLD2;Shadow levels -TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels between 9 and 9 minus the value will be affected by the shadow luminance range. Other levels will be fully treated. The highest level possible is limited by the highlight level value (9 minus highlight level value). -TP_WAVELET_THRESHOLD_TOOLTIP;Only levels beyond the chosen value will be affected by the highlight luminance range. Other levels will be fully treated. The chosen value here limits the highest possible value of the shadow levels. +TP_WAVELET_THRESHOLD;Finer levels +TP_WAVELET_THRESHOLD2;Coarser levels +//TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels between 9 and 9 minus the value will be affected by the shadow luminance range. Other levels will be fully treated. The highest level possible is limited by the highlight level value (9 minus highlight level value). +//TP_WAVELET_THRESHOLD_TOOLTIP;Only levels beyond the chosen value will be affected by the highlight luminance range. Other levels will be fully treated. The chosen value here limits the highest possible value of the shadow levels. +TP_WAVELET_THRESHOLD_TOOLTIP;Only levels beyond the chosen value will be affected by the highlight luminance range. Other levels will be fully treated. The chosen value here limits the highest possible value of the shadow levels. : All levels from level 1 up to the chosen value will only be affected within the Finer levels luminance range.\nAll other levels will have the whole range of luminances affected, unless the Coarser levels setting limits it.\nThe chosen value in this slider becomes the minimum possible value of the Coarser levels. +TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels between 9 and 9 minus the value will be affected by the shadow luminance range. Other levels will be fully treated. The highest level possible is limited by the highlight level value (9 minus highlight level value). : Only levels between the chosen value and level 9/Extra will be affected by the Coarser levels luminance range.\nAll other levels will have the whole range of luminances affected, unless the Finer levels setting limits it.\nThe lower level possible that will be considered by the algorithm is limited by the Finer levels value. TP_WAVELET_THRESWAV;Balance Threshold TP_WAVELET_THRH;Highlights threshold TP_WAVELET_TILESBIG;Tiles diff --git a/rtengine/curves.cc b/rtengine/curves.cc index 14711c730..ebb23e754 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -1278,6 +1278,43 @@ void WavOpacityCurveRG::Set(const std::vector &curvePoints) } +WavOpacityCurveSH::WavOpacityCurveSH() {} + +void WavOpacityCurveSH::Reset() +{ + lutOpacityCurveSH.reset(); +} + +void WavOpacityCurveSH::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutOpacityCurveSH(501); // raise this value if the quality suffers from this number of samples + + for (int i = 0; i < 501; i++) { + lutOpacityCurveSH[i] = pCurve.getVal(double(i) / 500.); + } +} + +void WavOpacityCurveSH::Set(const std::vector &curvePoints) +{ + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + tcurve.setIdentityValue(0.); + Set(tcurve); + } else { + Reset(); + } + +} + + + + + WavOpacityCurveBY::WavOpacityCurveBY() {} void WavOpacityCurveBY::Reset() diff --git a/rtengine/curves.h b/rtengine/curves.h index 03fa3e812..0fb58cc9e 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -673,6 +673,32 @@ public: return lutOpacityCurveRG; } }; + +class WavOpacityCurveSH +{ +private: + LUTf lutOpacityCurveSH; // 0xffff range + void Set(const Curve &pCurve); +public: + virtual ~WavOpacityCurveSH() {}; + WavOpacityCurveSH(); + + void Reset(); + // void Set(const std::vector &curvePoints, bool &opautili); + void Set(const std::vector &curvePoints); + float operator[](float index) const + { + return lutOpacityCurveSH[index]; + } + + operator bool (void) const + { + return lutOpacityCurveSH; + } +}; + + + class WavOpacityCurveBY { private: diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 11bf19edf..f58f2e4c9 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -969,12 +969,13 @@ void Crop::update(int todo) WavCurve wavCLVCurve; Wavblcurve wavblcurve; WavOpacityCurveRG waOpacityCurveRG; + WavOpacityCurveSH waOpacityCurveSH; WavOpacityCurveBY waOpacityCurveBY; WavOpacityCurveW waOpacityCurveW; WavOpacityCurveWL waOpacityCurveWL; LUTf wavclCurve; - params.wavelet.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); + params.wavelet.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); LabImage *unshar = nullptr; Glib::ustring provis; LabImage *provradius = nullptr; @@ -1003,7 +1004,7 @@ void Crop::update(int todo) unshar = new LabImage(labnCrop->W, labnCrop->H); provis = params.wavelet.CLmethod; params.wavelet.CLmethod = "all"; - parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); + parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); unshar->CopyFrom(labnCrop); params.wavelet.CLmethod = provis; @@ -1016,7 +1017,8 @@ void Crop::update(int todo) WaveParams.expnoise = false; } - parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); + // parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); + parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { WaveParams.expcontrast = procont; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index f68616b96..f7f8756d2 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -891,7 +891,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if ((params->wavelet.enabled)) { WaveletParams WaveParams = params->wavelet; - WaveParams.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); +// WaveParams.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); + WaveParams.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); int kall = 0; LabImage *unshar = nullptr; Glib::ustring provis; @@ -920,7 +921,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) unshar = new LabImage(pW, pH); provis = params->wavelet.CLmethod; params->wavelet.CLmethod = "all"; - ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); + ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); +// ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); unshar->CopyFrom(nprevl); @@ -934,7 +936,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) WaveParams.expnoise = false; } - ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); +// ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); + ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index e17d88183..e4858c76b 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -141,6 +141,7 @@ protected: WavCurve wavCLVCurve; Wavblcurve wavblcurve; WavOpacityCurveRG waOpacityCurveRG; + WavOpacityCurveSH waOpacityCurveSH; WavOpacityCurveBY waOpacityCurveBY; WavOpacityCurveW waOpacityCurveW; WavOpacityCurveWL waOpacityCurveWL; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index b2df86112..f4a452dcc 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -55,6 +55,7 @@ class ToneCurve; class WavCurve; class Wavblcurve; class WavOpacityCurveBY; +class WavOpacityCurveSH; class WavOpacityCurveRG; class WavOpacityCurveW; class WavOpacityCurveWL; @@ -201,19 +202,22 @@ public: int pitch, int scale, const int luma, const int chroma/*, LUTf & Lcurve, LUTf & abcurve*/); void Tile_calc(int tilesize, int overlap, int kall, int imwidth, int imheight, int &numtiles_W, int &numtiles_H, int &tilewidth, int &tileheight, int &tileWskip, int &tileHskip); - void ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip); +// void ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip); + void ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveSH & waOpacityCurveSH, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip); void WaveletcontAllL(LabImage * lab, float **varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_L, const Wavblcurve & wavblcurve, - struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili); +// struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili); + struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveSH & waOpacityCurveSH, FlatCurve* ChCurve, bool Chutili); void WaveletcontAllLfinal(const wavelet_decomposition &WaveletCoeffs_L, const cont_params &cp, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL); void WaveletcontAllAB(LabImage * lab, float **varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_a, const Wavblcurve & wavblcurve, const WavOpacityCurveW & waOpacityCurveW, struct cont_params &cp, const bool useChannelA, int skip, float *meanab, float *sigmaab); void WaveletAandBAllAB(const wavelet_decomposition &WaveletCoeffs_a, const wavelet_decomposition &WaveletCoeffs_b, const cont_params &cp, FlatCurve* hhcurve, bool hhutili); void ContAllL(float **koeLi, float *maxkoeLi, bool lipschitz, int maxlvl, LabImage * lab, float **varhue, float **varchrom, float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp, - int W_L, int H_L, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili); - void finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, const cont_params &cp, - int W_L, int H_L, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL); + // int W_L, int H_L, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili); + int W_L, int H_L, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveSH & waOpacityCurveSH, FlatCurve* ChCurve, bool Chutili); + void finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, const cont_params &cp, + int W_L, int H_L, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL); void ContAllAB(LabImage * lab, int maxlvl, float **varhue, float **varchrom, float ** WavCoeffs_a, float * WavCoeffs_a0, int level, int dir, const WavOpacityCurveW & waOpacityCurveW, struct cont_params &cp, int W_ab, int H_ab, const bool useChannelA, float *meanab, float *sigmaab); void Evaluate2(const wavelet_decomposition &WaveletCoeffs_L, diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 445cfdd06..373ea6ef0 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -164,7 +164,8 @@ struct cont_params { int wavNestedLevels = 1; -void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip) +//void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip) +void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveSH & waOpacityCurveSH, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip) { @@ -469,9 +470,12 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.t_lsl = static_cast(params->wavelet.bllev.getTopLeft()); cp.b_rsl = static_cast(params->wavelet.bllev.getBottomRight()); cp.t_rsl = static_cast(params->wavelet.bllev.getTopRight()); - cp.numlevS = params->wavelet.threshold2; - int maxlevS = 9 - cp.numlevH; - cp.numlevS = rtengine::min(cp.numlevS, maxlevS); +// cp.numlevS = params->wavelet.threshold2; +// int maxlevS = 9 - cp.numlevH; +// cp.numlevS = rtengine::min(cp.numlevS, maxlevS); + cp.numlevS = 9 - params->wavelet.threshold2; + int maxlevS = cp.numlevH; + cp.numlevS = rtengine::max(cp.numlevS, maxlevS); //highlight cp.b_lhl = static_cast(params->wavelet.hllev.getBottomLeft()); cp.t_lhl = static_cast(params->wavelet.hllev.getTopLeft()); @@ -958,7 +962,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } if ((cp.lev0n > 0.1f || cp.lev1n > 0.1f || cp.lev2n > 0.1f || cp.lev3n > 0.1f) && cp.noiseena) { - int edge = 4; + int edge = 1; vari[0] = rtengine::max(0.000001f, vari[0]); vari[1] = rtengine::max(0.000001f, vari[1]); vari[2] = rtengine::max(0.000001f, vari[2]); @@ -1001,7 +1005,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } - if (cp.lev3n < 0.5f) { + if (cp.lev3n < 20.f) { WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, vari, edge, 1); } else { WaveletDenoiseAll_BiShrinkL(*Ldecomp, noisevarlum, madL, vari, edge, 1); @@ -1023,7 +1027,8 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const Chutili = true; } - WaveletcontAllL(labco, varhue, varchro, *Ldecomp, wavblcurve, cp, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); +// WaveletcontAllL(labco, varhue, varchro, *Ldecomp, wavblcurve, cp, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); + WaveletcontAllL(labco, varhue, varchro, *Ldecomp, wavblcurve, cp, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, waOpacityCurveSH, ChCurve, Chutili); if (cp.val > 0 || ref || contr || cp.diagcurv) { //edge Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN); @@ -1048,16 +1053,16 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const float noiseccr = cp.chromco; if (cp.balchrom > 0.f) { - noisecfr = cp.chromfi * ((100.f + cp.balchrom) / 10.f); - noiseccr = cp.chromco + ((100.f + cp.balchrom) / 10.f); + noisecfr = cp.chromfi + 0.1f * cp.balchrom; + noiseccr = cp.chromco + 0.1f * cp.balchrom; } float noisecfb = cp.chromfi; float noiseccb = cp.chromco; if (cp.balchrom < 0.f) { - noisecfb = cp.chromfi * ((100.f - cp.balchrom) / 10.f); - noiseccb = cp.chromco * ((100.f - cp.balchrom) / 10.f); + noisecfb = cp.chromfi - 0.1f * cp.balchrom; + noiseccb = cp.chromco - 0.1f * cp.balchrom; } @@ -1292,7 +1297,11 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr adecomp(new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwava, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!adecomp->memoryAllocationFailed) { - if (cp.noiseena && (cp.chromfi > 0.f || cp.chromco > 0.f)) { +// if (cp.noiseena && (cp.chromfi > 0.f || cp.chromco > 0.f)) { + if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.chromco < 2.f )) { + WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); + } else if (cp.chromfi > 0.f && cp.chromco >= 2.f){ + WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); } @@ -1326,7 +1335,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!bdecomp->memoryAllocationFailed) { - if (cp.noiseena && (cp.chromfi > 0.f || cp.chromco > 0.f)) { +// if (cp.noiseena && (cp.chromfi > 0.f || cp.chromco > 0.f)) { + if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.chromco < 2.f )) { + WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); + } else if (cp.chromfi > 0.f && cp.chromco >= 2.f){ WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); } @@ -1356,21 +1368,34 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!adecomp->memoryAllocationFailed && !bdecomp->memoryAllocationFailed) { - if (cp.noiseena && (cp.chromfi > 0.f || cp.chromco > 0.f)) { +// if (cp.noiseena && (cp.chromfi > 0.f || cp.chromco > 0.f)) { + if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.chromco < 2.f)) { + WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); + } else if (cp.chromfi > 0.f && cp.chromco >= 2.f){ WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); } Evaluate2(*adecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); WaveletcontAllAB(labco, varhue, varchro, *adecomp, wavblcurve, waOpacityCurveW, cp, true, skip, meanab, sigmaab); - WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); - WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); - Evaluate2(*bdecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); + if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.chromco < 2.f)) { + WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); + } else if (cp.chromfi > 0.f && cp.chromco >= 2.f){ + WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); + WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); + } +// WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); +// WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); + Evaluate2(*bdecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); +/* if (cp.noiseena && (cp.chromfi > 0.f || cp.chromco > 0.f)) { WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip, meanab, sigmaab); WaveletAandBAllAB(*adecomp, *bdecomp, cp, hhCurve, hhutili); } + */ + WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip, meanab, sigmaab); + WaveletAandBAllAB(*adecomp, *bdecomp, cp, hhCurve, hhutili); adecomp->reconstruct(labco->data + datalen, cp.strength); bdecomp->reconstruct(labco->data + 2 * datalen, cp.strength); @@ -2022,7 +2047,8 @@ void ImProcFunctions::WaveletcontAllLfinal(const wavelet_decomposition &WaveletC void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_L, const Wavblcurve & wavblcurve, - struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili) +// struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili) + struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveSH & waOpacityCurveSH, FlatCurve* ChCurve, bool Chutili) { const int maxlvl = WaveletCoeffs_L.maxlevel(); const int W_L = WaveletCoeffs_L.level_W(0); @@ -2422,7 +2448,8 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl); - ContAllL(koeLi, maxkoeLi, true, maxlvl, labco, varhue, varchrom, WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); +// ContAllL(koeLi, maxkoeLi, true, maxlvl, labco, varhue, varchrom, WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); + ContAllL(koeLi, maxkoeLi, true, maxlvl, labco, varhue, varchrom, WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, waOpacityCurveSH, ChCurve, Chutili); if (wavblcurve && wavcurvecomp && cp.blena) { // printf("Blur level L\n"); @@ -3106,7 +3133,8 @@ void ImProcFunctions::finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, } void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz, int maxlvl, LabImage * labco, float ** varhue, float **varchrom, float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp, - int W_L, int H_L, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili) +// int W_L, int H_L, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili) + int W_L, int H_L, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveSH & waOpacityCurveSH, FlatCurve* ChCurve, bool Chutili) { assert(level >= 0); assert(maxlvl > level); @@ -3605,7 +3633,8 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz float red2 = 0.011f * (110.f - lowthr); for (int i = 0; i < W_L * H_L; i++) { - float kLlev = 1.f; + float kLlevH = 1.f; + float kLlevS = 1.f; if (cpMul < 0.f) { lbeta = 1.f; // disabled for negatives values "less contrast" @@ -3697,7 +3726,8 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz float diagacc = 1.f; float alpha = (1024.f + 15.f * (float) cpMul * scale * scale2 * lbeta * diagacc) / 1024.f ; - if (cp.HSmet && cp.contena) { + // if (cp.HSmet && cp.contena) { + if (cp.HSmet && cp.contena && waOpacityCurveSH) { float aaal = (1.f - alpha) / ((cp.b_lhl - cp.t_lhl) * kH[level]); float bbal = 1.f - aaal * cp.b_lhl * kH[level]; float aaar = (alpha - 1.f) / (cp.t_rhl - cp.b_rhl) * kH[level]; @@ -3708,35 +3738,40 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz float aaarS = (alpha - 1.f) / (cp.t_rsl - cp.b_rsl); float bbbrS = 1.f - cp.b_rsl * aaarS; - if (level <= cp.numlevH) { //in function of levels +// if (level <= cp.numlevH) { //in function of levels + float klevred = 2.f * (waOpacityCurveSH[level * 55.5f] - 0.5f); + if(klevred > 0.f && level <= 6) {// level < 6 to avoid bad use of the curve if user put negative values positives if ((LL100 > cp.t_lhl * kH[level] && LL100 < cp.t_rhl * kH[level])) { - kLlev = alpha; + kLlevH = alpha; } else if ((LL100 > cp.b_lhl * kH[level] && LL100 <= cp.t_lhl * kH[level])) { - kLlev = aaal * LL100 + bbal; + kLlevH = aaal * LL100 + bbal; } else if ((LL100 > cp.t_rhl * kH[level] && LL100 <= cp.b_rhl * kH[level])) { - kLlev = aaar * LL100 + bbbr; + kLlevH = aaar * LL100 + bbbr; } else { - kLlev = 1.f; + kLlevH = 1.f; } + kLlevH = 1.f + (kLlevH - 1.f) * klevred; } - if (level >= (9 - cp.numlevS)) { + // if (level >= (9 - cp.numlevS)) { + if(klevred < 0.f && level >= 3) {//level > 3 to avoid bad use of the curve if user put positives values negatives if ((LL100 > cp.t_lsl && LL100 < cp.t_rsl)) { - kLlev = alpha; + kLlevS = alpha; } else if ((LL100 > cp.b_lsl && LL100 <= cp.t_lsl)) { - kLlev = aaalS * LL100 + bbalS; + kLlevS = aaalS * LL100 + bbalS; } else if ((LL100 > cp.t_rsl && LL100 <= cp.b_rsl)) { - kLlev = aaarS * LL100 + bbbrS; + kLlevS = aaarS * LL100 + bbbrS; } else { - kLlev = 1.f; + kLlevS = 1.f; } + kLlevS = 1.f - (kLlevS - 1.f) * klevred; } } else { - kLlev = alpha; + kLlevH = kLlevS = alpha; } - WavCoeffs_L[dir][i] *= (kLlev); + WavCoeffs_L[dir][i] *= (kLlevH * kLlevS); } } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index e1765a5f0..4df201503 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2191,6 +2191,25 @@ WaveletParams::WaveletParams() : 0.35, 0.35 }, + opacityCurveSH{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1., + 0.35, + 0.35, + 0.4, + 0.5, + 0.35, + 0.35, + 0.5, + 0.5, + 0.35, + 0.35, + 1., + 0., + 0.35, + 0.35 + }, opacityCurveBY{ static_cast(FCT_MinMaxCPoints), 0.0, @@ -2322,7 +2341,7 @@ WaveletParams::WaveletParams() : chroma(5), chro(0), threshold(5), - threshold2(4), + threshold2(5), edgedetect(90), edgedetectthr(20), edgedetectthr2(0), @@ -2359,6 +2378,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const ccwcurve == other.ccwcurve && blcurve == other.blcurve && opacityCurveRG == other.opacityCurveRG + && opacityCurveSH == other.opacityCurveSH && opacityCurveBY == other.opacityCurveBY && opacityCurveW == other.opacityCurveW && opacityCurveWL == other.opacityCurveWL @@ -2492,6 +2512,7 @@ void WaveletParams::getCurves( WavCurve& cCurve, Wavblcurve& tCurve, WavOpacityCurveRG& opacityCurveLUTRG, + WavOpacityCurveSH& opacityCurveLUTSH, WavOpacityCurveBY& opacityCurveLUTBY, WavOpacityCurveW& opacityCurveLUTW, WavOpacityCurveWL& opacityCurveLUTWL @@ -2500,6 +2521,7 @@ void WaveletParams::getCurves( cCurve.Set(this->ccwcurve); tCurve.Set(this->blcurve); opacityCurveLUTRG.Set(this->opacityCurveRG); + opacityCurveLUTSH.Set(this->opacityCurveSH); opacityCurveLUTBY.Set(this->opacityCurveBY); opacityCurveLUTW.Set(this->opacityCurveW); opacityCurveLUTWL.Set(this->opacityCurveWL); @@ -3631,6 +3653,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.pastlev, "Wavelet", "Pastlev", wavelet.pastlev.toVector(), keyFile); saveToKeyfile(!pedited || pedited->wavelet.satlev, "Wavelet", "Satlev", wavelet.satlev.toVector(), keyFile); saveToKeyfile(!pedited || pedited->wavelet.opacityCurveRG, "Wavelet", "OpacityCurveRG", wavelet.opacityCurveRG, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.opacityCurveSH, "Wavelet", "Levalshc", wavelet.opacityCurveSH, keyFile); saveToKeyfile(!pedited || pedited->wavelet.opacityCurveBY, "Wavelet", "OpacityCurveBY", wavelet.opacityCurveBY, keyFile); saveToKeyfile(!pedited || pedited->wavelet.opacityCurveW, "Wavelet", "OpacityCurveW", wavelet.opacityCurveW, keyFile); saveToKeyfile(!pedited || pedited->wavelet.opacityCurveWL, "Wavelet", "OpacityCurveWL", wavelet.opacityCurveWL, keyFile); @@ -4830,6 +4853,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "ContrastCurve", pedited, wavelet.ccwcurve, pedited->wavelet.ccwcurve); assignFromKeyfile(keyFile, "Wavelet", "blcurve", pedited, wavelet.blcurve, pedited->wavelet.blcurve); assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveRG", pedited, wavelet.opacityCurveRG, pedited->wavelet.opacityCurveRG); + assignFromKeyfile(keyFile, "Wavelet", "Levelshc", pedited, wavelet.opacityCurveSH, pedited->wavelet.opacityCurveSH); assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveBY", pedited, wavelet.opacityCurveBY, pedited->wavelet.opacityCurveBY); assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveW", pedited, wavelet.opacityCurveW, pedited->wavelet.opacityCurveW); assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveWL", pedited, wavelet.opacityCurveWL, pedited->wavelet.opacityCurveWL); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 24995525d..8e3ff5b6c 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -42,6 +42,7 @@ class RetinextransmissionCurve; class WavCurve; class Wavblcurve; class WavOpacityCurveBY; +class WavOpacityCurveSH; class WavOpacityCurveRG; class WavOpacityCurveW; class WavOpacityCurveWL; @@ -1187,7 +1188,9 @@ private: struct WaveletParams { std::vector ccwcurve; std::vector blcurve; + std::vector levelshc; std::vector opacityCurveRG; + std::vector opacityCurveSH; std::vector opacityCurveBY; std::vector opacityCurveW; std::vector opacityCurveWL; @@ -1316,8 +1319,8 @@ struct WaveletParams { void getCurves( WavCurve& cCurve, Wavblcurve& tCurve, - WavOpacityCurveRG& - opacityCurveLUTRG, + WavOpacityCurveRG& opacityCurveLUTRG, + WavOpacityCurveSH& opacityCurveLUTSH, WavOpacityCurveBY& opacityCurveLUTBY, WavOpacityCurveW& opacityCurveLUTW, WavOpacityCurveWL& opacityCurveLUTWL diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 14a594ac2..92a3d7f29 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1127,6 +1127,7 @@ private: WavCurve wavCLVCurve; Wavblcurve wavblcurve; WavOpacityCurveRG waOpacityCurveRG; + WavOpacityCurveSH waOpacityCurveSH; WavOpacityCurveBY waOpacityCurveBY; WavOpacityCurveW waOpacityCurveW; WavOpacityCurveWL waOpacityCurveWL; @@ -1149,7 +1150,8 @@ private: provradius->CopyFrom(labView); } - params.wavelet.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); +// params.wavelet.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); + params.wavelet.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); CurveFactory::curveWavContL(wavcontlutili, params.wavelet.wavclCurve, wavclCurve,/* hist16C, dummy,*/ 1); @@ -1157,7 +1159,8 @@ private: unshar = new LabImage(fw, fh); provis = params.wavelet.CLmethod; params.wavelet.CLmethod = "all"; - ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); +// ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); + ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); unshar->CopyFrom(labView); params.wavelet.CLmethod = provis; @@ -1169,7 +1172,8 @@ private: WaveParams.expnoise = false; } - ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); +// ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); + ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { WaveParams.expcontrast = procont; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 85119fe80..b9f7d4791 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -565,6 +565,7 @@ void ParamsEdited::set(bool v) wavelet.level3noise = v; wavelet.ccwcurve = v; wavelet.blcurve = v; + wavelet.opacityCurveSH = v; wavelet.opacityCurveRG = v; wavelet.opacityCurveBY = v; wavelet.opacityCurveW = v; @@ -1187,6 +1188,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.satlev = wavelet.satlev && p.wavelet.satlev == other.wavelet.satlev; wavelet.ccwcurve = wavelet.ccwcurve && p.wavelet.ccwcurve == other.wavelet.ccwcurve; wavelet.blcurve = wavelet.blcurve && p.wavelet.blcurve == other.wavelet.blcurve; + wavelet.opacityCurveSH = wavelet.opacityCurveSH && p.wavelet.opacityCurveSH == other.wavelet.opacityCurveSH; wavelet.opacityCurveRG = wavelet.opacityCurveRG && p.wavelet.opacityCurveRG == other.wavelet.opacityCurveRG; wavelet.opacityCurveBY = wavelet.opacityCurveBY && p.wavelet.opacityCurveBY == other.wavelet.opacityCurveBY; wavelet.opacityCurveW = wavelet.opacityCurveW && p.wavelet.opacityCurveW == other.wavelet.opacityCurveW; @@ -3189,6 +3191,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.blcurve = mods.wavelet.blcurve; } + if (wavelet.opacityCurveSH) { + toEdit.wavelet.opacityCurveSH = mods.wavelet.opacityCurveSH; + } + if (wavelet.opacityCurveRG) { toEdit.wavelet.opacityCurveRG = mods.wavelet.opacityCurveRG; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 68340309d..6655bbcda 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -577,6 +577,7 @@ struct WaveletParamsEdited { bool level3noise; bool ccwcurve; bool blcurve; + bool opacityCurveSH; bool opacityCurveBY; bool opacityCurveRG; bool opacityCurveW; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 1f4714452..53c7ef90b 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -63,6 +63,7 @@ std::vector makeWholeHueRange() Wavelet::Wavelet() : FoldableToolPanel(this, "wavelet", M("TP_WAVELET_LABEL"), true, true), curveEditorG(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_CONTEDIT"))), + curveEditorC(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_CONTRASTEDIT"))), CCWcurveEditorG(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_CCURVE"))), curveEditorbl(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_BLCURVE"))), curveEditorRES(new CurveEditorGroup(options.lastWaveletCurvesDir)), @@ -131,7 +132,8 @@ Wavelet::Wavelet() : level2noise(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_LEVTWO"), -30., 100., 0., M("TP_WAVELET_STREN"), 1., 0., 100., 0., M("TP_WAVELET_NOIS"), 1., nullptr, false))), level3noise(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_LEVTHRE"), -30., 100., 0., M("TP_WAVELET_STREN"), 1., 0., 100., 0., M("TP_WAVELET_NOIS"), 1., nullptr, false))), threshold(Gtk::manage(new Adjuster(M("TP_WAVELET_THRESHOLD"), 1, 9, 1, 5))), - threshold2(Gtk::manage(new Adjuster(M("TP_WAVELET_THRESHOLD2"), 1, 9, 1, 4))), + // threshold2(Gtk::manage(new Adjuster(M("TP_WAVELET_THRESHOLD2"), 1, 9, 1, 4))), + threshold2(Gtk::manage(new Adjuster(M("TP_WAVELET_THRESHOLD2"), 1, 9, 1, 5))), edgedetect(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGEDETECT"), 0, 100, 1, 90))), edgedetectthr(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGEDETECTTHR"), 0, 100, 1, 20))), edgedetectthr2(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGEDETECTTHR2"), -10, 100, 1, 0))), @@ -224,6 +226,7 @@ Wavelet::Wavelet() : EvWavLabGridValue = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVLABGRID_VALUE"); EvWavrangeab = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_RANGEAB"); EvWavprotab = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_PROTAB"); + EvWavlevelshc = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_LEVELSHC"); labgrid = Gtk::manage(new LabGrid(EvWavLabGridValue, M("TP_WAVELET_LABGRID_VALUES"))); @@ -422,11 +425,25 @@ Wavelet::Wavelet() : threshold2->setAdjusterListener(this); threshold2->set_tooltip_text(M("TP_WAVELET_THRESHOLD2_TOOLTIP")); + const WaveletParams default_params; + + curveEditorC->setCurveListener(this); + curveEditorC->set_tooltip_text(M("TP_WAVELET_FINCOAR_TOOLTIP")); + + + opacityShapeSH = static_cast(curveEditorC->addCurve(CT_Flat, "", nullptr, false, false)); + opacityShapeSH->setIdentityValue(0.); + opacityShapeSH->setResetCurve(FlatCurveType(default_params.opacityCurveSH.at(0)), default_params.opacityCurveSH); + + curveEditorC->curveListComplete(); + curveEditorC->show(); + contrastSHVBox->pack_start(*HSmethod); contrastSHVBox->pack_start(*hllev); - contrastSHVBox->pack_start(*threshold); + // contrastSHVBox->pack_start(*threshold); contrastSHVBox->pack_start(*bllev); - contrastSHVBox->pack_start(*threshold2); +// contrastSHVBox->pack_start(*threshold2); + contrastSHVBox->pack_start(*curveEditorC); Gtk::Frame* const contrastSHFrame = Gtk::manage(new Gtk::Frame(M("TP_WAVELET_APPLYTO"))); contrastSHFrame->add(*contrastSHVBox); levBox->pack_start(*contrastSHFrame); @@ -511,7 +528,7 @@ Wavelet::Wavelet() : opaCurveEditorG->setCurveListener(this); - const WaveletParams default_params; +// const WaveletParams default_params; opacityShapeRG = static_cast(opaCurveEditorG->addCurve(CT_Flat, "", nullptr, false, false)); opacityShapeRG->setIdentityValue(0.); @@ -591,6 +608,7 @@ Wavelet::Wavelet() : chroBox->pack_start(*chromco); chroFrame->add(*chroBox); noiseBox->pack_start(*chroFrame); + noiseBox->set_tooltip_text(M("TP_WAVELET_NOISE_TOOLTIP")); //Clarity @@ -617,13 +635,13 @@ Wavelet::Wavelet() : // Edge Sharpness ToolParamBlock* const edgBox = Gtk::manage(new ToolParamBlock()); - edgeffect->setAdjusterListener(this); - edgBox->pack_start(*edgeffect); - edgeffect->set_tooltip_markup(M("TP_WAVELET_EDEFFECT_TOOLTIP")); edgval->setAdjusterListener(this); edgBox->pack_start(*edgval); + edgeffect->setAdjusterListener(this); + edgBox->pack_start(*edgeffect); + edgeffect->set_tooltip_markup(M("TP_WAVELET_EDEFFECT_TOOLTIP")); edgrad->setAdjusterListener(this); edgBox->pack_start(*edgrad); @@ -1033,6 +1051,7 @@ Wavelet::Wavelet() : opacityShapeWL->setIdentityValue(0.); opacityShapeWL->setResetCurve(FlatCurveType(default_params.opacityCurveWL.at(0)), default_params.opacityCurveWL); opacityShapeWL->setTooltip(M("TP_WAVELET_OPACITYWL_TOOLTIP")); + opacityShapeWL->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); sigmafin->setAdjusterListener(this); // This will add the reset button at the end of the curveType buttons @@ -1130,6 +1149,7 @@ Wavelet::~Wavelet() idle_register.destroy(); delete opaCurveEditorG; + delete curveEditorC; delete opacityCurveEditorG; delete curveEditorbl; delete CCWcurveEditorG; @@ -1359,6 +1379,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) ccshape->setCurve(pp->wavelet.ccwcurve); blshape->setCurve(pp->wavelet.blcurve); opacityShapeRG->setCurve(pp->wavelet.opacityCurveRG); + opacityShapeSH->setCurve(pp->wavelet.opacityCurveSH); opacityShapeBY->setCurve(pp->wavelet.opacityCurveBY); opacityShape->setCurve(pp->wavelet.opacityCurveW); opacityShapeWL->setCurve(pp->wavelet.opacityCurveWL); @@ -1579,6 +1600,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) exptoning->set_inconsistent(!pedited->wavelet.exptoning); expnoise->set_inconsistent(!pedited->wavelet.expnoise); opacityShapeRG->setCurve(pp->wavelet.opacityCurveRG); + opacityShapeSH->setCurve(pp->wavelet.opacityCurveSH); opacityShapeBY->setCurve(pp->wavelet.opacityCurveBY); opacityShape->setCurve(pp->wavelet.opacityCurveW); opacityShapeWL->setCurve(pp->wavelet.opacityCurveWL); @@ -1771,6 +1793,7 @@ void Wavelet::setEditProvider(EditDataProvider *provider) ccshape->setEditProvider(provider); blshape->setEditProvider(provider); opacityShapeRG->setEditProvider(provider); + opacityShapeSH->setEditProvider(provider); opacityShapeBY->setEditProvider(provider); opacityShape->setEditProvider(provider); opacityShapeWL->setEditProvider(provider); @@ -1848,6 +1871,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.ccwcurve = ccshape->getCurve(); pp->wavelet.blcurve = blshape->getCurve(); pp->wavelet.opacityCurveRG = opacityShapeRG->getCurve(); + pp->wavelet.opacityCurveSH = opacityShapeSH->getCurve(); pp->wavelet.opacityCurveBY = opacityShapeBY->getCurve(); pp->wavelet.opacityCurveW = opacityShape->getCurve(); pp->wavelet.opacityCurveWL = opacityShapeWL->getCurve(); @@ -1976,6 +2000,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.level2noise = level2noise->getEditedState(); pedited->wavelet.level3noise = level3noise->getEditedState(); pedited->wavelet.opacityCurveRG = !opacityShapeRG->isUnChanged(); + pedited->wavelet.opacityCurveSH = !opacityShapeSH->isUnChanged(); pedited->wavelet.opacityCurveBY = !opacityShapeBY->isUnChanged(); pedited->wavelet.opacityCurveW = !opacityShape->isUnChanged(); pedited->wavelet.opacityCurveWL = !opacityShapeWL->isUnChanged(); @@ -2158,6 +2183,8 @@ void Wavelet::curveChanged(CurveEditor* ce) listener->panelChanged(EvWavblshape, M("HISTORY_CUSTOMCURVE")); } else if (ce == opacityShapeRG) { listener->panelChanged(EvWavColor, M("HISTORY_CUSTOMCURVE")); + } else if (ce == opacityShapeSH) { + listener->panelChanged(EvWavlevelshc, M("HISTORY_CUSTOMCURVE")); } else if (ce == opacityShapeBY) { listener->panelChanged(EvWavOpac, M("HISTORY_CUSTOMCURVE")); } else if (ce == opacityShape) { @@ -2465,11 +2492,13 @@ void Wavelet::HSmethodUpdateUI() bllev->hide(); threshold->hide(); threshold2->hide(); + curveEditorC->hide(); } else { //with hllev->show(); bllev->show(); threshold->show(); threshold2->show(); + curveEditorC->show(); } } } @@ -2880,6 +2909,7 @@ void Wavelet::setBatchMode(bool batchMode) Dirmethod->append(M("GENERAL_UNCHANGED")); CCWcurveEditorG->setBatchMode(batchMode); opaCurveEditorG->setBatchMode(batchMode); + curveEditorC->setBatchMode(batchMode); opacityCurveEditorG->setBatchMode(batchMode); opacityCurveEditorW->setBatchMode(batchMode); opacityCurveEditorWL->setBatchMode(batchMode); diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index c9cd3dc4c..c6a0a6b85 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -101,6 +101,7 @@ private: rtengine::ProcEvent EvWavLabGridValue; rtengine::ProcEvent EvWavrangeab; rtengine::ProcEvent EvWavprotab; + rtengine::ProcEvent EvWavlevelshc; LabGrid *labgrid; @@ -164,6 +165,8 @@ private: void enableToggled(MyExpander* expander); CurveEditorGroup* const curveEditorG; + CurveEditorGroup* const curveEditorC; + FlatCurveEditor* opacityShapeSH; CurveEditorGroup* const CCWcurveEditorG; CurveEditorGroup* const curveEditorbl; From c27cd841e412b138b36d010afd5616a1681e5207 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 12 May 2020 09:20:59 +0200 Subject: [PATCH 106/109] Forgotten label Residual --- rtdata/languages/default | 1 + 1 file changed, 1 insertion(+) diff --git a/rtdata/languages/default b/rtdata/languages/default index 69b7449e3..30d86c097 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2321,6 +2321,7 @@ TP_WAVELET_SOFTRAD;Soft Radius TP_WAVELET_STREN;Strength TP_WAVELET_STRENGTH;Strength TP_WAVELET_SUPE;Extra +TP_WAVELET_THR;Shadows threshold TP_WAVELET_THRESHOLD;Finer levels TP_WAVELET_THRESHOLD2;Coarser levels //TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels between 9 and 9 minus the value will be affected by the shadow luminance range. Other levels will be fully treated. The highest level possible is limited by the highlight level value (9 minus highlight level value). From 65f1b4c3d9a976d90f41853b915f79bf98ac2864 Mon Sep 17 00:00:00 2001 From: Benitoite Date: Tue, 12 May 2020 05:17:53 -0700 Subject: [PATCH 107/109] Update macOS packaging for 10.15.4 Several smaller fixes to provide an improved handling of installing/using RT on macOS. * mac: update entitlements for 10.15.4 * mac: fix the CLI. Provides an un-codesigned rawtherapee-cli outside the app bundle for use on the terminal command line, using the app bundle's 3rd-party libraries. * How to install RawTherapee.app and rawtherapee-cli for macOS --- CMakeLists.txt | 9 ++++++++- tools/INSTALL.readme | 3 +++ tools/osx/macosx_bundle.sh | 36 +++++++++++++++++++++++------------- tools/osx/rt.entitlements | 31 ++++++++++++++----------------- 4 files changed, 48 insertions(+), 31 deletions(-) create mode 100644 tools/INSTALL.readme diff --git a/CMakeLists.txt b/CMakeLists.txt index cbddde251..7d66109e0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -669,7 +669,14 @@ if(WIN32) elseif(APPLE) set( ABOUT_COMMAND_WITH_ARGS - cmake -DPROJECT_SOURCE_DIR:STRING=${PROJECT_SOURCE_DIR} -P ${PROJECT_SOURCE_DIR}/UpdateInfo.cmake -DSYSTEM:STRING=Apple -DCXX_FLAGS:STRING=${CXX_FLAGS} -DLFLAGS:STRING=${LFLAGS} -DCOMPILER_INFO:STRING=${COMPILER_INFO} -DCACHE_NAME_SUFFIX:STRING=${CACHE_NAME_SUFFIX}) + cmake + -DPROJECT_SOURCE_DIR:STRING=${PROJECT_SOURCE_DIR} + -DCACHE_NAME_SUFFIX:STRING=${CACHE_NAME_SUFFIX} + -P ${PROJECT_SOURCE_DIR}/UpdateInfo.cmake + -DSYSTEM:STRING=Apple + -DCXX_FLAGS:STRING=${CXX_FLAGS} + -DLFLAGS:STRING=${LFLAGS} + -DCOMPILER_INFO:STRING=${COMPILER_INFO}) else() list(APPEND ABOUT_COMMAND_WITH_ARGS -DSYSTEM:STRING=Linux -DCXX_FLAGS:STRING=${CXX_FLAGS} -DLFLAGS:STRING=${LFLAGS} diff --git a/tools/INSTALL.readme b/tools/INSTALL.readme new file mode 100644 index 000000000..a4f19ec3c --- /dev/null +++ b/tools/INSTALL.readme @@ -0,0 +1,3 @@ +To install the RawTherapee application, open the .dmg and drag the RawTherapee app onto the /Applications folder. + +To use the optional rawtherapee-cli command line interface, move rawtherapee-cli into a folder in your $PATH and install the RawTherapee app as above. diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 9258810c0..bc1a2dc3b 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -236,6 +236,11 @@ ditto {"${LOCAL_PREFIX}/local","${RESOURCES}"}/share/icons/Adwaita/index.theme "${LOCAL_PREFIX}/local/bin/gtk-update-icon-cache" "${RESOURCES}/share/icons/Adwaita" ditto "${LOCAL_PREFIX}/local/share/icons/hicolor" "${RESOURCES}/share/icons/hicolor" +# fix libfreetype install name +for lib in "${LIB}"/*; do + install_name_tool -change libfreetype.6.dylib "${LIB}"/libfreetype.6.dylib "${lib}" +done + # pixbuf loaders & immodules msg "Build GTK3 databases:" "${LOCAL_PREFIX}"/local/bin/gdk-pixbuf-query-loaders "${LIB}"/libpix*.so > "${ETC}"/gtk-3.0/gdk-pixbuf.loaders @@ -259,11 +264,11 @@ ditto "${PROJECT_SOURCE_DIR}/rtdata/fonts" "${ETC}/fonts" ditto "${PROJECT_SOURCE_DATA_DIR}/"{rawtherapee,profile}.icns "${RESOURCES}" ditto "${PROJECT_SOURCE_DATA_DIR}/PkgInfo" "${CONTENTS}" install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/Info.plist.in" "${CONTENTS}/Info.plist" +install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/cliInfo.plist.in" "${LIB}/Info.plist" sed -i "" -e "s|@version@|${PROJECT_FULL_VERSION}| s|@shortVersion@|${PROJECT_VERSION}| s|@arch@|${arch}|" \ "${CONTENTS}/Info.plist" -plutil -convert binary1 "${CONTENTS}/Info.plist" update-mime-database -V "${RESOURCES}/share/mime" msg "Build glib database:" @@ -279,23 +284,25 @@ ModifyInstallNames # fix @rpath in Frameworks msg "Registering @rpath in Frameworks folder." -for frameworklibs in "${LIB}"/*{dylib,so}; do +for frameworklibs in "${LIB}"/*{dylib,so,cli}; do install_name_tool -delete_rpath ${LOCAL_PREFIX}/local/lib "${frameworklibs}" install_name_tool -add_rpath /Applications/"${LIB}" "${frameworklibs}" done install_name_tool -delete_rpath RawTherapee.app/Contents/Frameworks "${EXECUTABLE}"-cli -install_name_tool -add_rpath @executable_path "${EXECUTABLE}"-cli +install_name_tool -add_rpath /Applications/"${LIB}" "${EXECUTABLE}"-cli +ditto "${EXECUTABLE}"-cli "${APP}"/.. # Codesign the app if [[ -n $CODESIGNID ]]; then msg "Codesigning Application." - install -m 0644 "${PROJECT_SOURCE_DATA_DIR}"/rt.entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements - plutil -convert binary1 "${CMAKE_BUILD_TYPE}"/rt.entitlements + iconv -f UTF-8 -t ASCII "${PROJECT_SOURCE_DATA_DIR}"/rt.entitlements > "${CMAKE_BUILD_TYPE}"/rt.entitlements + iconv -f UTF-8 -t ASCII "${PROJECT_SOURCE_DATA_DIR}"/rt-cli.entitlements > "${CMAKE_BUILD_TYPE}"/rt-cli.entitlements mv "${EXECUTABLE}"-cli "${LIB}" - for frameworklibs in "${LIB}"/*; do - codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee --force --verbose -o runtime --timestamp "${frameworklibs}" + for frameworklibs in "${LIB}"/*{dylib,so}; do + codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee --force --verbose -o runtime --timestamp --entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements "${frameworklibs}" done - codesign --timestamp --strict -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements "${APP}" + codesign --force -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements "${CMAKE_BUILD_TYPE}"/rt-cli.entitlements "${LIB}"/rawtherapee-cli + codesign --deep --timestamp --strict -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements "${APP}" spctl -a -vvvv "${APP}" fi @@ -345,7 +352,7 @@ function CreateDmg { CreateWebloc 'Report Bug' 'https://github.com/Beep6581/RawTherapee/issues/new' # Disk image name - dmg_name="${PROJECT_NAME// /_}_OSX_${MINIMUM_SYSTEM_VERSION}_${PROC_BIT_DEPTH}_${PROJECT_FULL_VERSION}" + dmg_name="${PROJECT_NAME}_OSX_${MINIMUM_SYSTEM_VERSION}_${PROC_BIT_DEPTH}_${PROJECT_FULL_VERSION}" lower_build_type="$(tr '[:upper:]' '[:lower:]' <<< "$CMAKE_BUILD_TYPE")" if [[ $lower_build_type != release ]]; then dmg_name="${dmg_name}_${lower_build_type}" @@ -390,6 +397,7 @@ function CreateDmg { xcrun stapler staple "${dmg_name}.dmg" # staple the ticket xcrun stapler validate -v "${dmg_name}.dmg" echo "dmg Notarization success" + rm *dmg.zip break elif [[ $status1 = "in" ]]; then echo "dmg Notarization still in progress, sleeping for 15 seconds and trying again" @@ -404,10 +412,12 @@ function CreateDmg { # Zip disk image for redistribution msg "Zipping disk image for redistribution:" - zip "${dmg_name}.zip" "${dmg_name}.dmg" - rm "${dmg_name}.dmg" - msg "Removing disk image caches:" - rm -rf "${srcDir}" + mkdir "${PROJECT_NAME}_OSX_${MINIMUM_SYSTEM_VERSION}_${PROC_BIT_DEPTH}_${PROJECT_FULL_VERSION}_folder" + ditto {"${PROJECT_NAME}_OSX_${MINIMUM_SYSTEM_VERSION}_${PROC_BIT_DEPTH}_${PROJECT_FULL_VERSION}.dmg","rawtherapee-cli","${PROJECT_SOURCE_DATA_DIR}/INSTALL.readme.rtf"} "${PROJECT_NAME}_OSX_${MINIMUM_SYSTEM_VERSION}_${PROC_BIT_DEPTH}_${PROJECT_FULL_VERSION}_folder" + zip -r "${PROJECT_NAME}_OSX_${MINIMUM_SYSTEM_VERSION}_${PROC_BIT_DEPTH}_${PROJECT_FULL_VERSION}.zip" "${PROJECT_NAME}_OSX_${MINIMUM_SYSTEM_VERSION}_${PROC_BIT_DEPTH}_${PROJECT_FULL_VERSION}_folder/" + # rm "${dmg_name}.dmg" + # msg "Removing disk image caches:" + # rm -rf "${srcDir}" } CreateDmg msg "Finishing build:" diff --git a/tools/osx/rt.entitlements b/tools/osx/rt.entitlements index c571f1f41..8fc97c7da 100644 --- a/tools/osx/rt.entitlements +++ b/tools/osx/rt.entitlements @@ -1,19 +1,16 @@ + - - application-identifier - com.rawtherapee.RawTherapee - com.apple.security.temporary-exception.files.absolute-path.read-write - - / - - com.apple.security.cs.allow-dyld-environment-variables - - com.apple.security.files.user-selected.read-write - - com.apple.security.app-sandbox - - com.apple.security.files.downloads.read-write - - - \ No newline at end of file + + com.apple.application-identifier + com.rawtherapee.RawTherapee + com.apple.security.app-sandbox + + com.apple.security.cs.allow-dyld-environment-variables + + com.apple.security.temporary-exception.files.absolute-path.read-write + + / + + + From 99fd6162f840dd389618c944ec457905ceafe01a Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 12 May 2020 16:28:17 +0200 Subject: [PATCH 108/109] Clean code --- rtdata/languages/default | 2 -- rtengine/dcrop.cc | 1 - rtengine/improccoordinator.cc | 3 --- rtengine/improcfun.h | 19 ++++++++----------- rtengine/ipwavelet.cc | 23 +++-------------------- rtengine/procparams.cc | 21 ++++++++++++--------- rtengine/simpleprocess.cc | 3 --- 7 files changed, 23 insertions(+), 49 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 30d86c097..f28fcbdc2 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2324,8 +2324,6 @@ TP_WAVELET_SUPE;Extra TP_WAVELET_THR;Shadows threshold TP_WAVELET_THRESHOLD;Finer levels TP_WAVELET_THRESHOLD2;Coarser levels -//TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels between 9 and 9 minus the value will be affected by the shadow luminance range. Other levels will be fully treated. The highest level possible is limited by the highlight level value (9 minus highlight level value). -//TP_WAVELET_THRESHOLD_TOOLTIP;Only levels beyond the chosen value will be affected by the highlight luminance range. Other levels will be fully treated. The chosen value here limits the highest possible value of the shadow levels. TP_WAVELET_THRESHOLD_TOOLTIP;Only levels beyond the chosen value will be affected by the highlight luminance range. Other levels will be fully treated. The chosen value here limits the highest possible value of the shadow levels. : All levels from level 1 up to the chosen value will only be affected within the Finer levels luminance range.\nAll other levels will have the whole range of luminances affected, unless the Coarser levels setting limits it.\nThe chosen value in this slider becomes the minimum possible value of the Coarser levels. TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels between 9 and 9 minus the value will be affected by the shadow luminance range. Other levels will be fully treated. The highest level possible is limited by the highlight level value (9 minus highlight level value). : Only levels between the chosen value and level 9/Extra will be affected by the Coarser levels luminance range.\nAll other levels will have the whole range of luminances affected, unless the Finer levels setting limits it.\nThe lower level possible that will be considered by the algorithm is limited by the Finer levels value. TP_WAVELET_THRESWAV;Balance Threshold diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index f58f2e4c9..8bf27b53d 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -1017,7 +1017,6 @@ void Crop::update(int todo) WaveParams.expnoise = false; } - // parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index f7f8756d2..5261675a0 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -891,7 +891,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if ((params->wavelet.enabled)) { WaveletParams WaveParams = params->wavelet; -// WaveParams.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); WaveParams.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); int kall = 0; LabImage *unshar = nullptr; @@ -922,7 +921,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) provis = params->wavelet.CLmethod; params->wavelet.CLmethod = "all"; ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); -// ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); unshar->CopyFrom(nprevl); @@ -936,7 +934,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) WaveParams.expnoise = false; } -// ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index f4a452dcc..b7d7c41e5 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -202,28 +202,25 @@ public: int pitch, int scale, const int luma, const int chroma/*, LUTf & Lcurve, LUTf & abcurve*/); void Tile_calc(int tilesize, int overlap, int kall, int imwidth, int imheight, int &numtiles_W, int &numtiles_H, int &tilewidth, int &tileheight, int &tileWskip, int &tileHskip); -// void ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip); void ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveSH & waOpacityCurveSH, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip); void WaveletcontAllL(LabImage * lab, float **varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_L, const Wavblcurve & wavblcurve, -// struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili); - struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveSH & waOpacityCurveSH, FlatCurve* ChCurve, bool Chutili); + struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveSH & waOpacityCurveSH, FlatCurve* ChCurve, bool Chutili); void WaveletcontAllLfinal(const wavelet_decomposition &WaveletCoeffs_L, const cont_params &cp, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL); void WaveletcontAllAB(LabImage * lab, float **varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_a, const Wavblcurve & wavblcurve, const WavOpacityCurveW & waOpacityCurveW, - struct cont_params &cp, const bool useChannelA, int skip, float *meanab, float *sigmaab); + struct cont_params &cp, const bool useChannelA, int skip, float *meanab, float *sigmaab); void WaveletAandBAllAB(const wavelet_decomposition &WaveletCoeffs_a, const wavelet_decomposition &WaveletCoeffs_b, - const cont_params &cp, FlatCurve* hhcurve, bool hhutili); + const cont_params &cp, FlatCurve* hhcurve, bool hhutili); void ContAllL(float **koeLi, float *maxkoeLi, bool lipschitz, int maxlvl, LabImage * lab, float **varhue, float **varchrom, float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp, - // int W_L, int H_L, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili); - int W_L, int H_L, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveSH & waOpacityCurveSH, FlatCurve* ChCurve, bool Chutili); + int W_L, int H_L, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveSH & waOpacityCurveSH, FlatCurve* ChCurve, bool Chutili); void finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, const cont_params &cp, - int W_L, int H_L, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL); + int W_L, int H_L, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL); void ContAllAB(LabImage * lab, int maxlvl, float **varhue, float **varchrom, float ** WavCoeffs_a, float * WavCoeffs_a0, int level, int dir, const WavOpacityCurveW & waOpacityCurveW, struct cont_params &cp, - int W_ab, int H_ab, const bool useChannelA, float *meanab, float *sigmaab); + int W_ab, int H_ab, const bool useChannelA, float *meanab, float *sigmaab); void Evaluate2(const wavelet_decomposition &WaveletCoeffs_L, - float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN); + float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN); void Eval2(float ** WavCoeffs_L, int level, - int W_L, int H_L, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN); + int W_L, int H_L, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN); void calceffect(int level, float *mean, float *sigma, float *mea, float effect, float offs); diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 373ea6ef0..0fc947aea 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -164,7 +164,6 @@ struct cont_params { int wavNestedLevels = 1; -//void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip) void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveSH & waOpacityCurveSH, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip) @@ -470,9 +469,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.t_lsl = static_cast(params->wavelet.bllev.getTopLeft()); cp.b_rsl = static_cast(params->wavelet.bllev.getBottomRight()); cp.t_rsl = static_cast(params->wavelet.bllev.getTopRight()); -// cp.numlevS = params->wavelet.threshold2; -// int maxlevS = 9 - cp.numlevH; -// cp.numlevS = rtengine::min(cp.numlevS, maxlevS); cp.numlevS = 9 - params->wavelet.threshold2; int maxlevS = cp.numlevH; cp.numlevS = rtengine::max(cp.numlevS, maxlevS); @@ -1027,7 +1023,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const Chutili = true; } -// WaveletcontAllL(labco, varhue, varchro, *Ldecomp, wavblcurve, cp, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); WaveletcontAllL(labco, varhue, varchro, *Ldecomp, wavblcurve, cp, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, waOpacityCurveSH, ChCurve, Chutili); if (cp.val > 0 || ref || contr || cp.diagcurv) { //edge @@ -1297,7 +1292,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr adecomp(new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwava, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!adecomp->memoryAllocationFailed) { -// if (cp.noiseena && (cp.chromfi > 0.f || cp.chromco > 0.f)) { if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.chromco < 2.f )) { WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); } else if (cp.chromfi > 0.f && cp.chromco >= 2.f){ @@ -1335,7 +1329,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!bdecomp->memoryAllocationFailed) { -// if (cp.noiseena && (cp.chromfi > 0.f || cp.chromco > 0.f)) { if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.chromco < 2.f )) { WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); } else if (cp.chromfi > 0.f && cp.chromco >= 2.f){ @@ -1368,7 +1361,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!adecomp->memoryAllocationFailed && !bdecomp->memoryAllocationFailed) { -// if (cp.noiseena && (cp.chromfi > 0.f || cp.chromco > 0.f)) { if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.chromco < 2.f)) { WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); } else if (cp.chromfi > 0.f && cp.chromco >= 2.f){ @@ -1385,15 +1377,8 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); } -// WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); -// WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); Evaluate2(*bdecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); -/* - if (cp.noiseena && (cp.chromfi > 0.f || cp.chromco > 0.f)) { - WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip, meanab, sigmaab); - WaveletAandBAllAB(*adecomp, *bdecomp, cp, hhCurve, hhutili); - } - */ + WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip, meanab, sigmaab); WaveletAandBAllAB(*adecomp, *bdecomp, cp, hhCurve, hhutili); @@ -2047,8 +2032,7 @@ void ImProcFunctions::WaveletcontAllLfinal(const wavelet_decomposition &WaveletC void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_L, const Wavblcurve & wavblcurve, -// struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili) - struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveSH & waOpacityCurveSH, FlatCurve* ChCurve, bool Chutili) + struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveSH & waOpacityCurveSH, FlatCurve* ChCurve, bool Chutili) { const int maxlvl = WaveletCoeffs_L.maxlevel(); const int W_L = WaveletCoeffs_L.level_W(0); @@ -2606,7 +2590,7 @@ void ImProcFunctions::WaveletAandBAllAB(const wavelet_decomposition &WaveletCoef } void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_ab, const Wavblcurve & wavblcurve, const WavOpacityCurveW & waOpacityCurveW, - struct cont_params &cp, const bool useChannelA, int skip, float *meanab, float *sigmaab) + struct cont_params &cp, const bool useChannelA, int skip, float *meanab, float *sigmaab) { int maxlvl = WaveletCoeffs_ab.maxlevel(); @@ -3133,7 +3117,6 @@ void ImProcFunctions::finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, } void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz, int maxlvl, LabImage * labco, float ** varhue, float **varchrom, float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp, -// int W_L, int H_L, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili) int W_L, int H_L, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveSH & waOpacityCurveSH, FlatCurve* ChCurve, bool Chutili) { assert(level >= 0); diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 4df201503..0829ddbb0 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2170,15 +2170,18 @@ WaveletParams::WaveletParams() : }, blcurve{ static_cast(FCT_MinMaxCPoints), -0.0, 0.0, 0.0, 0.35, 0.5, 0., 0.35, 0.35, 1.0, 0.0, 0.35, 0.35 -/* 0.0, - 0.75, - 0.35, - 0.35, - 1.0, - 0.75, - 0.35, - 0.35*/ + 0.0, + 0.0, + 0.0, + 0.35, + 0.5, + 0., + 0.35, + 0.35, + 1.0, + 0.0, + 0.35, + 0.35 }, opacityCurveRG{ static_cast(FCT_MinMaxCPoints), diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 92a3d7f29..a53902737 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1150,7 +1150,6 @@ private: provradius->CopyFrom(labView); } -// params.wavelet.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); params.wavelet.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); CurveFactory::curveWavContL(wavcontlutili, params.wavelet.wavclCurve, wavclCurve,/* hist16C, dummy,*/ 1); @@ -1159,7 +1158,6 @@ private: unshar = new LabImage(fw, fh); provis = params.wavelet.CLmethod; params.wavelet.CLmethod = "all"; -// ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); unshar->CopyFrom(labView); params.wavelet.CLmethod = provis; @@ -1172,7 +1170,6 @@ private: WaveParams.expnoise = false; } -// ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { From 5db57952ed0d445027196d8a64ffcd23fc2d6170 Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 13 May 2020 14:27:08 +0200 Subject: [PATCH 109/109] Change label wavelet levels --- rtdata/languages/default | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index f28fcbdc2..f10f98c6e 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2257,7 +2257,7 @@ TP_WAVELET_LEVCH;Chroma TP_WAVELET_LEVDIR_ALL;All levels, in all directions TP_WAVELET_LEVDIR_INF;Finer details levels, with selected level TP_WAVELET_LEVDIR_ONE;One level -TP_WAVELET_LEVDIR_SUP;Above the level +TP_WAVELET_LEVDIR_SUP;Coarser details levels, without selected level TP_WAVELET_LEVELS;Wavelet levels TP_WAVELET_LEVELS_TOOLTIP;Choose the number of detail levels the image is to be decomposed into. More levels require more RAM and require a longer processing time. TP_WAVELET_LEVF;Contrast

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 literal 0 HcmV?d00001 diff --git a/rtdata/dcpprofiles/NIKON D610.dcp b/rtdata/dcpprofiles/NIKON D610.dcp new file mode 100644 index 0000000000000000000000000000000000000000..a5a05ca34feb3ac6947d7572c59fc7da8f5bb2d6 GIT binary patch literal 65350 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