diff --git a/rtdata/languages/default b/rtdata/languages/default index c3b29f8f1..b3df9c5c8 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -642,6 +642,8 @@ HISTORY_MSG_409;Dehaze gain HISTORY_MSG_410;Dehaze offset HISTORY_MSG_411;Dehaze strength HISTORY_MSG_412;Dehaze scales +HISTORY_MSG_413;Dehaze var +HISTORY_MSG_414;Dehaze histogram HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOTS;Snapshots @@ -1511,6 +1513,7 @@ TP_LABCURVE_BRIGHTNESS;Lightness TP_LABCURVE_CHROMATICITY;Chromaticity TP_LABCURVE_CHROMA_TOOLTIP;To apply B&W toning, set Chromaticity to -100. TP_LABCURVE_CONTRAST;Contrast +TP_LABCURVE_CONTEDIT;Histogram equalizer TP_LABCURVE_CURVEEDITOR;Luminance Curve TP_LABCURVE_CURVEEDITOR_A_RANGE1;Green Saturated TP_LABCURVE_CURVEEDITOR_A_RANGE2;Green Pastel @@ -1526,6 +1529,8 @@ TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Dull TP_LABCURVE_CURVEEDITOR_CC_RANGE3;Pastel TP_LABCURVE_CURVEEDITOR_CC_RANGE4;Saturated TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;Chromaticity according to chromaticity C=f(C) +TP_LABCURVE_CURVEEDITOR_CD;CL +TP_LABCURVE_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L) TP_LABCURVE_CURVEEDITOR_CH;CH TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;Chromaticity according to hue C=f(H) TP_LABCURVE_CURVEEDITOR_CL;CL @@ -1549,6 +1554,7 @@ TP_LABCURVE_GAIN;Gain TP_LABCURVE_OFFS;Offset TP_DEHAZE_LAB;Dehaze TP_DEHAZE_LAB_TOOLTIP;Use Retinex algorithm (Lab) to improve dehaze..defog... +TP_LABCURVE_VART;Variance TP_DEHAZE_MET;Dehaze method TP_DEHAZ_NONE;None TP_DEHAZ_UNI;Uniform diff --git a/rtengine/curves.cc b/rtengine/curves.cc index 4e94be1b8..9997b38d8 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -502,6 +502,40 @@ void CurveFactory::curveCL ( bool & clcutili, const std::vector& clcurve dCurve = NULL; } } + +void CurveFactory::curveDehaContL ( bool & dehacontlutili, const std::vector& dehaclcurvePoints, LUTf & dehaclCurve, int skip) +{ + bool needed; + DiagonalCurve* dCurve = NULL; + + bool histNeededCL = false; + + needed = false; + + if (!dehaclcurvePoints.empty() && dehaclcurvePoints[0] != 0) { + dCurve = new DiagonalCurve (dehaclcurvePoints, CURVES_MIN_POLY_POINTS / skip); + + if (dCurve && !dCurve->isIdentity()) { + needed = true; + dehacontlutili = true; + } + } + + for (int i = 0; i < 32768; i++) { //32768*1.414 + ... + int hi = (int)(255.0 * CLIPD((float)i / 32767.0)); // + } + + + fillCurveArray(dCurve, dehaclCurve, skip, needed); + + if (dCurve) { + delete dCurve; + dCurve = NULL; + } +} + + + // add curve Lab wavelet : Cont=f(L) void CurveFactory::curveWavContL ( bool & wavcontlutili, const std::vector& wavclcurvePoints, LUTf & wavclCurve, /*LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,*/int skip) { diff --git a/rtengine/curves.h b/rtengine/curves.h index f43542dba..22f0d77fa 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -282,6 +282,7 @@ public: static void curveCL ( bool & clcutili, const std::vector& clcurvePoints, LUTf & clCurve, LUTu & histogramcl, LUTu & outBeforeCLurveHistogram, int skip); static void curveWavContL ( bool & wavcontlutili, const std::vector& wavclcurvePoints, LUTf & wavclCurve,/* LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,*/int skip); + static void curveDehaContL ( bool & dehacontlutili, const std::vector& dehaclcurvePoints, LUTf & dehaclCurve, int skip); static void curveToningCL ( bool & clctoningutili, const std::vector& clcurvePoints, LUTf & clToningCurve, int skip); static void curveToningLL ( bool & llctoningutili, const std::vector& llcurvePoints, LUTf & llToningCurve, int skip); diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 4399b84cd..be7f76302 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -808,7 +808,7 @@ void Crop::update (int todo) LUTu dummy; int modedehaz; - parent->ipf.MSR(labnCrop, labnCrop->W, labnCrop->H, 1); + // parent->ipf.MSR(labnCrop, labnCrop->W, labnCrop->H, 1); parent->ipf.chromiLuminanceCurve (this, 1, labnCrop, labnCrop, parent->chroma_acurve, parent->chroma_bcurve, parent->satcurve, parent->lhskcurve, parent->clcurve, parent->lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy, dummy, dummy); parent->ipf.vibrance (labnCrop); diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 557f9a0b8..277794a54 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -69,12 +69,15 @@ public: virtual int load (Glib::ustring fname, bool batch = false) = 0; virtual void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse) {}; virtual void demosaic (const RAWParams &raw) {}; + virtual void dehaz (RAWParams raw, ColorManagementParams cmp, LCurveParams lcur, LUTf & cdcurve, bool dehacontlutili) {}; virtual void flushRawData () {}; virtual void flushRGB () {}; virtual void HLRecovery_Global (ToneCurveParams hrp) {}; virtual void HLRecovery_inpaint (float** red, float** green, float** blue) {}; + virtual void MSR(LabImage* lab, int width, int height, int skip, LCurveParams lcur) {}; virtual bool IsrgbSourceModified() = 0; // tracks whether cached rgb output of demosaic has been modified + // virtual void MSR(LabImage* lab, int width, int height, int skip, const LCurveParams &lcur); // use right after demosaicing image, add coarse transformation and put the result in the provided Imagefloat* virtual void getImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, ToneCurveParams hlp, ColorManagementParams cmp, RAWParams raw) {} diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 6c9451874..00e973e37 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -46,6 +46,7 @@ ImProcCoordinator::ImProcCoordinator () satcurve(65536, 0), lhskcurve(65536, 0), clcurve(65536, 0), + cdcurve(65536, 0), wavclCurve(65536, 0), clToningcurve(65536, 0), cl2Toningcurve(65536, 0), @@ -163,7 +164,8 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) } RAWParams rp = params.raw; - + ColorManagementParams cmp = params.icm; + LCurveParams lcur = params.labCurve; if( !highDetailNeeded ) { // if below 100% magnification, take a fast path if(rp.bayersensor.method != RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::none] && rp.bayersensor.method != RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::mono]) { @@ -219,7 +221,8 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) } } - imgsrc->demosaic( rp ); + imgsrc->demosaic( rp);//enabled demosaic + if (highDetailNeeded) { highDetailRawComputed = true; @@ -231,7 +234,14 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) highDetailRawComputed = false; } } - + bool dehacontlutili=false; + CurveFactory::curveDehaContL (dehacontlutili, params.labCurve.cdcurve, cdcurve, 1); + + if (todo & M_INIT || params.labCurve.dehazmet!="none"){ + if(params.labCurve.dehazmet!="none") + imgsrc->dehaz( params.raw, params.icm, params.labCurve, cdcurve, dehacontlutili);//enabled Dehaze + + } // Updating toneCurve.hrenabled if necessary // It has to be done there, because the next 'if' statement will use the value computed here if (todo & M_AUTOEXP) { @@ -248,8 +258,9 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) if (todo & (M_INIT | M_LINDENOISE)) { MyMutex::MyLock initLock(minit); // Also used in crop window - - imgsrc->HLRecovery_Global( params.toneCurve ); // this handles Color HLRecovery + + imgsrc->HLRecovery_Global( params.toneCurve); // this handles Color HLRecovery + if (settings->verbose) { printf ("Applying white balance, color correction & sRBG conversion...\n"); @@ -294,7 +305,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) imgsrc->getImage (currWB, tr, orig_prev, pp, params.toneCurve, params.icm, params.raw); //ColorTemp::CAT02 (orig_prev, ¶ms) ; - + // printf("orig_prevW=%d\n scale=%d",orig_prev->width, scale); /* Issue 2785, disabled some 1:1 tools if (todo & M_LINDENOISE) { DirPyrDenoiseParams denoiseParams = params.dirpyrDenoise; @@ -576,7 +587,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) nprevl->CopyFrom(oprevl); progress ("Applying Color Boost...", 100 * readyphase / numofphases); - ipf.MSR(nprevl, nprevl->W, nprevl->H, 1); + // ipf.MSR(nprevl, nprevl->W, nprevl->H, 1); ipf.chromiLuminanceCurve (NULL, pW, nprevl, nprevl, chroma_acurve, chroma_bcurve, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, histCCurve, histCLurve, histLLCurve, histLCurve); ipf.vibrance(nprevl); diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index e0588d5df..cce71995e 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -94,6 +94,7 @@ protected: LUTf satcurve; LUTf lhskcurve; LUTf clcurve; + LUTf cdcurve; LUTf wavclCurve; LUTf clToningcurve; LUTf cl2Toningcurve; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index fb7269fe5..b9aa4838b 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -306,7 +306,7 @@ public: //void RGB_OutputTransf(LabImage * src, Imagefloat * dst, const procparams::DirPyrDenoiseParams & dnparams); //void output_tile_row (float *Lbloxrow, float ** Lhipassdn, float ** tilemask, int height, int width, int top, int blkrad ); - void MSR(LabImage* lab, int width, int height, int skip); +// void MSR(LabImage* lab, int width, int height, int skip); 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, LUTf &wavclCurve, bool wavcontlutili, int skip); diff --git a/rtengine/ipdehaz.cc b/rtengine/ipdehaz.cc index 16d9a3afd..e405456ea 100644 --- a/rtengine/ipdehaz.cc +++ b/rtengine/ipdehaz.cc @@ -35,7 +35,7 @@ #include #include "rtengine.h" #include "gauss.h" - +#include "rawimagesource.h" #include "improcfun.h" #define MAX_DEHAZE_SCALES 6 #define clipdehaz( val, minv, maxv ) (( val = (val < minv ? minv : val ) ) > maxv ? maxv : val ) @@ -100,25 +100,29 @@ void mean_stddv( float **dst, float &mean, float &stddv, int W_L, int H_L ) -void ImProcFunctions::MSR(LabImage* lab, int width, int height, int skip) +void RawImageSource::MSR(LabImage* lab, int width, int height, int skip, LCurveParams lcur) { float pond; float mean, stddv; float mini, delta, maxi; float eps = 2.f; - float gain = (float) params->labCurve.gain;//def =1 not use - float offset = 1.f; - float neg=(float) params->labCurve.offs;//def = 0 not use - float strength = (float) params->labCurve.str; - int scal = params->labCurve.scal;//def=3 - int nei = (int) 2.5f*params->labCurve.neigh;//def = 200 - int vart= params->labCurve.vart; + float gain = (float) lcur.gain;//def =1 not use + gain=1.f; + float gain2 = (float) lcur.gain;//def =1 not use + gain2/=100.f; + float offset =(float) lcur.offs;//def = 0 not use + offset = 0.f; + float strength = (float) lcur.str; + int scal = lcur.scal;//def=3 + int nei = (int) 2.5f*lcur.neigh;//def = 200 + float vart = (float)lcur.vart;//variance + vart /=100.f; int modedehaz; - if(params->labCurve.dehazmet=="none") modedehaz=-1;//enabled disabled - if(params->labCurve.dehazmet=="uni") modedehaz=0; - if(params->labCurve.dehazmet=="low") modedehaz=1; - if(params->labCurve.dehazmet=="high") modedehaz=2; + if(lcur.dehazmet=="none") modedehaz=-1;//enabled disabled + if(lcur.dehazmet=="uni") modedehaz=0; + if(lcur.dehazmet=="low") modedehaz=1; + if(lcur.dehazmet=="high") modedehaz=2; if (modedehaz !=-1) {//enabled int H_L=height; int W_L=width; @@ -171,9 +175,10 @@ void ImProcFunctions::MSR(LabImage* lab, int width, int height, int skip) #pragma omp parallel #endif { - AlignedBufferMP buffer(max(W_L,H_L)); - gaussHorizontal (in, out, buffer, W_L, H_L, DehazeScales[scale]); - gaussVertical (out, out, buffer,W_L, H_L, DehazeScales[scale]); + AlignedBufferMP* pBuffer = new AlignedBufferMP (max(W_L, H_L)); + gaussHorizontal (in, out, *pBuffer, W_L, H_L, DehazeScales[scale]); + gaussVertical (out, out, *pBuffer,W_L, H_L, DehazeScales[scale]); + delete pBuffer; } for ( int i=0; i < H_L; i++) for (int j=0; j < W_L; j++) @@ -210,13 +215,10 @@ float beta=16384.0f; mean=0.f;stddv=0.f; mean_stddv( dst, mean, stddv, W_L, H_L); - float nstdv=1.25f; - mini = mean - 1.2f*stddv; - maxi = mean + 1.2f*stddv; - // mini = neg; + mini = mean - vart*stddv; + maxi = mean + vart*stddv; delta = maxi - mini; - // delta = vart; printf("maxi=%f mini=%f mean=%f std=%f delta=%f\n", maxi, mini, mean, stddv, delta); if ( !delta ) delta = 1.0f; @@ -225,7 +227,7 @@ float beta=16384.0f; #endif for ( int i=0; i < H_L; i ++ ) for (int j=0; j< W_L; j++) { - float cd = vart*32768.f * ( dst[i][j] - mini ) / delta; + float cd = gain2*32768.f * ( dst[i][j] - mini ) / delta; src[i][j] = clipdehaz( cd, 0.f, 32768.f ); lab->L[i][j]=((100.f - strength)* lab->L[i][j] + strength * src[i][j])/100.f; } diff --git a/rtengine/previewimage.cc b/rtengine/previewimage.cc index 0c2509e7d..1e0f15593 100644 --- a/rtengine/previewimage.cc +++ b/rtengine/previewimage.cc @@ -121,6 +121,9 @@ PreviewImage::PreviewImage (const Glib::ustring &fname, const Glib::ustring &ext rtengine::Image8 *output = NULL; const unsigned char *data = NULL; int fw, fh; + LUTf cdcurve; + bool dehacontlutili=false; + procparams::ProcParams params; /*rtengine::RAWParams raw; rtengine::LensProfParams lensProf; @@ -137,6 +140,7 @@ PreviewImage::PreviewImage (const Glib::ustring &fname, const Glib::ustring &ext params.raw.xtranssensor.method = RAWParams::XTransSensor::methodstring[RAWParams::XTransSensor::fast]; rawImage.preprocess(params.raw, params.lensProf, params.coarse); rawImage.demosaic(params.raw); + // rawImage.dehaz(params.raw, params.icm, params.labCurve, cdcurve, dehacontlutili); Imagefloat* image = new rtengine::Imagefloat (fw, fh); rawImage.getImage (wb, TR_NONE, image, pp, params.toneCurve, params.icm, params.raw); output = new Image8(fw, fh); diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 1d61b9966..8d9693d28 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -439,7 +439,7 @@ enum ProcEvent { EvLstr = 410, EvLscal = 411, EvLvart = 412, - + EvLCDCurve = 413, NUMOFEVENTS }; } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index f4d53d671..cf8d34b15 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -882,12 +882,12 @@ void ProcParams::setDefaults () labCurve.brightness = 0; labCurve.contrast = 0; labCurve.chromaticity = 0; - labCurve.str = 70; + labCurve.str = 60; labCurve.scal = 3; labCurve.neigh = 80; - labCurve.gain = 1; + labCurve.gain = 100; labCurve.offs = 0; - labCurve.vart = 1; + labCurve.vart = 125; labCurve.avoidcolorshift = false; labCurve.lcredsk = true; labCurve.rstprotection = 0; @@ -911,6 +911,8 @@ void ProcParams::setDefaults () labCurve.lccurve.push_back(DCT_Linear); labCurve.clcurve.clear (); labCurve.clcurve.push_back(DCT_Linear); + labCurve.cdcurve.clear (); + labCurve.cdcurve.push_back(DCT_Linear); rgbCurves.lumamode = false; rgbCurves.rcurve.clear (); @@ -1624,6 +1626,11 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, bool fnameAbsol keyFile.set_double_list("Luminance Curve", "ClCurve", clcurve); } + if (!pedited || pedited->labCurve.cdcurve) { + Glib::ArrayHandle cdcurve = labCurve.cdcurve; + keyFile.set_double_list("Luminance Curve", "CDCurve", cdcurve); + } + // save sharpening if (!pedited || pedited->sharpening.enabled) { keyFile.set_boolean ("Sharpening", "Enabled", sharpening.enabled); @@ -3872,6 +3879,14 @@ int ProcParams::load (Glib::ustring fname, ParamsEdited* pedited) } } + if (keyFile.has_key ("Luminance Curve", "CDCurve")) { + labCurve.cdcurve = keyFile.get_double_list ("Luminance Curve", "CDCurve"); + + if (pedited) { + pedited->labCurve.cdcurve = true; + } + } + } // load sharpening @@ -7083,6 +7098,7 @@ bool ProcParams::operator== (const ProcParams& other) && labCurve.hhcurve == other.labCurve.hhcurve && labCurve.lccurve == other.labCurve.lccurve && labCurve.clcurve == other.labCurve.clcurve + && labCurve.cdcurve == other.labCurve.cdcurve && labCurve.str == other.labCurve.str && labCurve.scal == other.labCurve.scal && labCurve.neigh == other.labCurve.neigh diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 91439cf2c..f6d92a0fb 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -277,6 +277,7 @@ public: std::vector hhcurve; std::vector lccurve; std::vector clcurve; + std::vector cdcurve; int brightness; int contrast; int chromaticity; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index b425a9f88..dbd7e9c9a 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1734,7 +1734,6 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le return; } - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% void RawImageSource::demosaic(const RAWParams &raw) @@ -1787,8 +1786,10 @@ void RawImageSource::demosaic(const RAWParams &raw) } t2.set(); + rgbSourceModified = false; + if( settings->verbose ) { if (getSensorType() == ST_BAYER) { @@ -1797,9 +1798,83 @@ void RawImageSource::demosaic(const RAWParams &raw) printf("Demosaicing X-Trans data: %s - %d usec\n", raw.xtranssensor.method.c_str(), t2.etime(t1)); } } - } +void RawImageSource::dehaz(RAWParams raw, ColorManagementParams cmp, LCurveParams lcur, LUTf & cdcurve, bool dehacontlutili) +{ + + MyTime t4, t5; + t4.set(); + if(!rgbSourceModified) { + if (settings->verbose) { + printf ("Applying DeHaze\n"); + } + + TMatrix wprof = iccStore->workingSpaceMatrix (cmp.working); + TMatrix wiprof = iccStore->workingSpaceInverseMatrix (cmp.working); + + double wip[3][3] = { + {wiprof[0][0], wiprof[0][1], wiprof[0][2]}, + {wiprof[1][0], wiprof[1][1], wiprof[1][2]}, + {wiprof[2][0], wiprof[2][1], wiprof[2][2]} + }; + + double wp[3][3] = { + {wprof[0][0], wprof[0][1], wprof[0][2]}, + {wprof[1][0], wprof[1][1], wprof[1][2]}, + {wprof[2][0], wprof[2][1], wprof[2][2]} + }; + LabImage * labdeha = new LabImage(W, H); + + #pragma omp parallel for + for (int i = 0; i lab + Color::rgbxyz(red[i][j], green[i][j], blue[i][j], X, Y, Z, wp); + //convert Lab + Color::XYZ2Lab(X, Y, Z, L, aa, bb); + labdeha->L[i][j]=L; + // if(lcur.dehazmet !="none") { + if(dehacontlutili) labdeha->L[i][j]=cdcurve[L];//apply curve to equalize histogram + // } + labdeha->a[i][j]=aa; + labdeha->b[i][j]=bb; + + } + + MSR(labdeha, W, H, 1, lcur); + + #pragma omp parallel for + for (int i = 0; i L[i][j]; + a2=labdeha->a[i][j]; + b2=labdeha->b[i][j]; + Color::Lab2XYZ(L2, a2, b2, x_, y_, z_) ; + Color::xyz2rgb(x_, y_, z_, R, G, B, wip); + red[i][j]=R; + green[i][j]=G; + blue[i][j]=B; + } + + delete labdeha; + + t5.set(); + + + + if( settings->verbose ) { + printf("Dehaz=%d usec\n", t5.etime(t4)); + + } + rgbSourceModified = true; + } +} + + void RawImageSource::flushRawData() { if(cache) { @@ -1827,18 +1902,18 @@ void RawImageSource::flushRGB() } } -void RawImageSource::HLRecovery_Global(ToneCurveParams hrp ) +void RawImageSource::HLRecovery_Global(ToneCurveParams hrp) { if (hrp.hrenabled && hrp.method == "Color") { if(!rgbSourceModified) { if (settings->verbose) { printf ("Applying Highlight Recovery: Color propagation...\n"); } - HLRecovery_inpaint (red, green, blue); rgbSourceModified = true; } } + } diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index d4ebf9928..3ce1f1089 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -151,6 +151,7 @@ public: int load (Glib::ustring fname, bool batch = false); void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse); void demosaic (const RAWParams &raw); + void dehaz (RAWParams raw, ColorManagementParams cmp, LCurveParams lcur, LUTf & cdcurve, bool dehacontlutili); void flushRawData (); void flushRGB (); void HLRecovery_Global (ToneCurveParams hrp); @@ -226,6 +227,7 @@ public: void boxblur2(float** src, float** dst, int H, int W, int box ); void boxblur_resamp(float **src, float **dst, int H, int W, int box, int samp ); + void MSR(LabImage* lab, int width, int height, int skip, LCurveParams lcur); //void boxblur_resamp(float **red, float **green, float **blue, int H, int W, float thresh[3], float max[3], // multi_array2D & hfsize, multi_array2D & hilite, int box ); @@ -271,6 +273,7 @@ protected: void jdl_interpolate_omp(); void igv_interpolate(int winw, int winh); void lmmse_interpolate_omp(int winw, int winh, int iterations); + // void MSR(LabImage* lab, int width, int height, int skip, const LCurveParams &lcur); void amaze_demosaic_RT(int winx, int winy, int winw, int winh);//Emil's code for AMaZE void fast_demosaic(int winx, int winy, int winw, int winh );//Emil's code for fast demosaicing diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 2bd73a3c4..32cc0b6b8 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -428,13 +428,14 @@ int refreshmap[rtengine::NUMOFEVENTS] = { DIRPYREQUALIZER, // EvWavedgeampli DIRPYREQUALIZER, //EvWavlev3nois DIRPYREQUALIZER, //EvWavNPmet - LUMINANCECURVE, // Evdehazmet - LUMINANCECURVE, // EvLneigh - LUMINANCECURVE, // EvLgain - LUMINANCECURVE, // EvLoffs - LUMINANCECURVE, // EvLstr - LUMINANCECURVE, // EvLscal - LUMINANCECURVE // EvLvart + ALLNORAW, // Evdehazmet + ALLNORAW, // EvLneigh + ALLNORAW, // EvLgain + ALLNORAW, // EvLoffs + ALLNORAW, // EvLstr + ALLNORAW, // EvLscal + ALLNORAW, // EvLvart + ALLNORAW // EvLCDCurve }; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index bffef9f14..3c30b0bb4 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -115,13 +115,25 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p if (pl) { pl->setProgress (0.30); } + LUTf cdcurve (65536, 0); + + bool dehacontlutili=false; + CurveFactory::curveDehaContL (dehacontlutili, params.labCurve.cdcurve, cdcurve, 1); + + if(params.labCurve.dehazmet!="none") + imgsrc->dehaz( params.raw, params.icm, params.labCurve, cdcurve, dehacontlutili );//enabled Dehaze - imgsrc->HLRecovery_Global( params.toneCurve ); if (pl) { pl->setProgress (0.40); } + imgsrc->HLRecovery_Global( params.toneCurve ); + + if (pl) { + pl->setProgress (0.45); + } + // set the color temperature ColorTemp currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.equal, params.wb.method); @@ -610,7 +622,7 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p imgsrc->getImage (currWB, tr, baseImg, pp, params.toneCurve, params.icm, params.raw); if (pl) { - pl->setProgress (0.45); + pl->setProgress (0.50); } // LUTf Noisecurve (65536,0); @@ -847,7 +859,7 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p shmap = NULL; if (pl) { - pl->setProgress (0.5); + pl->setProgress (0.55); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -901,7 +913,7 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p params.labCurve.acurve, params.labCurve.bcurve, params.labCurve.cccurve, params.labCurve.lccurve, curve1, curve2, satcurve, lhskcurve, hist16C, hist16C, dummy, dummy, 1); - ipf.MSR(labView, labView->W, labView->H, 1); + // ipf.MSR(labView, labView->W, labView->H, 1); ipf.chromiLuminanceCurve (NULL, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy, dummy, dummy); diff --git a/rtgui/labcurve.cc b/rtgui/labcurve.cc index c1e045407..2261c6f4d 100644 --- a/rtgui/labcurve.cc +++ b/rtgui/labcurve.cc @@ -233,29 +233,46 @@ LCurve::LCurve () : FoldableToolPanel(this, "labcurves", M("TP_LABCURVE_LABEL")) // dehazmet->set_tooltip_markup (M("TP_DEHAZ_MET_TOOLTIP")); dhbox->pack_start(*dehazmet); dehazVBox->pack_start(*dhbox); + + curveEditorGD = new CurveEditorGroup (options.lastLabCurvesDir, M("TP_LABCURVE_CONTEDIT")); + curveEditorGD->setCurveListener (this); + cdshape = static_cast(curveEditorGD->addCurve(CT_Diagonal, M("TP_LABCURVE_CURVEEDITOR_CD"))); + cdshape->setTooltip(M("TP_LABCURVE_CURVEEDITOR_CD_TOOLTIP")); + std::vector milestones22; - str = Gtk::manage (new Adjuster (M("TP_LABCURVE_STR"), 0, 100., 1., 70.)); + milestones22.push_back( GradientMilestone(0., 0., 0., 0.) ); + milestones22.push_back( GradientMilestone(1., 1., 1., 1.) ); + cdshape->setBottomBarBgGradient(milestones22); + cdshape->setLeftBarBgGradient(milestones22); + + curveEditorGD->curveListComplete(); + + str = Gtk::manage (new Adjuster (M("TP_LABCURVE_STR"), 0, 100., 1., 60.)); scal = Gtk::manage (new Adjuster (M("TP_LABCURVE_SCAL"), 1, 6., 1., 3.)); neigh = Gtk::manage (new Adjuster (M("TP_LABCURVE_NEIGH"), 6, 100., 1., 80.)); - gain = Gtk::manage (new Adjuster (M("TP_LABCURVE_GAIN"), 0.8, 1.4, 0.01, 1.)); - offs = Gtk::manage (new Adjuster (M("TP_LABCURVE_OFFS"), -10, 5, 0.1, 0)); - vart = Gtk::manage (new Adjuster (M("TP_LABCURVE_VART"), 0.5, 15., 0.01, 1)); + gain = Gtk::manage (new Adjuster (M("TP_LABCURVE_GAIN"), 70, 130, 1, 100)); + offs = Gtk::manage (new Adjuster (M("TP_LABCURVE_OFFS"), 0, 40, 0.1, 0)); + vart = Gtk::manage (new Adjuster (M("TP_LABCURVE_VART"), 100, 160, 1, 125)); dehazVBox->pack_start (*str); str->show (); - + + dehazVBox->pack_start (*curveEditorGD, Gtk::PACK_SHRINK, 4); + curveEditorGD->show(); + dehazVBox->pack_start (*scal); scal->show (); dehazVBox->pack_start (*neigh); neigh->show (); -// dehazVBox->pack_start (*gain); -// gain->show (); + dehazVBox->pack_start (*gain); + gain->show (); // dehazVBox->pack_start (*offs); - // offs->show (); -// dehazVBox->pack_start (*vart); - // vart->show (); +// offs->show (); + + dehazVBox->pack_start (*vart); + vart->show (); str->setAdjusterListener (this); scal->setAdjusterListener (this); @@ -271,6 +288,8 @@ LCurve::LCurve () : FoldableToolPanel(this, "labcurves", M("TP_LABCURVE_LABEL")) LCurve::~LCurve () { delete curveEditorG; + delete curveEditorGD; + } void LCurve::read (const ProcParams* pp, const ParamsEdited* pedited) @@ -313,6 +332,7 @@ void LCurve::read (const ProcParams* pp, const ParamsEdited* pedited) hhshape->setUnChanged (!pedited->labCurve.hhcurve); lcshape->setUnChanged (!pedited->labCurve.lccurve); clshape->setUnChanged (!pedited->labCurve.clcurve); + cdshape->setUnChanged (!pedited->labCurve.cdcurve); } brightness->setValue (pp->labCurve.brightness); @@ -364,6 +384,7 @@ void LCurve::read (const ProcParams* pp, const ParamsEdited* pedited) hhshape->setCurve (pp->labCurve.hhcurve); lcshape->setCurve (pp->labCurve.lccurve); clshape->setCurve (pp->labCurve.clcurve); + cdshape->setCurve (pp->labCurve.cdcurve); queue_draw(); dehazmetConn.block(false); @@ -407,6 +428,10 @@ void LCurve::autoOpenCurve () if (!active) { clshape->openIfNonlinear(); } + + if (!active) { + cdshape->openIfNonlinear(); + } } void LCurve::setEditProvider (EditDataProvider *provider) @@ -415,6 +440,7 @@ void LCurve::setEditProvider (EditDataProvider *provider) ccshape->setEditProvider(provider); lcshape->setEditProvider(provider); clshape->setEditProvider(provider); + cdshape->setEditProvider(provider); lhshape->setEditProvider(provider); chshape->setEditProvider(provider); hhshape->setEditProvider(provider); @@ -453,6 +479,7 @@ void LCurve::write (ProcParams* pp, ParamsEdited* pedited) pp->labCurve.hhcurve = hhshape->getCurve (); pp->labCurve.lccurve = lcshape->getCurve (); pp->labCurve.clcurve = clshape->getCurve (); + pp->labCurve.cdcurve = cdshape->getCurve (); if (pedited) { pedited->labCurve.brightness = brightness->getEditedState (); @@ -485,6 +512,7 @@ void LCurve::write (ProcParams* pp, ParamsEdited* pedited) pedited->labCurve.hhcurve = !hhshape->isUnChanged (); pedited->labCurve.lccurve = !lcshape->isUnChanged (); pedited->labCurve.clcurve = !clshape->isUnChanged (); + pedited->labCurve.cdcurve = !cdshape->isUnChanged (); } @@ -650,6 +678,11 @@ void LCurve::curveChanged (CurveEditor* ce) if (ce == clshape) { listener->panelChanged (EvLCLCurve, M("HISTORY_CUSTOMCURVE")); } + + if (ce == cdshape) { + listener->panelChanged (EvLCDCurve, M("HISTORY_CUSTOMCURVE")); + } + } } @@ -796,6 +829,7 @@ void LCurve::setBatchMode (bool batchMode) str->showEditedCB (); scal->showEditedCB (); vart->showEditedCB (); + curveEditorGD->setBatchMode (batchMode); curveEditorG->setBatchMode (batchMode); lcshape->setBottomBarColorProvider(NULL, -1); diff --git a/rtgui/labcurve.h b/rtgui/labcurve.h index 6fd5cd031..ae671a2f5 100644 --- a/rtgui/labcurve.h +++ b/rtgui/labcurve.h @@ -31,6 +31,7 @@ class LCurve : public ToolParamBlock, public AdjusterListener, public FoldableTo protected: CurveEditorGroup* curveEditorG; + CurveEditorGroup* curveEditorGD; Adjuster* brightness; Adjuster* contrast; Adjuster* chromaticity; @@ -54,6 +55,7 @@ protected: MyComboBoxText* dehazmet; DiagonalCurveEditor* clshape; + DiagonalCurveEditor* cdshape; //%%%%%%%%%%%%%%%% Gtk::CheckButton* avoidcolorshift; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index ad4e17bcd..30e1ad38a 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -58,6 +58,7 @@ void ParamsEdited::set (bool v) labCurve.hhcurve = v; labCurve.lccurve = v; labCurve.clcurve = v; + labCurve.cdcurve = v; labCurve.dehazmet = v; labCurve.str = v; labCurve.scal = v; @@ -520,6 +521,7 @@ void ParamsEdited::initFrom (const std::vector labCurve.hhcurve = labCurve.hhcurve && p.labCurve.hhcurve == other.labCurve.hhcurve; labCurve.lccurve = labCurve.lccurve && p.labCurve.lccurve == other.labCurve.lccurve; labCurve.clcurve = labCurve.clcurve && p.labCurve.clcurve == other.labCurve.clcurve; + labCurve.cdcurve = labCurve.cdcurve && p.labCurve.cdcurve == other.labCurve.cdcurve; labCurve.dehazmet = labCurve.dehazmet && p.labCurve.dehazmet == other.labCurve.dehazmet; labCurve.str = labCurve.str && p.labCurve.str == other.labCurve.str; labCurve.scal = labCurve.scal && p.labCurve.scal == other.labCurve.scal; @@ -1046,6 +1048,9 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten if (labCurve.clcurve) { toEdit.labCurve.clcurve = mods.labCurve.clcurve; } + if (labCurve.cdcurve) { + toEdit.labCurve.cdcurve = mods.labCurve.cdcurve; + } if (labCurve.brightness) { toEdit.labCurve.brightness = dontforceSet && options.baBehav[ADDSET_LC_BRIGHTNESS] ? toEdit.labCurve.brightness + mods.labCurve.brightness : mods.labCurve.brightness; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 7820aadc9..021b45c86 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -81,6 +81,7 @@ public: bool hhcurve; bool lccurve; bool clcurve; + bool cdcurve; bool enabled; bool method;