diff --git a/rtdata/languages/default b/rtdata/languages/default index 82328c3b5..3ac2fe9ac 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -576,14 +576,14 @@ HISTORY_MSG_343;W - Chroma levels HISTORY_MSG_344;W - Meth chroma sl/cur HISTORY_MSG_345;W - ES - Local contrast HISTORY_MSG_346;W - ES - Local contrast method -HISTORY_MSG_347;W - Denoise - Level 0 -HISTORY_MSG_348;W - Denoise - Level 1 -HISTORY_MSG_349;W - Denoise - Level 2 +HISTORY_MSG_347;W - Denoise - Level 1 +HISTORY_MSG_348;W - Denoise - Level 2 +HISTORY_MSG_349;W - Denoise - Level 3 HISTORY_MSG_350;W - ES - Edge detection HISTORY_MSG_351;W - Residual - HH curve HISTORY_MSG_352;W - Background HISTORY_MSG_353;W - ES - Gradient sensitivity -HISTORY_MSG_354;W - ES - Enhance +HISTORY_MSG_354;W - ES - Enhanced HISTORY_MSG_355;W - ES - Threshold low HISTORY_MSG_356;W - ES - Threshold high HISTORY_MSG_357;W - Denoise - Link with ES @@ -632,6 +632,10 @@ HISTORY_MSG_399;W - Residual sub-tool HISTORY_MSG_400;W - Final sub-tool HISTORY_MSG_401;W - Toning sub-tool HISTORY_MSG_402;W - Denoise sub-tool +HISTORY_MSG_403;W - ES - Edge sensitivity +HISTORY_MSG_404;W - ES - Base amplification +HISTORY_MSG_405;W - Denoise - Level 4 +HISTORY_MSG_406;W - ES - Neighboring pixels HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOTS;Snapshots @@ -1691,9 +1695,9 @@ TP_WAVELET_B2;Residual 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, chromaticity or residual tone mapping are activated, the effect due to balance is amplified. +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 chromaticity balance. +TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance. TP_WAVELET_BANONE;None TP_WAVELET_BASLI;Slider TP_WAVELET_BATYPE;Contrast balance method @@ -1701,14 +1705,14 @@ TP_WAVELET_CBENAB;Toning and Color Balance TP_WAVELET_CBTYPE;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 -TP_WAVELET_CH1;Whole chromaticity range +TP_WAVELET_CH1;Whole chroma range TP_WAVELET_CH2;Saturated/pastel TP_WAVELET_CH3;Link contrast levels TP_WAVELET_CHCU;Curve TP_WAVELET_CHRO;Saturated/pastel threshold 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;Chroma-contrast link strength -TP_WAVELET_CHR_TOOLTIP;Adjusts chromaticity as a function of "contrast levels" and "chroma-contrast link strength" +TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of "contrast levels" and "chroma-contrast link strength" TP_WAVELET_CHSL;Sliders TP_WAVELET_CHTYPE;Chrominance method TP_WAVELET_COLORT;Opacity Red-Green @@ -1743,6 +1747,7 @@ TP_WAVELET_DONE;Vertical TP_WAVELET_DTHR;Diagonal TP_WAVELET_DTWO;Horizontal TP_WAVELET_EDCU;Curve +TP_WAVELET_EDGEAMPLI;Base amplification TP_WAVELET_EDGCONT;Local contrast TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima TP_WAVELET_EDGEDETECTTHR2;Threshold high (detection) @@ -1752,6 +1757,7 @@ TP_WAVELET_EDGEDETECT;Gradient sensitivity TP_WAVELET_EDGEDETECT_TOOLTIP;Moving the slider to the right increases edge sensitivity. This affects local contrast, edge settings and noise. TP_WAVELET_EDGE;Edge Sharpness 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_EDGESENSI;Edge sensitivity TP_WAVELET_EDGTHRESH;Detail TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. TP_WAVELET_EDRAD;Radius @@ -1772,7 +1778,7 @@ TP_WAVELET_ITER;Delta balance levels TP_WAVELET_ITER_TOOLTIP;Left: increase low levels and reduce high levels,\nRight: reduce low levels and increase high levels. TP_WAVELET_LABEL;Wavelet Levels TP_WAVELET_LARGEST;Coarsest -TP_WAVELET_LEVCH;Chromaticity +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_ONE;One level @@ -1784,30 +1790,37 @@ TP_WAVELET_LEVLABEL;Preview maximum possible levels = %1 TP_WAVELET_LEVONE;Level 2 TP_WAVELET_LEVTWO;Level 3 TP_WAVELET_LEVZERO;Level 1 +TP_WAVELET_LEVTHRE;Level 4 TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength -TP_WAVELET_LIPST;Enhanced algorithm -TP_WAVELET_LIPST_TOOLTIP;This algorithm uses Lipschitz regularity to increase edge detection quality at a cost of increased processing time and memory requirements. +TP_WAVELET_LIPST;Enhanced algoritm +TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced. TP_WAVELET_LOWLIGHT;Shadow luminance range TP_WAVELET_MEDGREINF;First level TP_WAVELET_MEDILEV;Edge detection +TP_WAVELET_MEDILEV_TOOLTIP;When you enable Edge Detection, it is recommanded:\n- to disabled low contrast levels to avoid artifacts,\n- to use high values of gradient sensitivity.\n\nYou can modulate the strength with 'refine' from Denoise and Refine. TP_WAVELET_MEDI;Reduce artifacts in blue sky TP_WAVELET_NEUTRAL;Neutral TP_WAVELET_NOISE;Denoise and Refine TP_WAVELET_NOIS;Denoise +TP_WAVELET_NPNONE;None +TP_WAVELET_NPLOW;Low +TP_WAVELET_NPHIGH;High +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_OPACITYWL;Final 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_OPACITYW;Contrast balance d/v-h curve TP_WAVELET_OPACITY;Opacity Blue-Yellow -TP_WAVELET_PASTEL;Pastel chromaticity +TP_WAVELET_PASTEL;Pastel chroma TP_WAVELET_PROC;Process TP_WAVELET_RE1;Reinforced TP_WAVELET_RE2;Unchanged TP_WAVELET_RE3;Reduced -TP_WAVELET_RESCHRO;Chromaticity +TP_WAVELET_RESCHRO;Chroma TP_WAVELET_RESCONH;Highlights TP_WAVELET_RESCON;Shadows TP_WAVELET_RESID;Residual Image -TP_WAVELET_SAT;Saturated chromaticity +TP_WAVELET_SAT;Saturated chroma TP_WAVELET_SETTINGS;Wavelet Settings 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 2343ff865..6b3a808ac 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -645,7 +645,7 @@ do { // Calculate number of tiles. If less than omp_get_max_threads(), then limit num_threads to number of tiles int numthreads = MIN(numtiles,omp_get_max_threads()); if(options.rgbDenoiseThreadLimit > 0) - numthreads = MIN(numthreads,options.rgbDenoiseThreadLimit); + numthreads = MIN(numthreads,options.rgbDenoiseThreadLimit); #ifdef _RT_NESTED_OPENMP denoiseNestedLevels = omp_get_max_threads() / numthreads; bool oldNested = omp_get_nested(); @@ -655,7 +655,7 @@ do { omp_set_nested(true); if(options.rgbDenoiseThreadLimit > 0) while(denoiseNestedLevels*numthreads > options.rgbDenoiseThreadLimit) - denoiseNestedLevels--; + denoiseNestedLevels--; #endif if(settings->verbose) printf("RGB_denoise uses %d main thread(s) and up to %d nested thread(s) for each main thread\n",numthreads,denoiseNestedLevels); @@ -739,7 +739,7 @@ do { if(!denoiseMethodRgb){//lab mode //modification Jacques feb 2013 and july 2014 #ifdef _RT_NESTED_OPENMP -#pragma omp parallel for num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) +#pragma omp parallel for num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) #endif for (int i=tiletop; i1) +#pragma omp parallel for num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) #endif for (int i=tiletop; i1) +#pragma omp parallel for num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) #endif for (int i=tiletop; i maxWL) @@ -2087,16 +2087,17 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi if(WaveletCoeffs_L.level_H(lvl) > maxHL) maxHL = WaveletCoeffs_L.level_H(lvl); } - bool memoryAllocationFailed = false; + bool memoryAllocationFailed = false; #ifdef _RT_NESTED_OPENMP #pragma omp parallel num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) #endif { - float *buffer[3]; + float *buffer[4]; buffer[0] = new (std::nothrow) float[maxWL*maxHL+32]; buffer[1] = new (std::nothrow) float[maxWL*maxHL+64]; buffer[2] = new (std::nothrow) float[maxWL*maxHL+96]; - if(buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL) { + buffer[3] = new (std::nothrow) float[maxWL*maxHL+128]; + if(buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL || buffer[3] == NULL) { memoryAllocationFailed = true; } @@ -2110,7 +2111,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi } } } - for(int i=2;i>=0;i--) + for(int i=3;i>=0;i--) if(buffer[i] != NULL) delete [] buffer[i]; } @@ -2180,7 +2181,7 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeff int H_L = WaveletCoeffs_L.level_H(level); float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(level); - +// printf("OK lev=%d\n",level); float mad_L = madL[dir-1] ; if(edge==1) { noisevarlum = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 9e2dffb25..81f02bd21 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -95,7 +95,7 @@ struct cont_params { float b_lsl,t_lsl,b_rsl,t_rsl; float b_lhl,t_lhl,b_rhl,t_rhl; float edg_low, edg_mean, edg_sd, edg_max; - float lev0s, lev0n, lev1s, lev1n, lev2s, lev2n; + float lev0s, lev0n, lev1s, lev1n, lev2s, lev2n, lev3s, lev3n; float b_lpast,t_lpast,b_rpast,t_rpast; float b_lsat,t_lsat,b_rsat,t_rsat; int rad; @@ -150,7 +150,10 @@ struct cont_params { bool toningena; bool noiseena; int maxilev; - + float edgsens; + float edgampl; + int neigh; + bool lipp; }; int wavNestedLevels = 1; @@ -179,7 +182,12 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int if(params->wavelet.Medgreinf=="more") cp.reinforce = 1; if(params->wavelet.Medgreinf=="none") cp.reinforce = 2; if(params->wavelet.Medgreinf=="less") cp.reinforce = 3; - cp.lip3 = params->wavelet.lipst; + + if(params->wavelet.NPmethod=="none") cp.lip3 = false; + if(params->wavelet.NPmethod=="low") {cp.lip3 = true;cp.neigh=0;} + if(params->wavelet.NPmethod=="high") {cp.lip3 = true;cp.neigh=1;} + + cp.lipp = params->wavelet.lipst; cp.diag = params->wavelet.tmr; cp.balan = (float)params->wavelet.balance; cp.ite = params->wavelet.iter; @@ -222,6 +230,13 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int cp.eddet=(float) params->wavelet.edgedetect; cp.eddetthr=(float) params->wavelet.edgedetectthr; cp.eddetthrHi=(float) params->wavelet.edgedetectthr2; + + cp.edgsens=60.f; + cp.edgampl=10.f; + if(cp.lipp) { + cp.edgsens=(float) params->wavelet.edgesensi; + cp.edgampl=(float) params->wavelet.edgeampli; + } int N=imheight*imwidth; int maxmul=params->wavelet.thres; cp.maxilev=maxmul; @@ -385,6 +400,8 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int cp.lev1n =static_cast(params->wavelet.level1noise.value[1]); cp.lev2s =static_cast(params->wavelet.level2noise.value[0]); cp.lev2n =static_cast(params->wavelet.level2noise.value[1]); + cp.lev3s =static_cast(params->wavelet.level3noise.value[0]); + cp.lev3n =static_cast(params->wavelet.level3noise.value[1]); cp.detectedge = false; cp.detectedge = params->wavelet.medianlev; @@ -643,7 +660,7 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int int levwavL = levwav; bool ref0=false; - if((cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f) && cp.noiseena) ref0=true; + if((cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f || cp.lev3s > 0.f) && cp.noiseena) ref0=true; // printf("LevwavL before: %d\n",levwavL); if(cp.contrast == 0.f && cp.tonemap==false && 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 @@ -651,7 +668,12 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int levwavL--; } // printf("LevwavL after: %d\n",levwavL); - if(levwavL < 3) levwavL=3;//to allow edge => I always allocate 3 levels..because if user select wavelet it is to do something !! + // if(cp.noiseena){ + if(levwavL < 4 ) levwavL=4;//to allow edge => I always allocate 3 (4) levels..because if user select wavelet it is to do something !! + // } + // else { + // if(levwavL < 3) levwavL=3;//to allow edge => I always allocate 3 (4) levels..because if user select wavelet it is to do something !! + // } if(levwavL > 0) { wavelet_decomposition* Ldecomp = new wavelet_decomposition (labco->data, labco->W, labco->H, levwavL, 1, skip, max(1,wavNestedLevels), DaubLen ); if(!Ldecomp->memoryAllocationFailed) { @@ -661,7 +683,7 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int #ifdef _RT_NESTED_OPENMP #pragma omp parallel for schedule(dynamic) collapse(2) num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif - for (int lvl=0; lvl<3; lvl++) { + for (int lvl=0; lvl<4; lvl++) { for (int dir=1; dir<4; dir++) { int Wlvl_L = Ldecomp->level_W(lvl); int Hlvl_L = Ldecomp->level_H(lvl); @@ -673,7 +695,7 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int } int ind=0; bool ref=false; - if((cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f) && cp.noiseena) ref=true; + if((cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f || cp.lev3s > 0.f) && cp.noiseena) ref=true; bool contr=false; for(int f=0;f 0.1f || cp.lev1n > 0.1f || cp.lev2n > 0.1f) && cp.noiseena) { + if((cp.lev0n > 0.1f || cp.lev1n > 0.1f || cp.lev2n > 0.1f || cp.lev3n > 0.1f) && cp.noiseena) { vari[0] = max(0.0001f,vari[0]); vari[1] = max(0.0001f,vari[1]); vari[2] = max(0.0001f,vari[2]); + vari[3] = max(0.0001f,vari[3]); float* noisevarlum = NULL; // we need a dummy to pass it to WaveletDenoiseAllL if(!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, vari, edge))// memoryAllocationFailed = true; @@ -1111,7 +1135,7 @@ omp_set_nested(oldNested); maxLP/=3; maxLN/=3; MADL/=3; - if(level < 3) MADL=sqrt(MADL);else MADL=0.f; + if(level < 4) MADL=sqrt(MADL);else MADL=0.f; mean[level]=AvL; meanN[level]=AvN; sigma[level]=SL; @@ -1423,20 +1447,23 @@ if(cp.tonemap && cp.contmet==2 && cp.resena) { float al=(multL-1.f)/(av-min0); float bl=1.f-min0*al; float factorx=1.f; - float *koeLi[9]; - float maxkoeLi[9]; +// float *koeLi[9]; +// float maxkoeLi[9]; + float *koeLi[12]; + float maxkoeLi[12]; + float *koeLibuffer = NULL; bool lipschitz =false; lipschitz=true; if(lipschitz==true) { - for(int y=0;y<9;y++) maxkoeLi[y]=0.f; - koeLibuffer = new float[9*H_L*W_L]; - for (int i=0; i<9; i++) { + for(int y=0;y<12;y++) maxkoeLi[y]=0.f;//9 + koeLibuffer = new float[12*H_L*W_L];//12 + for (int i=0; i<12; i++) {//9 koeLi[i] = &koeLibuffer[i*W_L*H_L]; } - for(int j=0;j<9;j++) + for(int j=0;j<12;j++)//9 for (int i=0; ied_detec; - float eddlow=settings->ed_low; - float eddlipinfl=settings->ed_lipinfl; - float eddlipampl=settings->ed_lipampl; - + float eddlow=settings->ed_low;//5 to 40 + // float eddlipinfl=settings->ed_lipinfl; + // float eddlipampl=settings->ed_lipampl; + float eddlipinfl=0.005f*cp.edgsens + 0.4f; + float eddlipampl=1.f + cp.edgampl/50.f; + // float eddlow=5.f + cp.edgampl/2.f;//settings->ed_low;//5 to 40 if(cp.detectedge && lipschitz==true) { //enabled Lipschitz control...more memory..more time... @@ -1538,7 +1567,7 @@ if(cp.detectedge && lipschitz==true) { //enabled Lipschitz control...more memory #ifdef _RT_NESTED_OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif - for (int lvl=0; lvl<3; lvl++) { + for (int lvl=0; lvl<4; lvl++) { for (int dir=1; dir<4; dir++) { int W_L = WaveletCoeffs_L.level_W(lvl); int H_L = WaveletCoeffs_L.level_H(lvl); @@ -1551,8 +1580,7 @@ if(cp.detectedge && lipschitz==true) { //enabled Lipschitz control...more memory delete [] tmCBuffer; float aamp=1.f+cp.eddetthrHi/100.f; - - for (int lvl=0; lvl<3; lvl++) { + for (int lvl=0; lvl<4; lvl++) { #ifdef _RT_NESTED_OPENMP #pragma omp for schedule(dynamic,16) #endif @@ -1560,16 +1588,29 @@ if(cp.detectedge && lipschitz==true) { //enabled Lipschitz control...more memory for (int j=1; j eddlipinfl) {AmpLip=alipinfl*alph+blipinfl;kampli=SQR(bet)*AmpLip*aamp;}//If beta low reduce kampli else {AmpLip=(1.f/eddlipinfl)*SQR(SQR(alph*bet));kampli=AmpLip/aamp;}//Strong Reduce if beta low // comparaison betwwen pixel and neighbours to do ==> I think 3 dir above is better - - //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]) - + /* 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) interm = 0.01f;//eliminate too low values //we can change this part of algo==> not equal but ponderate @@ -1845,7 +1888,7 @@ if(cp.detectedge && lipschitz==true) { //enabled Lipschitz control...more memory //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void ImProcFunctions::calckoe(float ** WavCoeffs_LL, struct cont_params cp, float *koeLi[9], int level, int dir, int W_L, int H_L, float edd, float *maxkoeLi, float **tmC){ +void ImProcFunctions::calckoe(float ** WavCoeffs_LL, struct cont_params cp, float *koeLi[12], int level, int dir, int W_L, int H_L, float edd, float *maxkoeLi, float **tmC){ int borderL = 2; // printf("cpedth=%f\n",cp.eddetthr); if(cp.eddetthr < 30.f) { @@ -1901,6 +1944,8 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, struct 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 thresh (wavelet.level2noise.value, 2, Glib::OWNERSHIP_NONE); keyFile.set_double_list("Wavelet", "Level2noise", thresh); } + if (!pedited || pedited->wavelet.level3noise) { + Glib::ArrayHandle thresh (wavelet.level3noise.value, 2, Glib::OWNERSHIP_NONE); + keyFile.set_double_list("Wavelet", "Level3noise", thresh); + } + if (!pedited || pedited->wavelet.threshold) keyFile.set_integer ("Wavelet", "ThresholdHighlight", wavelet.threshold); if (!pedited || pedited->wavelet.threshold2) keyFile.set_integer ("Wavelet", "ThresholdShadow", wavelet.threshold2); if (!pedited || pedited->wavelet.edgedetect) keyFile.set_integer ("Wavelet", "Edgedetect", wavelet.edgedetect); if (!pedited || pedited->wavelet.edgedetectthr) keyFile.set_integer ("Wavelet", "Edgedetectthr", wavelet.edgedetectthr); if (!pedited || pedited->wavelet.edgedetectthr2) keyFile.set_integer ("Wavelet", "EdgedetectthrHi", wavelet.edgedetectthr2); + if (!pedited || pedited->wavelet.edgesensi) keyFile.set_integer ("Wavelet", "Edgesensi", wavelet.edgesensi); + if (!pedited || pedited->wavelet.edgeampli) keyFile.set_integer ("Wavelet", "Edgeampli", wavelet.edgeampli); if (!pedited || pedited->wavelet.chroma) keyFile.set_integer ("Wavelet", "ThresholdChroma", wavelet.chroma); if (!pedited || pedited->wavelet.CHmethod) keyFile.set_string ("Wavelet", "CHromaMethod", wavelet.CHmethod); if (!pedited || pedited->wavelet.Medgreinf) keyFile.set_string ("Wavelet", "Medgreinf", wavelet.Medgreinf); if (!pedited || pedited->wavelet.CHSLmethod) keyFile.set_string ("Wavelet", "CHSLromaMethod", wavelet.CHSLmethod); if (!pedited || pedited->wavelet.EDmethod) keyFile.set_string ("Wavelet", "EDMethod", wavelet.EDmethod); + if (!pedited || pedited->wavelet.NPmethod) keyFile.set_string ("Wavelet", "NPMethod", wavelet.NPmethod); if (!pedited || pedited->wavelet.BAmethod) keyFile.set_string ("Wavelet", "BAMethod", wavelet.BAmethod); if (!pedited || pedited->wavelet.TMmethod) keyFile.set_string ("Wavelet", "TMMethod", wavelet.TMmethod); if (!pedited || pedited->wavelet.chro) keyFile.set_integer ("Wavelet", "ChromaLink", wavelet.chro); @@ -2571,6 +2583,7 @@ if (keyFile.has_group ("Wavelet")) { if (keyFile.has_key ("Wavelet", "Medgreinf")) {wavelet.Medgreinf = keyFile.get_string ("Wavelet", "Medgreinf"); if (pedited) pedited->wavelet.Medgreinf = true; } if (keyFile.has_key ("Wavelet", "CHSLromaMethod")) {wavelet.CHSLmethod = keyFile.get_string ("Wavelet", "CHSLromaMethod"); if (pedited) pedited->wavelet.CHSLmethod = true; } if (keyFile.has_key ("Wavelet", "EDMethod")) {wavelet.EDmethod = keyFile.get_string ("Wavelet", "EDMethod"); if (pedited) pedited->wavelet.EDmethod = true; } + if (keyFile.has_key ("Wavelet", "NPMethod")) {wavelet.NPmethod = keyFile.get_string ("Wavelet", "NPMethod"); if (pedited) pedited->wavelet.NPmethod = true; } if (keyFile.has_key ("Wavelet", "BAMethod")) {wavelet.BAmethod = keyFile.get_string ("Wavelet", "BAMethod"); if (pedited) pedited->wavelet.BAmethod = true; } if (keyFile.has_key ("Wavelet", "TMMethod")) {wavelet.TMmethod = keyFile.get_string ("Wavelet", "TMMethod"); if (pedited) pedited->wavelet.TMmethod = true; } if (keyFile.has_key ("Wavelet", "HSMethod")) {wavelet.HSmethod = keyFile.get_string ("Wavelet", "HSMethod"); if (pedited) pedited->wavelet.HSmethod = true; } @@ -2588,7 +2601,9 @@ if (keyFile.has_group ("Wavelet")) { if (keyFile.has_key ("Wavelet", "Edgedetect")) {wavelet.edgedetect = keyFile.get_integer ("Wavelet", "Edgedetect"); if (pedited) pedited->wavelet.edgedetect = true; } if (keyFile.has_key ("Wavelet", "Edgedetectthr")) {wavelet.edgedetectthr = keyFile.get_integer ("Wavelet", "Edgedetectthr"); if (pedited) pedited->wavelet.edgedetectthr = true; } if (keyFile.has_key ("Wavelet", "EdgedetectthrHi")) {wavelet.edgedetectthr2 = keyFile.get_integer ("Wavelet", "EdgedetectthrHi"); if (pedited) pedited->wavelet.edgedetectthr2 = true; } - if (keyFile.has_key ("Wavelet", "ThresholdChroma")) {wavelet.chroma = keyFile.get_integer ("Wavelet", "ThresholdChroma"); if (pedited) pedited->wavelet.chroma = true; } + if (keyFile.has_key ("Wavelet", "Edgesensi")) {wavelet.edgesensi = keyFile.get_integer ("Wavelet", "Edgesensi"); if (pedited) pedited->wavelet.edgesensi = true; } + if (keyFile.has_key ("Wavelet", "Edgeampli")) {wavelet.edgeampli = keyFile.get_integer ("Wavelet", "Edgeampli"); if (pedited) pedited->wavelet.edgeampli = true; } + if (keyFile.has_key ("Wavelet", "ThresholdChroma")) {wavelet.chroma = keyFile.get_integer ("Wavelet", "ThresholdChroma"); if (pedited) pedited->wavelet.chroma = true; } if (keyFile.has_key ("Wavelet", "ChromaLink")) {wavelet.chro = keyFile.get_integer ("Wavelet", "ChromaLink"); if (pedited) pedited->wavelet.chro = true; } if (keyFile.has_key ("Wavelet", "Contrast")) {wavelet.contrast = keyFile.get_integer ("Wavelet", "Contrast"); if (pedited) pedited->wavelet.contrast = true; } if (keyFile.has_key ("Wavelet", "Edgrad")) {wavelet.edgrad = keyFile.get_integer ("Wavelet", "Edgrad"); if (pedited) pedited->wavelet.edgrad = true; } @@ -2645,6 +2660,12 @@ if (keyFile.has_group ("Wavelet")) { wavelet.level2noise.setValues(thresh.data()[0], thresh.data()[1]); if (pedited) pedited->wavelet.level2noise = true; } + if (keyFile.has_key ("Wavelet", "Level3noise")) { + Glib::ArrayHandle thresh = keyFile.get_double_list ("Wavelet", "Level3noise"); + wavelet.level3noise.setValues(thresh.data()[0], thresh.data()[1]); + if (pedited) pedited->wavelet.level3noise = true; + } + if (keyFile.has_key ("Wavelet", "Pastlev")) { Glib::ArrayHandle thresh = keyFile.get_integer_list ("Wavelet", "Pastlev"); @@ -3234,6 +3255,7 @@ bool ProcParams::operator== (const ProcParams& other) { && wavelet.CHmethod == other.wavelet.CHmethod && wavelet.CHSLmethod == other.wavelet.CHSLmethod && wavelet.EDmethod == other.wavelet.EDmethod + && wavelet.NPmethod == other.wavelet.NPmethod && wavelet.BAmethod == other.wavelet.BAmethod && wavelet.TMmethod == other.wavelet.TMmethod && wavelet.HSmethod == other.wavelet.HSmethod @@ -3274,6 +3296,8 @@ bool ProcParams::operator== (const ProcParams& other) { && wavelet.edgedetect == other.wavelet.edgedetect && wavelet.edgedetectthr == other.wavelet.edgedetectthr && wavelet.edgedetectthr2 == other.wavelet.edgedetectthr2 + && wavelet.edgesensi == other.wavelet.edgesensi + && wavelet.edgeampli == other.wavelet.edgeampli && wavelet.hueskin == other.wavelet.hueskin && wavelet.hueskin2 == other.wavelet.hueskin2 && wavelet.hllev == other.wavelet.hllev @@ -3282,6 +3306,7 @@ bool ProcParams::operator== (const ProcParams& other) { && wavelet.level0noise == other.wavelet.level0noise && wavelet.level1noise == other.wavelet.level1noise && wavelet.level2noise == other.wavelet.level2noise + && wavelet.level3noise == other.wavelet.level3noise && wavelet.pastlev == other.wavelet.pastlev && wavelet.satlev == other.wavelet.satlev && wavelet.opacityCurveRG == other.wavelet.opacityCurveRG diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 0de07d9f9..fdf41ccb3 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -909,6 +909,7 @@ class WaveletParams { Glib::ustring Medgreinf; Glib::ustring CHSLmethod; Glib::ustring EDmethod; + Glib::ustring NPmethod; Glib::ustring BAmethod; Glib::ustring TMmethod; Glib::ustring Dirmethod; @@ -928,6 +929,8 @@ class WaveletParams { int edgedetect; int edgedetectthr; int edgedetectthr2; + int edgesensi; + int edgeampli; int contrast; int edgrad; int edgval; @@ -945,6 +948,7 @@ class WaveletParams { Threshold level0noise; Threshold level1noise; Threshold level2noise; + Threshold level3noise; WaveletParams (); diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 7d0dc5603..01ddbe86b 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -423,7 +423,11 @@ DIRPYREQUALIZER, // EvWavenaedge DIRPYREQUALIZER, // EvWavenares DIRPYREQUALIZER, // EvWavenafin DIRPYREQUALIZER, // EvWavenatoning -DIRPYREQUALIZER // EvWavenanoise +DIRPYREQUALIZER, // EvWavenanoise +DIRPYREQUALIZER, // EvWavedgesensi +DIRPYREQUALIZER, // EvWavedgeampli +DIRPYREQUALIZER, //EvWavlev3nois +DIRPYREQUALIZER //EvWavNPmet }; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index c5d99bb97..0ebadd3c9 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -379,6 +379,7 @@ void ParamsEdited::set (bool v) { wavelet.CHmethod = v; wavelet.CHSLmethod = v; wavelet.EDmethod = v; + wavelet.NPmethod = v; wavelet.BAmethod = v; wavelet.TMmethod = v; wavelet.HSmethod = v; @@ -396,6 +397,8 @@ void ParamsEdited::set (bool v) { wavelet.edgedetect = v; wavelet.edgedetectthr = v; wavelet.edgedetectthr2 = v; + wavelet.edgesensi = v; + wavelet.edgeampli = v; wavelet.chroma = v; wavelet.chro = v; wavelet.contrast = v; @@ -413,6 +416,7 @@ void ParamsEdited::set (bool v) { wavelet.level0noise = v; wavelet.level1noise = v; wavelet.level2noise = v; + wavelet.level3noise = v; wavelet.ccwcurve = v; wavelet.opacityCurveRG = v; wavelet.opacityCurveBY = v; @@ -824,6 +828,7 @@ void ParamsEdited::initFrom (const std::vector wavelet.CHmethod = wavelet.CHmethod && p.wavelet.CHmethod == other.wavelet.CHmethod; wavelet.CHSLmethod = wavelet.CHSLmethod && p.wavelet.CHSLmethod == other.wavelet.CHSLmethod; wavelet.EDmethod = wavelet.EDmethod && p.wavelet.EDmethod == other.wavelet.EDmethod; + wavelet.NPmethod = wavelet.NPmethod && p.wavelet.NPmethod == other.wavelet.NPmethod; wavelet.BAmethod = wavelet.BAmethod && p.wavelet.BAmethod == other.wavelet.BAmethod; wavelet.TMmethod = wavelet.TMmethod && p.wavelet.TMmethod == other.wavelet.TMmethod; wavelet.HSmethod = wavelet.HSmethod && p.wavelet.HSmethod == other.wavelet.HSmethod; @@ -840,6 +845,8 @@ void ParamsEdited::initFrom (const std::vector wavelet.edgedetect = wavelet.edgedetect && p.wavelet.edgedetect == other.wavelet.edgedetect; wavelet.edgedetectthr = wavelet.edgedetectthr && p.wavelet.edgedetectthr == other.wavelet.edgedetectthr; wavelet.edgedetectthr2 = wavelet.edgedetectthr2 && p.wavelet.edgedetectthr2 == other.wavelet.edgedetectthr2; + wavelet.edgesensi = wavelet.edgesensi && p.wavelet.edgesensi == other.wavelet.edgesensi; + wavelet.edgeampli = wavelet.edgeampli && p.wavelet.edgeampli == other.wavelet.edgeampli; wavelet.thres = wavelet.thres && p.wavelet.thres == other.wavelet.thres; wavelet.chroma = wavelet.chroma && p.wavelet.chroma == other.wavelet.chroma; wavelet.chro = wavelet.chro && p.wavelet.chro == other.wavelet.chro; @@ -857,6 +864,7 @@ void ParamsEdited::initFrom (const std::vector 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; + wavelet.level3noise = wavelet.level3noise && p.wavelet.level3noise == other.wavelet.level3noise; 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; @@ -1271,6 +1279,7 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten if (wavelet.CHmethod) toEdit.wavelet.CHmethod = mods.wavelet.CHmethod; if (wavelet.CHSLmethod) toEdit.wavelet.CHSLmethod = mods.wavelet.CHSLmethod; if (wavelet.EDmethod) toEdit.wavelet.EDmethod = mods.wavelet.EDmethod; + if (wavelet.NPmethod) toEdit.wavelet.NPmethod = mods.wavelet.NPmethod; if (wavelet.BAmethod) toEdit.wavelet.BAmethod = mods.wavelet.BAmethod; if (wavelet.TMmethod) toEdit.wavelet.TMmethod = mods.wavelet.TMmethod; if (wavelet.HSmethod) toEdit.wavelet.HSmethod = mods.wavelet.HSmethod; @@ -1286,6 +1295,7 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten if (wavelet.level0noise) toEdit.wavelet.level0noise = mods.wavelet.level0noise; if (wavelet.level1noise) toEdit.wavelet.level1noise = mods.wavelet.level1noise; if (wavelet.level2noise) toEdit.wavelet.level2noise = mods.wavelet.level2noise; + if (wavelet.level3noise) toEdit.wavelet.level3noise = mods.wavelet.level3noise; if (wavelet.pastlev) toEdit.wavelet.pastlev = mods.wavelet.pastlev; if (wavelet.satlev) toEdit.wavelet.satlev = mods.wavelet.satlev; if (wavelet.ccwcurve) toEdit.wavelet.ccwcurve = mods.wavelet.ccwcurve; @@ -1314,6 +1324,8 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten if (wavelet.skinprotect)toEdit.wavelet.skinprotect= dontforceSet && options.baBehav[ADDSET_WA_SKINPROTECT] ? toEdit.wavelet.skinprotect + mods.wavelet.skinprotect : mods.wavelet.skinprotect; if (wavelet.hueskin) toEdit.wavelet.hueskin = mods.wavelet.hueskin; if (wavelet.hueskin2) toEdit.wavelet.hueskin2 = mods.wavelet.hueskin2; + if (wavelet.edgesensi) toEdit.wavelet.edgesensi = mods.wavelet.edgesensi; + if (wavelet.edgeampli) toEdit.wavelet.edgeampli = mods.wavelet.edgeampli; if (wavelet.resconH)toEdit.wavelet.resconH= dontforceSet && options.baBehav[ADDSET_WA_RESCONH] ? toEdit.wavelet.resconH + mods.wavelet.resconH : mods.wavelet.resconH; if (wavelet.reschro)toEdit.wavelet.reschro= dontforceSet && options.baBehav[ADDSET_WA_RESCHRO] ? toEdit.wavelet.reschro + mods.wavelet.reschro : mods.wavelet.reschro; if (wavelet.tmrs)toEdit.wavelet.tmrs= dontforceSet && options.baBehav[ADDSET_WA_TMRS] ? toEdit.wavelet.tmrs + mods.wavelet.tmrs : mods.wavelet.tmrs; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 9ce247f74..992de66e8 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -498,6 +498,7 @@ class WaveletParamsEdited { bool CHSLmethod; bool EDmethod; bool BAmethod; + bool NPmethod; bool TMmethod; bool HSmethod; bool CLmethod; @@ -518,6 +519,8 @@ class WaveletParamsEdited { bool edgedetect; bool edgedetectthr; bool edgedetectthr2; + bool edgesensi; + bool edgeampli; bool chro; bool chroma; bool contrast; @@ -535,6 +538,7 @@ class WaveletParamsEdited { bool level0noise; bool level1noise; bool level2noise; + bool level3noise; bool ccwcurve; bool opacityCurveBY; bool opacityCurveRG; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 33e92c23e..bb8e26999 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -96,7 +96,7 @@ Wavelet::Wavelet () : FoldableToolPanel(this, "wavelet", M("TP_WAVELET_LABEL"), strength = Gtk::manage (new Adjuster (M("TP_WAVELET_STRENGTH"), 0, 100, 1, 100)); strength->setAdjusterListener (this); - thres = Gtk::manage (new Adjuster (M("TP_WAVELET_LEVELS"), 3, 9, 1, 7)); + thres = Gtk::manage (new Adjuster (M("TP_WAVELET_LEVELS"), 4, 9, 1, 7));//3 thres->set_tooltip_text (M("TP_WAVELET_LEVELS_TOOLTIP")); thres->setAdjusterListener (this); @@ -392,9 +392,14 @@ Wavelet::Wavelet () : FoldableToolPanel(this, "wavelet", M("TP_WAVELET_LABEL"), level2noise->setAdjusterListener (this); level2noise->setUpdatePolicy(RTUP_DYNAMIC); + 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., NULL, false)); + level3noise->setAdjusterListener (this); + level3noise->setUpdatePolicy(RTUP_DYNAMIC); + noiseBox->pack_start( *level0noise, Gtk::PACK_SHRINK, 0); noiseBox->pack_start( *level1noise, Gtk::PACK_SHRINK, 0); noiseBox->pack_start( *level2noise, Gtk::PACK_SHRINK, 0); + noiseBox->pack_start( *level3noise, Gtk::PACK_SHRINK, 0); // Edge Sharpness Gtk::VBox * edgBox = Gtk::manage (new Gtk::VBox()); @@ -472,6 +477,7 @@ Wavelet::Wavelet () : FoldableToolPanel(this, "wavelet", M("TP_WAVELET_LABEL"), medianlev = Gtk::manage (new Gtk::CheckButton (M("TP_WAVELET_MEDILEV"))); medianlev->set_active (true); medianlevConn = medianlev->signal_toggled().connect( sigc::mem_fun(*this, &Wavelet::medianlevToggled) ); + medianlev->set_tooltip_text (M("TP_WAVELET_MEDILEV_TOOLTIP")); Gtk::HSeparator *separatored1 = Gtk::manage (new Gtk::HSeparator()); edgBox->pack_start(*separatored1, Gtk::PACK_SHRINK, 2); @@ -481,7 +487,7 @@ Wavelet::Wavelet () : FoldableToolPanel(this, "wavelet", M("TP_WAVELET_LABEL"), edgBox->pack_start (*eddebox); edgBox->pack_start(*medianlev); - edgedetect = Gtk::manage (new Adjuster (M("TP_WAVELET_EDGEDETECT"), 0, 100, 1, 80)); + edgedetect = Gtk::manage (new Adjuster (M("TP_WAVELET_EDGEDETECT"), 0, 100, 1, 90)); edgedetect->setAdjusterListener (this); edgedetect->set_tooltip_text (M("TP_WAVELET_EDGEDETECT_TOOLTIP")); edgBox->pack_start(*edgedetect); @@ -496,11 +502,49 @@ Wavelet::Wavelet () : FoldableToolPanel(this, "wavelet", M("TP_WAVELET_LABEL"), edgedetectthr2->setAdjusterListener (this); edgBox->pack_start(*edgedetectthr2); + + separatoredge = Gtk::manage (new Gtk::HSeparator()); + + edgBox->pack_start(*separatoredge, Gtk::PACK_SHRINK, 2); + lipst = Gtk::manage (new Gtk::CheckButton (M("TP_WAVELET_LIPST"))); lipst->set_active (true); lipstConn = lipst->signal_toggled().connect( sigc::mem_fun(*this, &Wavelet::lipstToggled) ); - lipst->set_tooltip_text (M("TP_WAVELET_LIPST_TOOLTIP")); +// lipst->set_tooltip_text (M("TP_WAVELET_LIPST_TOOLTIP")); + edgBox->pack_start(*lipst); + + edgesensi = Gtk::manage (new Adjuster (M("TP_WAVELET_EDGESENSI"), 0, 100, 1, 60)); + edgesensi->setAdjusterListener (this); + edgBox->pack_start(*edgesensi); + + edgeampli = Gtk::manage (new Adjuster (M("TP_WAVELET_EDGEAMPLI"), 0, 100, 1, 10)); + edgeampli->setAdjusterListener (this); + edgBox->pack_start(*edgeampli); + + + Gtk::VBox * ctboxES = Gtk::manage (new Gtk::VBox()); + + ctboxES->set_border_width(4); + ctboxES->set_spacing(2); + + ctboxNP = Gtk::manage (new Gtk::HBox()); + + labmNP = Gtk::manage (new Gtk::Label (M("TP_WAVELET_NPTYPE")+":")); + ctboxNP->pack_start (*labmNP, Gtk::PACK_SHRINK, 1); + + NPmethod = Gtk::manage (new MyComboBoxText ()); + NPmethod->append_text (M("TP_WAVELET_NPNONE")); + NPmethod->append_text (M("TP_WAVELET_NPLOW")); + NPmethod->append_text (M("TP_WAVELET_NPHIGH")); + NPmethodconn = NPmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::NPmethodChanged) ); + NPmethod->set_tooltip_text (M("TP_WAVELET_NPTYPE_TOOLTIP")); + + ctboxNP->pack_start(*NPmethod); + ctboxES->pack_start(*ctboxNP); + + edgBox->pack_start(*ctboxES); + // Gamut Gtk::VBox * conBox = Gtk::manage (new Gtk::VBox()); conBox->set_border_width(4); @@ -911,6 +955,7 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) { CHmethodconn.block(true); CHSLmethodconn.block(true); EDmethodconn.block(true); + NPmethodconn.block(true); BAmethodconn.block(true); TMmethodconn.block(true); HSmethodconn.block(true); @@ -964,6 +1009,13 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) { else if (pp->wavelet.EDmethod=="CU") EDmethod->set_active (1); + if (pp->wavelet.NPmethod=="none") + NPmethod->set_active (0); + else if (pp->wavelet.NPmethod=="low") + NPmethod->set_active (1); + else if (pp->wavelet.NPmethod=="high") + NPmethod->set_active (2); + //BAmethod->set_active (0); if (pp->wavelet.BAmethod=="none") BAmethod->set_active (0); @@ -1112,6 +1164,8 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) { edgedetect->setValue(pp->wavelet.edgedetect); edgedetectthr->setValue(pp->wavelet.edgedetectthr); edgedetectthr2->setValue(pp->wavelet.edgedetectthr2); + edgesensi->setValue(pp->wavelet.edgesensi); + edgeampli->setValue(pp->wavelet.edgeampli); hllev->setValue(pp->wavelet.hllev); bllev->setValue(pp->wavelet.bllev); pastlev->setValue(pp->wavelet.pastlev); @@ -1128,6 +1182,7 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) { level0noise->setValue(pp->wavelet.level0noise); level1noise->setValue(pp->wavelet.level1noise); level2noise->setValue(pp->wavelet.level2noise); + level3noise->setValue(pp->wavelet.level3noise); strength->setValue(pp->wavelet.strength); balance->setValue(pp->wavelet.balance); iter->setValue(pp->wavelet.iter); @@ -1164,6 +1219,8 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) { CHSLmethod->set_active_text(M("GENERAL_UNCHANGED")); if (!pedited->wavelet.EDmethod) EDmethod->set_active_text(M("GENERAL_UNCHANGED")); + if (!pedited->wavelet.NPmethod) + NPmethod->set_active_text(M("GENERAL_UNCHANGED")); if (!pedited->wavelet.BAmethod) BAmethod->set_active_text(M("GENERAL_UNCHANGED")); if (!pedited->wavelet.TMmethod) @@ -1207,6 +1264,8 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) { edgedetect->setEditedState (pedited->wavelet.edgedetect ? Edited : UnEdited); edgedetectthr->setEditedState (pedited->wavelet.edgedetectthr ? Edited : UnEdited); edgedetectthr2->setEditedState (pedited->wavelet.edgedetectthr2 ? Edited : UnEdited); + edgesensi->setEditedState (pedited->wavelet.edgesensi ? Edited : UnEdited); + edgeampli->setEditedState (pedited->wavelet.edgeampli ? Edited : UnEdited); chroma->setEditedState (pedited->wavelet.chroma ? Edited : UnEdited); chro->setEditedState (pedited->wavelet.chro ? Edited : UnEdited); @@ -1240,6 +1299,7 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) { level0noise->setEditedState (pedited->wavelet.level0noise ? Edited : UnEdited); level1noise->setEditedState (pedited->wavelet.level1noise ? Edited : UnEdited); level2noise->setEditedState (pedited->wavelet.level2noise ? Edited : UnEdited); + level3noise->setEditedState (pedited->wavelet.level3noise ? Edited : UnEdited); for(int i = 0; i < 9; i++) { correction[i]->setEditedState (pedited->wavelet.c[i] ? Edited : UnEdited); @@ -1272,10 +1332,12 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) { //MedgreinfUpdateUI(); //CHSLmethodUpdateUI(); EDmethodUpdateUI(); + NPmethodUpdateUI(); BAmethodUpdateUI(); TMmethodUpdateUI(); //BackmethodUpdateUI(); CLmethodUpdateUI(); + lipstUpdateUI (); //TilesmethodUpdateUI(); //daubcoeffmethodUpdateUI(); //DirmethodUpdateUI(); @@ -1300,6 +1362,7 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) { CHmethodconn.block(false); CHSLmethodconn.block(false); EDmethodconn.block(false); + NPmethodconn.block(false); BAmethodconn.block(false); TMmethodconn.block(false); HSmethodconn.block(false); @@ -1368,12 +1431,15 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) { pp->wavelet.edgedetect = edgedetect->getValue(); pp->wavelet.edgedetectthr = edgedetectthr->getValue(); pp->wavelet.edgedetectthr2 = edgedetectthr2->getValue(); + pp->wavelet.edgesensi = edgesensi->getValue(); + pp->wavelet.edgeampli = edgeampli->getValue(); pp->wavelet.hllev = hllev->getValue (); pp->wavelet.bllev = bllev->getValue (); pp->wavelet.edgcont = edgcont->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.opacityCurveRG = opacityShapeRG->getCurve (); pp->wavelet.opacityCurveBY = opacityShapeBY->getCurve (); @@ -1426,6 +1492,7 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) { pedited->wavelet.CHmethod = CHmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.CHSLmethod = CHSLmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.EDmethod = EDmethod->get_active_text() != M("GENERAL_UNCHANGED"); + pedited->wavelet.NPmethod = NPmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.BAmethod = BAmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.TMmethod = TMmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.HSmethod = HSmethod->get_active_text() != M("GENERAL_UNCHANGED"); @@ -1444,6 +1511,8 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) { pedited->wavelet.edgedetect = edgedetect->getEditedState(); pedited->wavelet.edgedetectthr = edgedetectthr->getEditedState(); pedited->wavelet.edgedetectthr2 = edgedetectthr2->getEditedState(); + pedited->wavelet.edgesensi = edgesensi->getEditedState(); + pedited->wavelet.edgeampli = edgeampli->getEditedState(); pedited->wavelet.chroma = chroma->getEditedState(); pedited->wavelet.chro = chro->getEditedState(); pedited->wavelet.contrast = contrast->getEditedState(); @@ -1460,6 +1529,7 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) { pedited->wavelet.level0noise = level0noise->getEditedState (); pedited->wavelet.level1noise = level1noise->getEditedState (); pedited->wavelet.level2noise = level2noise->getEditedState (); + pedited->wavelet.level3noise = level3noise->getEditedState (); pedited->wavelet.opacityCurveRG = !opacityShapeRG->isUnChanged (); pedited->wavelet.opacityCurveBY = !opacityShapeBY->isUnChanged (); pedited->wavelet.opacityCurveW = !opacityShape->isUnChanged (); @@ -1516,6 +1586,13 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) { pp->wavelet.EDmethod = "SL"; else if (EDmethod->get_active_row_number()==1) pp->wavelet.EDmethod = "CU"; + + if (NPmethod->get_active_row_number()==0) + pp->wavelet.NPmethod = "none"; + else if (NPmethod->get_active_row_number()==1) + pp->wavelet.NPmethod = "low"; + else if (NPmethod->get_active_row_number()==2) + pp->wavelet.NPmethod = "high"; if (BAmethod->get_active_row_number()==0) pp->wavelet.BAmethod = "none"; @@ -1630,6 +1707,8 @@ void Wavelet::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi edgedetect->setDefault (defParams->wavelet.edgedetect); edgedetectthr->setDefault (defParams->wavelet.edgedetectthr); edgedetectthr2->setDefault (defParams->wavelet.edgedetectthr2); + edgesensi->setDefault (defParams->wavelet.edgesensi); + edgeampli->setDefault (defParams->wavelet.edgeampli); chroma->setDefault (defParams->wavelet.chroma); chro->setDefault (defParams->wavelet.chro); contrast->setDefault (defParams->wavelet.contrast); @@ -1648,6 +1727,7 @@ void Wavelet::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi level0noise->setDefault (defParams->wavelet.level0noise); level1noise->setDefault (defParams->wavelet.level1noise); level2noise->setDefault (defParams->wavelet.level2noise); + level3noise->setDefault (defParams->wavelet.level3noise); greenlow->setDefault (defParams->wavelet.greenlow); bluelow->setDefault (defParams->wavelet.bluelow); @@ -1677,6 +1757,8 @@ void Wavelet::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi edgedetect->setDefaultEditedState(pedited->wavelet.edgedetect ? Edited : UnEdited); edgedetectthr->setDefaultEditedState(pedited->wavelet.edgedetectthr ? Edited : UnEdited); edgedetectthr2->setDefaultEditedState(pedited->wavelet.edgedetectthr2 ? Edited : UnEdited); + edgesensi->setDefaultEditedState(pedited->wavelet.edgesensi ? Edited : UnEdited); + edgeampli->setDefaultEditedState(pedited->wavelet.edgeampli ? Edited : UnEdited); chroma->setDefaultEditedState(pedited->wavelet.chroma ? Edited : UnEdited); chro->setDefaultEditedState(pedited->wavelet.chro ? Edited : UnEdited); contrast->setDefaultEditedState(pedited->wavelet.contrast ? Edited : UnEdited); @@ -1699,6 +1781,7 @@ void Wavelet::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi level0noise->setDefaultEditedState(pedited->wavelet.level0noise ? Edited : UnEdited); level1noise->setDefaultEditedState(pedited->wavelet.level1noise ? Edited : UnEdited); level2noise->setDefaultEditedState(pedited->wavelet.level2noise ? Edited : UnEdited); + level3noise->setDefaultEditedState(pedited->wavelet.level3noise ? Edited : UnEdited); for (int i = 0; i < 9; i++) { correction[i]->setDefaultEditedState(pedited->wavelet.c[i] ? Edited : UnEdited); @@ -1721,6 +1804,8 @@ void Wavelet::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi edgedetect->setDefaultEditedState(Irrelevant); edgedetectthr->setDefaultEditedState(Irrelevant); edgedetectthr2->setDefaultEditedState(Irrelevant); + edgesensi->setDefaultEditedState(Irrelevant); + edgeampli->setDefaultEditedState(Irrelevant); chroma->setDefaultEditedState(Irrelevant); chro->setDefaultEditedState(Irrelevant); contrast->setDefaultEditedState(Irrelevant); @@ -1738,6 +1823,7 @@ void Wavelet::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi level0noise->setDefaultEditedState (Irrelevant); level1noise->setDefaultEditedState (Irrelevant); level2noise->setDefaultEditedState (Irrelevant); + level3noise->setDefaultEditedState (Irrelevant); pastlev->setDefaultEditedState (Irrelevant); satlev->setDefaultEditedState (Irrelevant); strength->setDefaultEditedState (Irrelevant); @@ -1764,6 +1850,10 @@ void Wavelet::adjusterChanged (ThresholdAdjuster* a, double newBottom, double ne listener->panelChanged (EvWavlev2nois, Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_NOIS")+": %1"+"\n"+M("TP_WAVELET_STREN")+": %2"), int(newTop), int(newBottom))); } + else if(a==level3noise) { + listener->panelChanged (EvWavlev3nois, + Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_NOIS")+": %1"+"\n"+M("TP_WAVELET_STREN")+": %2"), int(newTop), int(newBottom))); + } } } @@ -1913,6 +2003,20 @@ void Wavelet::EDmethodChanged() { listener->panelChanged (EvWavEDmet, EDmethod->get_active_text ()); } +void Wavelet::NPmethodUpdateUI() { + if (!batchMode) { + + } +} +void Wavelet::NPmethodChanged() { + NPmethodUpdateUI(); + if (listener && (multiImage||getEnabled()) ) { + listener->panelChanged (EvWavNPmet, NPmethod->get_active_text ()); + } +} + + + void Wavelet::BAmethodUpdateUI() { if (!batchMode) { if(BAmethod->get_active_row_number()==0 ) {//none @@ -2082,6 +2186,7 @@ void Wavelet::setBatchMode (bool batchMode) { Medgreinf->append_text (M("GENERAL_UNCHANGED")); CHSLmethod->append_text (M("GENERAL_UNCHANGED")); EDmethod->append_text (M("GENERAL_UNCHANGED")); + NPmethod->append_text (M("GENERAL_UNCHANGED")); BAmethod->append_text (M("GENERAL_UNCHANGED")); TMmethod->append_text (M("GENERAL_UNCHANGED")); HSmethod->append_text (M("GENERAL_UNCHANGED")); @@ -2106,6 +2211,8 @@ void Wavelet::setBatchMode (bool batchMode) { edgedetect->showEditedCB (); edgedetectthr->showEditedCB (); edgedetectthr2->showEditedCB (); + edgesensi->showEditedCB (); + edgeampli->showEditedCB (); chroma->showEditedCB (); chro->showEditedCB (); contrast->showEditedCB (); @@ -2128,6 +2235,7 @@ void Wavelet::setBatchMode (bool batchMode) { level0noise->showEditedCB (); level1noise->showEditedCB (); level2noise->showEditedCB (); + level3noise->showEditedCB (); ToolPanel::setBatchMode (batchMode); @@ -2201,6 +2309,10 @@ void Wavelet::adjusterChanged (Adjuster* a, double newval) { listener->panelChanged (EvWavedgedetectthr, edgedetectthr->getTextValue()); else if (a == edgedetectthr2 ) listener->panelChanged (EvWavedgedetectthr2, edgedetectthr2->getTextValue()); + else if (a == edgesensi ) + listener->panelChanged (EvWavedgesensi, edgesensi->getTextValue()); + else if (a == edgeampli ) + listener->panelChanged (EvWavedgeampli, edgeampli->getTextValue()); else if (a == edgrad ) listener->panelChanged (EvWavedgrad, edgrad->getTextValue()); else if (a == edgval ) @@ -2321,17 +2433,30 @@ void Wavelet::medianlevUpdateUI () { if (!batchMode) { if (medianlev->get_active ()){ edgedetect->show(); - //lipst->show(); + lipst->show(); + separatoredge->show(); + edgedetectthr->show(); edgedetectthr2->show(); - //if (lipst->get_active ()) edgedetectthr2->show(); - //else edgedetectthr2->hide(); + // edgesensi->show(); + // edgeampli->show(); + // NPmethod->show(); + // labmNP->show(); + if (lipst->get_active ()) {edgesensi->show();edgeampli->show();NPmethod->show(); labmNP->show();} + + else {edgesensi->hide();edgeampli->hide();NPmethod->hide(); labmNP->hide();} } else { edgedetect->hide(); - //lipst->hide(); + lipst->hide(); edgedetectthr->hide(); edgedetectthr2->hide(); + edgesensi->hide(); + edgeampli->hide(); + separatoredge->hide(); + NPmethod->hide(); + labmNP->hide(); + } } } @@ -2430,16 +2555,25 @@ void Wavelet::cbenabToggled () { } -/* + void Wavelet::lipstUpdateUI () { if (!batchMode) { - if (lipst->get_active ()) - edgedetectthr2->show(); - else - edgedetectthr2->hide(); + if (lipst->get_active ()) { + NPmethod->show(); + edgesensi->show(); + edgeampli->show(); + labmNP->show(); + } + else { + NPmethod->hide(); + edgesensi->hide(); + edgeampli->hide(); + labmNP->hide(); + + } } } -*/ + void Wavelet::lipstToggled () { @@ -2455,7 +2589,7 @@ void Wavelet::lipstToggled () { lastlipst = lipst->get_active (); } - //lipstUpdateUI(); + lipstUpdateUI(); if (listener && (multiImage || getEnabled ())) { if (lipst->get_inconsistent()) @@ -2607,7 +2741,6 @@ void Wavelet::setAdjusterBehavior (bool multiplieradd, bool thresholdadd, bool t void Wavelet::neutralPressed () { - for (int i = 0; i < 9; i++) { correction[i]->setValue(0); adjusterChanged(correction[i], 0); diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index f96f4b1fd..eee427d18 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -46,6 +46,7 @@ protected: Gtk::HSeparator* separator3; Gtk::HSeparator* separatorCB; Gtk::HSeparator* separatorNeutral; + Gtk::HSeparator* separatoredge; CurveEditorGroup* opaCurveEditorG; FlatCurveEditor* opacityShapeRG; @@ -114,12 +115,15 @@ protected: ThresholdAdjuster* level0noise; ThresholdAdjuster* level1noise; ThresholdAdjuster* level2noise; + ThresholdAdjuster* level3noise; Adjuster* threshold; Adjuster* threshold2; Adjuster* edgedetect; Adjuster* edgedetectthr; Adjuster* edgedetectthr2; + Adjuster* edgesensi; + Adjuster* edgeampli; MyComboBoxText* Lmethod; sigc::connection Lmethodconn; MyComboBoxText* CHmethod; @@ -130,6 +134,8 @@ protected: sigc::connection EDmethodconn; MyComboBoxText* BAmethod; sigc::connection BAmethodconn; + MyComboBoxText* NPmethod; + sigc::connection NPmethodconn; MyComboBoxText* TMmethod; sigc::connection TMmethodconn; MyComboBoxText* HSmethod; @@ -173,6 +179,7 @@ protected: Gtk::Label* labmED; Gtk::Label* labmTM; Gtk::Label* labmBA; + Gtk::Label* labmNP; Gtk::Label* labmedgr; Gtk::Label* labmednois; MyExpander* expchroma; @@ -197,6 +204,7 @@ protected: Gtk::HBox* tilesizeHBox; Gtk::HBox* ctboxFI; + Gtk::HBox* ctboxNP; Gtk::HBox* ctboxch; Gtk::HBox* edbox; Gtk::HBox* ednoisbox; @@ -249,6 +257,7 @@ private: virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller); void BAmethodChanged (); + void NPmethodChanged (); void BackmethodChanged (); void CHSLmethodChanged (); void CHmethodChanged (); @@ -281,6 +290,7 @@ private: void CHmethodUpdateUI(); // void CHSLmethodChangedUI(); void EDmethodUpdateUI(); + void NPmethodUpdateUI(); void BAmethodUpdateUI(); void TMmethodUpdateUI(); // void BackmethodUpdateUI(); @@ -294,7 +304,7 @@ private: void enabledUpdateUI (); void medianlevUpdateUI (); void cbenabUpdateUI (); -// void lipstUpdateUI (); + void lipstUpdateUI (); void enableToggled(MyExpander *expander);