diff --git a/rtdata/languages/default b/rtdata/languages/default index 8bf439f58..3666e9cb9 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1596,6 +1596,8 @@ TP_RETINEX_METHOD_TOOLTIP;Low: Reinforce low light,\nUniform: Equalize action,\n TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2 TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture. TP_RETINEX_NEIGHBOR;Neighboring pixels +TP_RETINEX_NEUTRAL;Reset +TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to default TP_RETINEX_NONE;None TP_RETINEX_OFFSET;Offset TP_RETINEX_SCALES;Scales @@ -1604,8 +1606,9 @@ TP_RETINEX_SETTINGS;Settings TP_RETINEX_STRENGTH;Strength TP_RETINEX_THRESHOLD;Threshold TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out - in = image source - out = image Gauss -TP_RETINEX_TLABEL;TR m=%1 M=%2 Me=%3 Si=%4 Tm=%5 TM=%6 -TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nm=Mini M=Maxi used by Variance.\nMe=Mean Si=Sigma\nTm=Min TM=Max of transmission map. +TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 +TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 +TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map. TP_RETINEX_TRANSMISSION;Transmission map TP_RETINEX_TRANSMISSION_TOOLTIP;Modify transmission in function of transmission\nAbscissa : transmission from negatives values (min), mean, and positives values (max)\nOrdonate : amplification - reduction TP_RETINEX_UNIFORM;Uniform diff --git a/rtengine/color.cc b/rtengine/color.cc index 03a9bda93..13bad89db 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -1316,35 +1316,35 @@ void Color::calcGamma (double pwr, double ts, int mode, int imax, double &gamma0 { //from Dcraw (D.Coffin) int i; - double g[6], bnd[2] = {0, 0}; + double g[6], bnd[2] = {0., 0.}; g[0] = pwr; g[1] = ts; - g[2] = g[3] = g[4] = 0; - bnd[g[1] >= 1] = 1; + g[2] = g[3] = g[4] = 0.; + bnd[g[1] >= 1.] = 1.; - if (g[1] && (g[1] - 1) * (g[0] - 1) <= 0) { + if (g[1] && (g[1] - 1.) * (g[0] - 1.) <= 0.) { for (i = 0; i < 48; i++) { - g[2] = (bnd[0] + bnd[1]) / 2; + g[2] = (bnd[0] + bnd[1]) / 2.; if (g[0]) { - bnd[(pow(g[2] / g[1], -g[0]) - 1) / g[0] - 1 / g[2] > -1] = g[2]; + bnd[(pow(g[2] / g[1], -g[0]) - 1.) / g[0] - 1. / g[2] > -1.] = g[2]; } else { - bnd[g[2] / exp(1 - 1 / g[2]) < g[1]] = g[2]; + bnd[g[2] / exp(1. - 1. / g[2]) < g[1]] = g[2]; } } g[3] = g[2] / g[1]; if (g[0]) { - g[4] = g[2] * (1 / g[0] - 1); + g[4] = g[2] * (1. / g[0] - 1.); } } if (g[0]) { - g[5] = 1 / (g[1] * SQR(g[3]) / 2 - g[4] * (1 - g[3]) + (1 - pow(g[3], 1 + g[0])) * (1 + g[4]) / (1 + g[0])) - 1; + g[5] = 1. / (g[1] * SQR(g[3]) / 2. - g[4] * (1. - g[3]) + (1. - pow(g[3], 1. + g[0])) * (1. + g[4]) / (1. + g[0])) - 1.; } else { - g[5] = 1 / (g[1] * SQR(g[3]) / 2 + 1 - g[2] - g[3] - g[2] * g[3] * (log(g[3]) - 1)) - 1; + g[5] = 1. / (g[1] * SQR(g[3]) / 2. + 1. - g[2] - g[3] - g[2] * g[3] * (log(g[3]) - 1.)) - 1.; } if (!mode--) { diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index aa89ef639..bfaf7fdb4 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -218,6 +218,7 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e gain2 = useHslLin ? gain2 * 0.5f : gain2; float offse = (float) deh.offs; //def = 0 not use int scal = deh.scal; //def=3 + scal = 3;//disabled scal int nei = (int) 2.8f * deh.neigh; //def = 220 float vart = (float)deh.vart / 100.f;//variance float strength = (float) deh.str / 100.f; // Blend with original L channel data @@ -232,7 +233,7 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e float hl = deh.baselog; if(hl >= 2.71828f) elogt = 2.71828f + SQR(SQR(hl - 2.71828f)); else elogt = hl; - // printf("elo=%f\n",elogt); + elogt = 2.71828f;//disabled baselog FlatCurve* shcurve = NULL;//curve L=f(H) bool lhutili = false; @@ -458,7 +459,7 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e } delta = maxi - mini; - printf("maxi=%f mini=%f mean=%f std=%f delta=%f maxtr=%f mintr=%f\n", maxi, mini, mean, stddv, delta, maxtr, mintr); + // printf("maxi=%f mini=%f mean=%f std=%f delta=%f maxtr=%f mintr=%f\n", maxi, mini, mean, stddv, delta, maxtr, mintr); if ( !delta ) { delta = 1.0f; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index cda6e003e..9c47bfdc7 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -147,7 +147,7 @@ void RetinexParams::setDefaults() neigh = 80; gain = 50; offs = 0; - vart = 125; + vart = 200; limd = 8; highl = 10; baselog = 2.71828; diff --git a/rtgui/retinex.cc b/rtgui/retinex.cc index 04b7aebd6..6a3d6a9d7 100644 --- a/rtgui/retinex.cc +++ b/rtgui/retinex.cc @@ -119,6 +119,8 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"), neigh = Gtk::manage (new Adjuster (M("TP_RETINEX_NEIGHBOR"), 6, 100., 1., 80.)); highl = Gtk::manage (new Adjuster (M("TP_RETINEX_HIGHLIGHT"), 1, 100, 1, 10)); highl->set_tooltip_markup (M("TP_RETINEX_HIGHLIGHT_TOOLTIP")); + vart = Gtk::manage (new Adjuster (M("TP_RETINEX_VARIANCE"), 50, 500, 1, 200)); + vart->set_tooltip_markup (M("TP_RETINEX_VARIANCE_TOOLTIP")); expsettings = new MyExpander (false, M("TP_RETINEX_SETTINGS")); expsettings->signal_button_release_event().connect_notify( sigc::bind( sigc::mem_fun(this, &Retinex::foldAllButMe), expsettings) ); @@ -129,6 +131,9 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"), retinexVBox->pack_start (*neigh); neigh->show (); + retinexVBox->pack_start (*vart); + vart->show (); + retinexVBox->pack_start (*highl); highl->show (); @@ -137,17 +142,18 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"), transLabels = Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER)); transLabels->set_tooltip_markup (M("TP_RETINEX_TLABEL_TOOLTIP")); + transLabels2 = Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER)); scal = Gtk::manage (new Adjuster (M("TP_RETINEX_SCALES"), 1, 8., 1., 3.)); gain = Gtk::manage (new Adjuster (M("TP_RETINEX_GAIN"), 20, 200, 1, 50)); offs = Gtk::manage (new Adjuster (M("TP_RETINEX_OFFSET"), -10000, 10000, 1, 0)); - vart = Gtk::manage (new Adjuster (M("TP_RETINEX_VARIANCE"), 50, 500, 1, 125)); +// vart = Gtk::manage (new Adjuster (M("TP_RETINEX_VARIANCE"), 50, 500, 1, 125)); limd = Gtk::manage (new Adjuster (M("TP_RETINEX_THRESHOLD"), 2, 100, 1, 8)); baselog = Gtk::manage (new Adjuster (M("TP_RETINEX_BASELOG"), 1.1, 100., 0.001, 2.718)); // grbl = Gtk::manage (new Adjuster (M("TP_RETINEX_HIGHLIGHT3"), 1, 100, 1, 50)); gain->set_tooltip_markup (M("TP_RETINEX_GAIN_TOOLTIP")); scal->set_tooltip_markup (M("TP_RETINEX_SCALES_TOOLTIP")); - vart->set_tooltip_markup (M("TP_RETINEX_VARIANCE_TOOLTIP")); +// vart->set_tooltip_markup (M("TP_RETINEX_VARIANCE_TOOLTIP")); limd->set_tooltip_markup (M("TP_RETINEX_THRESHOLD_TOOLTIP")); baselog->set_tooltip_markup (M("TP_RETINEX_BASELOG_TOOLTIP")); @@ -157,7 +163,6 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"), lhshape = static_cast(curveEditorGH->addCurve(CT_Flat, M("TP_RETINEX_CURVEEDITOR_LH"))); lhshape->setTooltip(M("TP_RETINEX_CURVEEDITOR_LH_TOOLTIP")); lhshape->setCurveColorProvider(this, 4); - // lhshape->setEditID(EUID_Lab_LHCurve, BT_SINGLEPLANE_FLOAT); milestones.clear(); @@ -182,6 +187,9 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"), settingsVBox->pack_start (*transLabels); transLabels->show (); + settingsVBox->pack_start (*transLabels2); + transLabels2->show (); + settingsVBox->pack_start (*curveEditorGD, Gtk::PACK_SHRINK, 4); curveEditorGD->show(); @@ -203,8 +211,8 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"), slope->show (); - settingsVBox->pack_start (*scal); - scal->show (); +// settingsVBox->pack_start (*scal); +// scal->show (); settingsVBox->pack_start (*gain); gain->show (); @@ -212,8 +220,8 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"), settingsVBox->pack_start (*offs); offs->show (); - settingsVBox->pack_start (*vart); - vart->show (); +// settingsVBox->pack_start (*vart); +// vart->show (); settingsVBox->pack_start (*limd); limd->show (); @@ -221,8 +229,8 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"), // settingsVBox->pack_start (*highl); // highl->show (); - settingsVBox->pack_start (*baselog); - baselog->show (); +// settingsVBox->pack_start (*baselog); +// baselog->show (); // settingsVBox->pack_start (*grbl); // grbl->show (); @@ -232,9 +240,21 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"), settingsVBox->pack_start (*medianmap); medianmap->show (); - expsettings->add(*settingsVBox); + neutrHBox = Gtk::manage (new Gtk::HBox ()); + neutrHBox->set_border_width (2); + + neutral = Gtk::manage (new Gtk::Button (M("TP_RETINEX_NEUTRAL"))); + RTImage *resetImg = Gtk::manage (new RTImage ("gtk-undo-ltr-small.png", "gtk-undo-rtl-small.png")); + neutral->set_image(*resetImg); + neutral->set_tooltip_text (M("TP_RETINEX_NEUTRAL_TIP")); + neutralconn = neutral->signal_pressed().connect( sigc::mem_fun(*this, &Retinex::neutral_pressed) ); + neutral->show(); + neutrHBox->pack_start (*neutral); + + + str->setAdjusterListener (this); if (str->delay < 200) { @@ -309,6 +329,7 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"), */ pack_start (*retinexVBox); pack_start (*expsettings); + pack_start (*neutrHBox); disableListener(); retinexColorSpaceChanged(); @@ -326,6 +347,24 @@ Retinex::~Retinex() delete curveEditorGH; } +void Retinex::neutral_pressed () +{ + neigh->resetValue(false); + gain->resetValue(false); + offs->resetValue(false); + str->resetValue(false); + scal->resetValue(false); + vart->resetValue(false); + limd->resetValue(false); + highl->resetValue(false); + baselog->resetValue(false); + gam->resetValue(false); + slope->resetValue(false); + transmissionShape->reset(); + cdshape->reset(); + cdshapeH->reset(); + lhshape->reset(); +} void Retinex::foldAllButMe (GdkEventButton* event, MyExpander *expander) { @@ -413,10 +452,15 @@ void Retinex::updateTrans () Glib::ustring::format(std::fixed, std::setprecision(1), nm), Glib::ustring::format(std::fixed, std::setprecision(1), nM), Glib::ustring::format(std::fixed, std::setprecision(1), nZ), - Glib::ustring::format(std::fixed, std::setprecision(1), nS), + Glib::ustring::format(std::fixed, std::setprecision(1), nS)) + ); + transLabels2->set_text( + Glib::ustring::compose(M("TP_RETINEX_TLABEL2"), Glib::ustring::format(std::fixed, std::setprecision(1), nA), Glib::ustring::format(std::fixed, std::setprecision(1), nB)) ); + + } } } diff --git a/rtgui/retinex.h b/rtgui/retinex.h index 1a56fb170..09912341e 100644 --- a/rtgui/retinex.h +++ b/rtgui/retinex.h @@ -40,6 +40,8 @@ protected: Gtk::HBox* dhbox; Gtk::Label* labgam; Gtk::HBox* gambox; + Gtk::Button* neutral; + Gtk::HBox* neutrHBox; MyComboBoxText* retinexMethod; MyComboBoxText* retinexcolorspace; @@ -56,11 +58,12 @@ protected: Gtk::Label* mMLabels; Gtk::Label* transLabels; + Gtk::Label* transLabels2; DiagonalCurveEditor* cdshape; DiagonalCurveEditor* cdshapeH; CurveEditorGroup* transmissionCurveEditorG; - sigc::connection retinexMethodConn; + sigc::connection retinexMethodConn, neutralconn; sigc::connection retinexColorSpaceConn; sigc::connection gammaretinexConn; FlatCurveEditor* transmissionShape; @@ -84,6 +87,7 @@ public: bool minmaxComputed_ (); void updateLabel (); void updateTrans (); + void neutral_pressed (); void enabledChanged (); void curveChanged (CurveEditor* ce);