From e82c79bd8aa0cf66b3d709ce5cfa8a5e676834ce Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 10 Sep 2015 07:11:17 +0200 Subject: [PATCH] Add linear mode to HSL --- rtdata/languages/default | 3 ++- rtengine/ipdehaz.cc | 13 +++++++------ rtengine/rawimagesource.cc | 11 +++++++---- rtgui/dehaz.cc | 6 +++++- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index ee94c17ed..d0c974fe4 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1560,7 +1560,8 @@ TP_DEHAZ_MLABEL_TOOLTIP;Should be near of min=0 max=32768\nRestored image with n TP_DEHAZ_TLABEL;TR m=%1 M=%2 Me=%3 Si=%4 Tm=%5 TM=%6 TP_DEHAZ_TLABEL_TOOLTIP;Transmission map result\nm=Mini M=Maxi used by Variance\nMe=Mean Si=Sigma\nTm=Min TM=Max of Transmission map TP_DEHAZ_LABSPACE;L*a*b* -TP_DEHAZ_HSLSPACE;HSL +TP_DEHAZ_HSLSPACE;HSL-Log +TP_DEHAZ_HSLSPACELIN;HSL-Lin TP_DEHAZ_STR;Strength TP_DEHAZ_STR_TOOLTIP;Mixture in proportion to the original image and that obtained by Retinex algoritm TP_DEHAZ_RETIN;Complete Retinex algoritm diff --git a/rtengine/ipdehaz.cc b/rtengine/ipdehaz.cc index aa01b2443..5c0365252 100644 --- a/rtengine/ipdehaz.cc +++ b/rtengine/ipdehaz.cc @@ -207,8 +207,9 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, int width float delta; float eps = 2.f; bool useHsl = deh.dehazcolorspace == "HSL"; + bool useHslLin = deh.dehazcolorspace == "HSLLIN"; float gain2 = (float) deh.gain / 100.f; //def =1 not use - // gain2 = useHsl ? gain2 * 0.5f : gain2; + gain2 = useHslLin ? gain2 * 0.5f : gain2; float offse = (float) deh.offs; //def = 0 not use int scal = deh.scal; //def=3 int nei = (int) 2.8f * deh.neigh; //def = 220 @@ -216,7 +217,7 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, int width float strength = (float) deh.str / 100.f; // Blend with original L channel data float limD = (float) deh.limd; limD = pow(limD, 1.7f);//about 2500 enough - // limD *= useHsl ? 10.f : 1.f; + limD *= useHslLin ? 10.f : 1.f; float ilimD = 1.f / limD; int modedehaz = 0; // default to 0 ( deh.dehazmet == "uni" ) bool execcur = false; @@ -283,9 +284,9 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, int width for (int i = 0; i < H_L; i++) { int j = 0; #ifdef __SSE2__ - if(useHsl) { + if(useHslLin) { for (; j < W_L - 3; j += 4) { - _mm_storeu_ps(&luminance[i][j], LVFU(luminance[i][j]) + pondv * xlogf(LIMV(LVFU(src[i][j]) / LVFU(out[i][j]), limMinv, limMaxv) )); + _mm_storeu_ps(&luminance[i][j], LVFU(luminance[i][j]) + pondv * (LIMV(LVFU(src[i][j]) / LVFU(out[i][j]), limMinv, limMaxv) )); } } else { for (; j < W_L - 3; j += 4) { @@ -293,9 +294,9 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, int width } } #endif - if(useHsl) { + if(useHslLin) { for (; j < W_L; j++) { - luminance[i][j] += pond * xlogf(LIM(src[i][j] / out[i][j], ilimD, limD)); + luminance[i][j] += pond * (LIM(src[i][j] / out[i][j], ilimD, limD)); } } else { for (; j < W_L; j++) { diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 3f9d415c2..06214469d 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1841,13 +1841,15 @@ void RawImageSource::dehaz(RAWParams raw, ColorManagementParams cmp, DehazParams } bool useHsl = deh.dehazcolorspace == "HSL"; - if(useHsl) { + bool useHslLin = deh.dehazcolorspace == "HSLLIN"; + if(useHsl || useHslLin) { for (int i = border; i < H - border; i++ ) for (int j = border; j < W - border; j++) { float H,S,L; //rgb=>lab Color::rgb2hsl(red[i][j], green[i][j], blue[i][j],H,S,L); - L *= 65535.f; + // L *= 65535.f; + L *= 32768.f; labTmp[i - border][j - border] = L; if(dehaHcontlutili) { @@ -1889,12 +1891,13 @@ void RawImageSource::dehaz(RAWParams raw, ColorManagementParams cmp, DehazParams delete [] labTmpBuffer; - if(useHsl) { + if(useHsl || useHslLin) { for (int i = border; i < H - border; i++ ) { int j = border; for (; j < W - border; j++) { float R, G, B; - Color::hsl2rgb(labdeha->a[i - border][j - border],labdeha->b[i - border][j - border],labdeha->L[i - border][j - border]/65535.f,R,G,B); + // Color::hsl2rgb(labdeha->a[i - border][j - border],labdeha->b[i - border][j - border],labdeha->L[i - border][j - border]/65535.f,R,G,B); + Color::hsl2rgb(labdeha->a[i - border][j - border],labdeha->b[i - border][j - border],labdeha->L[i - border][j - border]/32768.f,R,G,B); red[i][j] = R; green[i][j] = G; blue[i][j] = B; diff --git a/rtgui/dehaz.cc b/rtgui/dehaz.cc index 01c11b178..3c3761e83 100644 --- a/rtgui/dehaz.cc +++ b/rtgui/dehaz.cc @@ -48,6 +48,7 @@ Dehaz::Dehaz () : FoldableToolPanel(this, "dehaz", M("TP_DEHAZ_LABEL"), false, t dehazcolorspace = Gtk::manage (new MyComboBoxText ()); dehazcolorspace->append_text (M("TP_DEHAZ_LABSPACE")); dehazcolorspace->append_text (M("TP_DEHAZ_HSLSPACE")); + dehazcolorspace->append_text (M("TP_DEHAZ_HSLSPACELIN")); dehazcolorspace->set_active(0); dehazmetConn = dehazcolorspace->signal_changed().connect ( sigc::mem_fun(*this, &Dehaz::dehazColorSpaceChanged) ); dehazcolorspace->set_tooltip_markup (M("TP_DEHAZ_COLORSPACE_TOOLTIP")); @@ -373,8 +374,9 @@ void Dehaz::read (const ProcParams* pp, const ParamsEdited* pedited) dehazcolorspace->set_active (0); } else if (pp->dehaz.dehazcolorspace == "HSL") { dehazcolorspace->set_active (1); + } else if (pp->dehaz.dehazcolorspace == "HSLLIN") { + dehazcolorspace->set_active (2); } - retinexConn.block(false); retinexChanged (); retinexConn.block(false); @@ -479,6 +481,8 @@ void Dehaz::write (ProcParams* pp, ParamsEdited* pedited) pp->dehaz.dehazcolorspace = "Lab"; } else if (dehazcolorspace->get_active_row_number() == 1) { pp->dehaz.dehazcolorspace = "HSL"; + } else if (dehazcolorspace->get_active_row_number() == 2) { + pp->dehaz.dehazcolorspace = "HSLLIN"; } }