diff --git a/rtdata/languages/default b/rtdata/languages/default index 395c35b19..905d34c45 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1175,8 +1175,9 @@ TP_DIRPYRDENOISE_LM;Luminance only TP_DIRPYRDENOISE_LUMA;Luminance TP_DIRPYRDENOISE_MEDMETHOD;Median method TP_DIRPYRDENOISE_MEDTYPE;Median type -TP_DIRPYRDENOISE_MED;Median - Luminance only -TP_DIRPYRDENOISE_MED_TOOLTIP;- +TP_DIRPYRDENOISE_MED;Median +TP_DIRPYRDENOISE_MET_TOOLTIP;Median filtering type:\n3x3, 3x3 strong and 5x5 (RGB) or 3x3, 3x3 strong, 5x5, 5x5 strong or 7x7 (L only and Lab) in the treatment - Increases noise reduction. +TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising TP_DIRPYRDENOISE_METHOD;Method TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or Lab methods can be used.\n\nFor non-raw images the Lab method will be used, regardless of the selection. TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "Lab" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 4a339e366..83ecd459b 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -234,14 +234,14 @@ float media(float *elements, int N) const short int imheight=src->height, imwidth=src->width; - if (dnparams.luma==0 && dnparams.chroma==0 && dnparams.methodmed=="none" ) { + if (dnparams.luma==0 && dnparams.chroma==0 && !dnparams.median ) { //nothing to do; copy src to dst or do nothing in case src == dst if(src != dst) memcpy(dst->data,src->data,dst->width*dst->height*3*sizeof(float)); return; } - if (dnparams.luma!=0 || dnparams.chroma!=0 || dnparams.methodmed=="Lab" || dnparams.methodmed=="Lonly") { + if (dnparams.luma!=0 || dnparams.chroma!=0 || dnparams.methodmed=="Lab" || dnparams.methodmed=="Lonly" ) { perf=false; if(dnparams.dmethod=="RGB") perf=true;//RGB mode //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -589,7 +589,7 @@ float media(float *elements, int N) float realblue2 = interm_med + intermblue2; if (realblue2 < 0.f) realblue2=0.01f; float noisevarab_b = SQR(realblue); bool execwavelet=true; - if(noisevarL < 0.00007f && interm_med < 0.1f && (dnparams.methodmed=="Lab" || dnparams.methodmed=="Lonly")) execwavelet=false;//do not exec wavelet if sliders luminance and chroma are very small and median need + if(noisevarL < 0.00007f && interm_med < 0.1f && dnparams.median && (dnparams.methodmed=="Lab" || dnparams.methodmed=="Lonly")) execwavelet=false;//do not exec wavelet if sliders luminance and chroma are very small and median need //we considered user don't want wavelet if(execwavelet) {//gain time if user choose only median sliders L <=1 slider chrom master < 1 { // enclosing this code in a block frees about 120 MB before allocating 20 MB after this block (measured with D700 NEF) @@ -636,7 +636,8 @@ float media(float *elements, int N) else if(dnparams.methodmed=="Lab") metchoice=2; //median on Luminance Lab only - if(metchoice==1 || metchoice ==2) { + if( (metchoice==1 || metchoice==2) && dnparams.median) { + //printf("Lab et Lonly \n"); for(int iteration=1;iteration<=dnparams.passes;iteration++){ //printf("pas=%i\n",iteration); int wid=labdn->W; @@ -664,6 +665,9 @@ float media(float *elements, int N) methmedL = 4; borderL = 3; } + if (metchoice==1 || metchoice==2) + { /*printf("LONLY methmedL=%d\n", methmedL);*/ + if(methmedL < 2) { for (int i=1; iL[i][j] = tmL[i][j]; } } -//a - if(metchoice==2) { + } + if(metchoice==2) {/*printf(" AB methmedL=%d\n", methmedL);*/ if(methmedL < 2) { for (int i=1; iwidth, hei=dst->height; float** tm; tm = new float*[hei]; diff --git a/rtgui/dirpyrdenoise.cc b/rtgui/dirpyrdenoise.cc index 72c395128..615f3c3e2 100644 --- a/rtgui/dirpyrdenoise.cc +++ b/rtgui/dirpyrdenoise.cc @@ -102,7 +102,7 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this), lastenhance(false) { hsep2->show (); methodmed = Gtk::manage (new MyComboBoxText ()); - methodmed->append_text (M("TP_DIRPYRDENOISE_NONE")); + //methodmed->append_text (M("TP_DIRPYRDENOISE_NONE")); methodmed->append_text (M("TP_DIRPYRDENOISE_LM")); methodmed->append_text (M("TP_DIRPYRDENOISE_LABM")); methodmed->append_text (M("TP_DIRPYRDENOISE_RGBM")); @@ -151,6 +151,7 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this), lastenhance(false) { pack_start (*enhance); pack_start (*hsep2); + pack_start (*median); ctboxm->pack_start (*methodmed); ctbox->pack_start (*medmethod); @@ -160,7 +161,6 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this), lastenhance(false) { pack_start (*ctboxrgb); pack_start (*passes); -// pack_start (*median); // pack_start (*perform); enhanConn = enhance->signal_toggled().connect( sigc::mem_fun(*this, &DirPyrDenoise::enhanceChanged) ); @@ -184,14 +184,14 @@ void DirPyrDenoise::read (const ProcParams* pp, const ParamsEdited* pedited) { dmethod->set_active (1); methodmed->set_active (0); - if (pp->dirpyrDenoise.methodmed=="none") + // if (pp->dirpyrDenoise.methodmed=="none") + // methodmed->set_active (0); + if (pp->dirpyrDenoise.methodmed=="Lonly") methodmed->set_active (0); - else if (pp->dirpyrDenoise.methodmed=="Lonly") - methodmed->set_active (1); else if (pp->dirpyrDenoise.methodmed=="Lab") - methodmed->set_active (2); + methodmed->set_active (1); else if (pp->dirpyrDenoise.methodmed=="RGB") - methodmed->set_active (3); + methodmed->set_active (2); methodmedChanged(); medmethod->set_active (0); @@ -229,7 +229,7 @@ void DirPyrDenoise::read (const ProcParams* pp, const ParamsEdited* pedited) { if (!pedited->dirpyrDenoise.medmethod) medmethod->set_active (4); if (!pedited->dirpyrDenoise.methodmed) - methodmed->set_active (3); + methodmed->set_active (2); luma->setEditedState (pedited->dirpyrDenoise.luma ? Edited : UnEdited); Ldetail->setEditedState (pedited->dirpyrDenoise.Ldetail ? Edited : UnEdited); @@ -291,7 +291,7 @@ void DirPyrDenoise::write (ProcParams* pp, ParamsEdited* pedited) { pedited->dirpyrDenoise.dmethod = dmethod->get_active_row_number() != 2; pedited->dirpyrDenoise.medmethod = medmethod->get_active_row_number() != 4; pedited->dirpyrDenoise.rgbmethod = rgbmethod->get_active_row_number() != 2; - pedited->dirpyrDenoise.methodmed = methodmed->get_active_row_number() != 3; + pedited->dirpyrDenoise.methodmed = methodmed->get_active_row_number() != 2; pedited->dirpyrDenoise.luma = luma->getEditedState (); pedited->dirpyrDenoise.Ldetail = Ldetail->getEditedState (); pedited->dirpyrDenoise.chroma = chroma->getEditedState (); @@ -309,13 +309,13 @@ void DirPyrDenoise::write (ProcParams* pp, ParamsEdited* pedited) { else if (dmethod->get_active_row_number()==1) pp->dirpyrDenoise.dmethod = "Lab"; - if (methodmed->get_active_row_number()==0) - pp->dirpyrDenoise.methodmed = "none"; - else if (methodmed->get_active_row_number()==1) + // if (methodmed->get_active_row_number()==0) + // pp->dirpyrDenoise.methodmed = "none"; + if (methodmed->get_active_row_number()==0) pp->dirpyrDenoise.methodmed = "Lonly"; - else if (methodmed->get_active_row_number()==2) + else if (methodmed->get_active_row_number()==1) pp->dirpyrDenoise.methodmed = "Lab"; - else if (methodmed->get_active_row_number()==3) + else if (methodmed->get_active_row_number()==2) pp->dirpyrDenoise.methodmed = "RGB"; @@ -352,15 +352,15 @@ void DirPyrDenoise::dmethodChanged () { void DirPyrDenoise::medmethodChanged () { - if (listener && (multiImage||enabled->get_active()) ) { + if (listener && (multiImage||enabled->get_active()) && median->get_active() ) { listener->panelChanged (EvDPDNmedmet, medmethod->get_active_text ()); } } void DirPyrDenoise::rgbmethodChanged () { ctboxrgb->hide(); - if(methodmed->get_active_row_number()==3) ctboxrgb->show(); - if (listener && (multiImage||enabled->get_active()) ) { + if(methodmed->get_active_row_number()==2) ctboxrgb->show(); + if (listener && (multiImage||enabled->get_active()) && median->get_active()) { listener->panelChanged (EvDPDNrgbmet, rgbmethod->get_active_text ()); } } @@ -368,10 +368,10 @@ void DirPyrDenoise::rgbmethodChanged () { void DirPyrDenoise::methodmedChanged () { - if(methodmed->get_active_row_number()==3) {ctboxrgb->show();ctbox->hide();} + if(methodmed->get_active_row_number()==2) {ctboxrgb->show();ctbox->hide();} else {ctboxrgb->hide();ctbox->show();} - if (listener && (multiImage||enabled->get_active()) ) { + if (listener && (multiImage||enabled->get_active()) && median->get_active()) { listener->panelChanged (EvDPDNmetmed, methodmed->get_active_text ()); } } @@ -424,7 +424,7 @@ void DirPyrDenoise::adjusterChanged (Adjuster* a, double newval) { listener->panelChanged (EvDPDNbluechro, costr); else if (a==gamma) listener->panelChanged (EvDPDNGamma, costr); - else if (a==passes) + else if (a==passes && median->get_active()) listener->panelChanged (EvDPDNpasses, costr); } } @@ -492,9 +492,15 @@ void DirPyrDenoise::medianChanged () { if (listener) { if (median->get_active ()) - listener->panelChanged (EvDPDNmedian, M("GENERAL_ENABLED")); + { listener->panelChanged (EvDPDNmedian, M("GENERAL_ENABLED")); + // medmethodChanged ();rgbmethodChanged ();methodmedChanged (); + } else - listener->panelChanged (EvDPDNmedian, M("GENERAL_DISABLED")); + { listener->panelChanged (EvDPDNmedian, M("GENERAL_DISABLED")); + // medmethodChanged ();rgbmethodChanged ();methodmedChanged (); + } + + } }