Fixed - refreshing the preview in the Median NR module - issue2014 issue2423

This commit is contained in:
jdc 2014-07-24 21:23:27 +02:00
parent 1bb6a81db2
commit 5229b9142d
3 changed files with 43 additions and 31 deletions

View File

@ -1175,8 +1175,9 @@ TP_DIRPYRDENOISE_LM;Luminance only
TP_DIRPYRDENOISE_LUMA;Luminance TP_DIRPYRDENOISE_LUMA;Luminance
TP_DIRPYRDENOISE_MEDMETHOD;Median method TP_DIRPYRDENOISE_MEDMETHOD;Median method
TP_DIRPYRDENOISE_MEDTYPE;Median type TP_DIRPYRDENOISE_MEDTYPE;Median type
TP_DIRPYRDENOISE_MED;Median - Luminance only TP_DIRPYRDENOISE_MED;Median
TP_DIRPYRDENOISE_MED_TOOLTIP;- 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;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_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. 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.

View File

@ -234,14 +234,14 @@ float media(float *elements, int N)
const short int imheight=src->height, imwidth=src->width; 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 //nothing to do; copy src to dst or do nothing in case src == dst
if(src != dst) if(src != dst)
memcpy(dst->data,src->data,dst->width*dst->height*3*sizeof(float)); memcpy(dst->data,src->data,dst->width*dst->height*3*sizeof(float));
return; 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; perf=false;
if(dnparams.dmethod=="RGB") perf=true;//RGB mode 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 realblue2 = interm_med + intermblue2; if (realblue2 < 0.f) realblue2=0.01f;
float noisevarab_b = SQR(realblue); float noisevarab_b = SQR(realblue);
bool execwavelet=true; 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 //we considered user don't want wavelet
if(execwavelet) {//gain time if user choose only median sliders L <=1 slider chrom master < 1 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) { // 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; else if(dnparams.methodmed=="Lab") metchoice=2;
//median on Luminance Lab only //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++){ for(int iteration=1;iteration<=dnparams.passes;iteration++){
//printf("pas=%i\n",iteration); //printf("pas=%i\n",iteration);
int wid=labdn->W; int wid=labdn->W;
@ -664,6 +665,9 @@ float media(float *elements, int N)
methmedL = 4; methmedL = 4;
borderL = 3; borderL = 3;
} }
if (metchoice==1 || metchoice==2)
{ /*printf("LONLY methmedL=%d\n", methmedL);*/
if(methmedL < 2) { if(methmedL < 2) {
for (int i=1; i<hei-1; i++) { for (int i=1; i<hei-1; i++) {
float pp[9],results[5],temp; float pp[9],results[5],temp;
@ -734,8 +738,8 @@ float media(float *elements, int N)
labdn->L[i][j] = tmL[i][j]; labdn->L[i][j] = tmL[i][j];
} }
} }
//a }
if(metchoice==2) { if(metchoice==2) {/*printf(" AB methmedL=%d\n", methmedL);*/
if(methmedL < 2) { if(methmedL < 2) {
for (int i=1; i<hei-1; i++) { for (int i=1; i<hei-1; i++) {
float pp[9],temp; float pp[9],temp;
@ -1158,7 +1162,8 @@ float media(float *elements, int N)
//median 3x3 in complement on RGB //median 3x3 in complement on RGB
if(dnparams.methodmed=="RGB") { if(dnparams.methodmed=="RGB" && dnparams.median) {
//printf("RGB den\n");
int wid=dst->width, hei=dst->height; int wid=dst->width, hei=dst->height;
float** tm; float** tm;
tm = new float*[hei]; tm = new float*[hei];

View File

@ -102,7 +102,7 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this), lastenhance(false) {
hsep2->show (); hsep2->show ();
methodmed = Gtk::manage (new MyComboBoxText ()); 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_LM"));
methodmed->append_text (M("TP_DIRPYRDENOISE_LABM")); methodmed->append_text (M("TP_DIRPYRDENOISE_LABM"));
methodmed->append_text (M("TP_DIRPYRDENOISE_RGBM")); methodmed->append_text (M("TP_DIRPYRDENOISE_RGBM"));
@ -151,6 +151,7 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this), lastenhance(false) {
pack_start (*enhance); pack_start (*enhance);
pack_start (*hsep2); pack_start (*hsep2);
pack_start (*median);
ctboxm->pack_start (*methodmed); ctboxm->pack_start (*methodmed);
ctbox->pack_start (*medmethod); ctbox->pack_start (*medmethod);
@ -160,7 +161,6 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this), lastenhance(false) {
pack_start (*ctboxrgb); pack_start (*ctboxrgb);
pack_start (*passes); pack_start (*passes);
// pack_start (*median);
// pack_start (*perform); // pack_start (*perform);
enhanConn = enhance->signal_toggled().connect( sigc::mem_fun(*this, &DirPyrDenoise::enhanceChanged) ); 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); dmethod->set_active (1);
methodmed->set_active (0); 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); methodmed->set_active (0);
else if (pp->dirpyrDenoise.methodmed=="Lonly")
methodmed->set_active (1);
else if (pp->dirpyrDenoise.methodmed=="Lab") else if (pp->dirpyrDenoise.methodmed=="Lab")
methodmed->set_active (2); methodmed->set_active (1);
else if (pp->dirpyrDenoise.methodmed=="RGB") else if (pp->dirpyrDenoise.methodmed=="RGB")
methodmed->set_active (3); methodmed->set_active (2);
methodmedChanged(); methodmedChanged();
medmethod->set_active (0); medmethod->set_active (0);
@ -229,7 +229,7 @@ void DirPyrDenoise::read (const ProcParams* pp, const ParamsEdited* pedited) {
if (!pedited->dirpyrDenoise.medmethod) if (!pedited->dirpyrDenoise.medmethod)
medmethod->set_active (4); medmethod->set_active (4);
if (!pedited->dirpyrDenoise.methodmed) if (!pedited->dirpyrDenoise.methodmed)
methodmed->set_active (3); methodmed->set_active (2);
luma->setEditedState (pedited->dirpyrDenoise.luma ? Edited : UnEdited); luma->setEditedState (pedited->dirpyrDenoise.luma ? Edited : UnEdited);
Ldetail->setEditedState (pedited->dirpyrDenoise.Ldetail ? 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.dmethod = dmethod->get_active_row_number() != 2;
pedited->dirpyrDenoise.medmethod = medmethod->get_active_row_number() != 4; pedited->dirpyrDenoise.medmethod = medmethod->get_active_row_number() != 4;
pedited->dirpyrDenoise.rgbmethod = rgbmethod->get_active_row_number() != 2; 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.luma = luma->getEditedState ();
pedited->dirpyrDenoise.Ldetail = Ldetail->getEditedState (); pedited->dirpyrDenoise.Ldetail = Ldetail->getEditedState ();
pedited->dirpyrDenoise.chroma = chroma->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) else if (dmethod->get_active_row_number()==1)
pp->dirpyrDenoise.dmethod = "Lab"; pp->dirpyrDenoise.dmethod = "Lab";
if (methodmed->get_active_row_number()==0) // if (methodmed->get_active_row_number()==0)
pp->dirpyrDenoise.methodmed = "none"; // pp->dirpyrDenoise.methodmed = "none";
else if (methodmed->get_active_row_number()==1) if (methodmed->get_active_row_number()==0)
pp->dirpyrDenoise.methodmed = "Lonly"; pp->dirpyrDenoise.methodmed = "Lonly";
else if (methodmed->get_active_row_number()==2) else if (methodmed->get_active_row_number()==1)
pp->dirpyrDenoise.methodmed = "Lab"; pp->dirpyrDenoise.methodmed = "Lab";
else if (methodmed->get_active_row_number()==3) else if (methodmed->get_active_row_number()==2)
pp->dirpyrDenoise.methodmed = "RGB"; pp->dirpyrDenoise.methodmed = "RGB";
@ -352,15 +352,15 @@ void DirPyrDenoise::dmethodChanged () {
void DirPyrDenoise::medmethodChanged () { 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 ()); listener->panelChanged (EvDPDNmedmet, medmethod->get_active_text ());
} }
} }
void DirPyrDenoise::rgbmethodChanged () { void DirPyrDenoise::rgbmethodChanged () {
ctboxrgb->hide(); ctboxrgb->hide();
if(methodmed->get_active_row_number()==3) ctboxrgb->show(); if(methodmed->get_active_row_number()==2) ctboxrgb->show();
if (listener && (multiImage||enabled->get_active()) ) { if (listener && (multiImage||enabled->get_active()) && median->get_active()) {
listener->panelChanged (EvDPDNrgbmet, rgbmethod->get_active_text ()); listener->panelChanged (EvDPDNrgbmet, rgbmethod->get_active_text ());
} }
} }
@ -368,10 +368,10 @@ void DirPyrDenoise::rgbmethodChanged () {
void DirPyrDenoise::methodmedChanged () { 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();} 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 ()); listener->panelChanged (EvDPDNmetmed, methodmed->get_active_text ());
} }
} }
@ -424,7 +424,7 @@ void DirPyrDenoise::adjusterChanged (Adjuster* a, double newval) {
listener->panelChanged (EvDPDNbluechro, costr); listener->panelChanged (EvDPDNbluechro, costr);
else if (a==gamma) else if (a==gamma)
listener->panelChanged (EvDPDNGamma, costr); listener->panelChanged (EvDPDNGamma, costr);
else if (a==passes) else if (a==passes && median->get_active())
listener->panelChanged (EvDPDNpasses, costr); listener->panelChanged (EvDPDNpasses, costr);
} }
} }
@ -492,9 +492,15 @@ void DirPyrDenoise::medianChanged () {
if (listener) { if (listener) {
if (median->get_active ()) if (median->get_active ())
listener->panelChanged (EvDPDNmedian, M("GENERAL_ENABLED")); { listener->panelChanged (EvDPDNmedian, M("GENERAL_ENABLED"));
// medmethodChanged ();rgbmethodChanged ();methodmedChanged ();
}
else else
listener->panelChanged (EvDPDNmedian, M("GENERAL_DISABLED")); { listener->panelChanged (EvDPDNmedian, M("GENERAL_DISABLED"));
// medmethodChanged ();rgbmethodChanged ();methodmedChanged ();
}
} }
} }