Minor improvements; fixes problem that impulse denoise removed fine detail unless Ldetail=100.

This commit is contained in:
Emil Martinec
2012-04-02 21:55:42 -05:00
parent 982f95f747
commit b9b6d7aed9
3 changed files with 17 additions and 13 deletions

View File

@@ -237,7 +237,9 @@ namespace rtengine {
} }
//initial impulse denoise //initial impulse denoise
impulse_nr (labdn, 50.0f/20.0f); if (dnparams.luma>0.01) {
impulse_nr (labdn, MIN(50.0f,dnparams.luma)/20.0f);
}
int datalen = labdn->W * labdn->H; int datalen = labdn->W * labdn->H;
@@ -263,7 +265,9 @@ namespace rtengine {
//TODO: at this point wavelet coefficients storage can be freed //TODO: at this point wavelet coefficients storage can be freed
//second impulse denoise //second impulse denoise
impulse_nr (labdn, 50.0f/20.0f); if (dnparams.luma>0.01) {
impulse_nr (labdn, MIN(50.0f,dnparams.luma)/20.0f);
}
//PF_correct_RT(dst, dst, defringe.radius, defringe.threshold); //PF_correct_RT(dst, dst, defringe.radius, defringe.threshold);
//wavelet denoised L channel //wavelet denoised L channel

View File

@@ -379,15 +379,15 @@ public:
//initialize wavelet filters //initialize wavelet filters
wavfilt_len = Haar_len; wavfilt_len = Daub4_len;
wavfilt_offset = Haar_offset; wavfilt_offset = Daub4_offset;
wavfilt_anal = new float[2*wavfilt_len]; wavfilt_anal = new float[2*wavfilt_len];
wavfilt_synth = new float[2*wavfilt_len]; wavfilt_synth = new float[2*wavfilt_len];
for (int n=0; n<2; n++) { for (int n=0; n<2; n++) {
for (int i=0; i<wavfilt_len; i++) { for (int i=0; i<wavfilt_len; i++) {
wavfilt_anal[wavfilt_len*(n)+i] = Haar_anal[n][i]; wavfilt_anal[wavfilt_len*(n)+i] = Daub4_anal[n][i];
wavfilt_synth[wavfilt_len*(n)+i] = Haar_anal[n][wavfilt_len-1-i]; wavfilt_synth[wavfilt_len*(n)+i] = Daub4_anal[n][wavfilt_len-1-i];
//n=0 lopass, n=1 hipass //n=0 lopass, n=1 hipass
} }
} }

View File

@@ -509,8 +509,8 @@ namespace rtengine {
for (int j=0; j<m_w; j++) { for (int j=0; j<m_w; j++) {
loadbuffer(src+j, buffer, m_w/*pitch*/, m_h/*srclen*/);//pad a column of data and load it to buffer loadbuffer(src+j, buffer, m_w/*pitch*/, m_h/*srclen*/);//pad a column of data and load it to buffer
if (subsamp_out) { if (subsamp_out) {
//AnalysisFilterSubsamp (buffer, tmpLo+j, tmpHi+j, filterV, filterV+taps, taps, offset, m_w/*output_pitch*/, m_h/*srclen*/); AnalysisFilterSubsamp (buffer, tmpLo+j, tmpHi+j, filterV, filterV+taps, taps, offset, m_w/*output_pitch*/, m_h/*srclen*/);
AnalysisFilterSubsampHaar (buffer, tmpLo+j, tmpHi+j, m_w, m_h); //AnalysisFilterSubsampHaar (buffer, tmpLo+j, tmpHi+j, m_w, m_h);
} else { } else {
//AnalysisFilter (buffer, tmpLo+j, tmpHi+j, filterV, filterV+taps, taps, offset, m_w/*output_pitch*/, m_h/*srclen*/); //AnalysisFilter (buffer, tmpLo+j, tmpHi+j, filterV, filterV+taps, taps, offset, m_w/*output_pitch*/, m_h/*srclen*/);
AnalysisFilterHaar (buffer, tmpLo+j, tmpHi+j, m_w, m_h); AnalysisFilterHaar (buffer, tmpLo+j, tmpHi+j, m_w, m_h);
@@ -522,16 +522,16 @@ namespace rtengine {
for (int i=0; i<m_h2; i++) { for (int i=0; i<m_h2; i++) {
loadbuffer(tmpLo+i*m_w, buffer, 1/*pitch*/, m_w/*srclen*/);//pad a row of data and load it to buffer loadbuffer(tmpLo+i*m_w, buffer, 1/*pitch*/, m_w/*srclen*/);//pad a row of data and load it to buffer
if (subsamp_out) { if (subsamp_out) {
//AnalysisFilterSubsamp (buffer, wavcoeffs[0]+i*m_w2, wavcoeffs[1]+i*m_w2, filterH, filterH+taps, taps, offset, 1/*output_pitch*/, m_w/*srclen*/); AnalysisFilterSubsamp (buffer, wavcoeffs[0]+i*m_w2, wavcoeffs[1]+i*m_w2, filterH, filterH+taps, taps, offset, 1/*output_pitch*/, m_w/*srclen*/);
AnalysisFilterSubsampHaar (buffer, wavcoeffs[0]+i*m_w2, wavcoeffs[1]+i*m_w2, 1, m_w); //AnalysisFilterSubsampHaar (buffer, wavcoeffs[0]+i*m_w2, wavcoeffs[1]+i*m_w2, 1, m_w);
} else { } else {
//AnalysisFilter (buffer, wavcoeffs[0]+i*m_w2, wavcoeffs[1]+i*m_w2, filterH, filterH+taps, taps, offset, 1/*output_pitch*/, m_w/*srclen*/); //AnalysisFilter (buffer, wavcoeffs[0]+i*m_w2, wavcoeffs[1]+i*m_w2, filterH, filterH+taps, taps, offset, 1/*output_pitch*/, m_w/*srclen*/);
AnalysisFilterHaar (buffer, wavcoeffs[0]+i*m_w2, wavcoeffs[1]+i*m_w2, 1, m_w); AnalysisFilterHaar (buffer, wavcoeffs[0]+i*m_w2, wavcoeffs[1]+i*m_w2, 1, m_w);
} }
loadbuffer(tmpHi+i*m_w, buffer, 1/*pitch*/, m_w/*srclen*/); loadbuffer(tmpHi+i*m_w, buffer, 1/*pitch*/, m_w/*srclen*/);
if (subsamp_out) { if (subsamp_out) {
//AnalysisFilterSubsamp (buffer, wavcoeffs[2]+i*m_w2, wavcoeffs[3]+i*m_w2, filterH, filterH+taps, taps, offset, 1/*output_pitch*/, m_w/*srclen*/); AnalysisFilterSubsamp (buffer, wavcoeffs[2]+i*m_w2, wavcoeffs[3]+i*m_w2, filterH, filterH+taps, taps, offset, 1/*output_pitch*/, m_w/*srclen*/);
AnalysisFilterSubsampHaar (buffer, wavcoeffs[2]+i*m_w2, wavcoeffs[3]+i*m_w2, 1, m_w); //AnalysisFilterSubsampHaar (buffer, wavcoeffs[2]+i*m_w2, wavcoeffs[3]+i*m_w2, 1, m_w);
} else { } else {
//AnalysisFilter (buffer, wavcoeffs[2]+i*m_w2, wavcoeffs[3]+i*m_w2, filterH, filterH+taps, taps, offset, 1/*output_pitch*/, m_w/*srclen*/); //AnalysisFilter (buffer, wavcoeffs[2]+i*m_w2, wavcoeffs[3]+i*m_w2, filterH, filterH+taps, taps, offset, 1/*output_pitch*/, m_w/*srclen*/);
AnalysisFilterHaar (buffer, wavcoeffs[2]+i*m_w2, wavcoeffs[3]+i*m_w2, 1, m_w); AnalysisFilterHaar (buffer, wavcoeffs[2]+i*m_w2, wavcoeffs[3]+i*m_w2, 1, m_w);
@@ -565,7 +565,7 @@ namespace rtengine {
filterH, filterH+taps, taps, offset, 1/*pitch*/, m_w/*dstlen*/); filterH, filterH+taps, taps, offset, 1/*pitch*/, m_w/*dstlen*/);
SynthesisFilterSubsamp (wavcoeffs[2]+i*m_w2, wavcoeffs[3]+i*m_w2, tmpHi+i*m_w, bufferLo, bufferHi, \ SynthesisFilterSubsamp (wavcoeffs[2]+i*m_w2, wavcoeffs[3]+i*m_w2, tmpHi+i*m_w, bufferLo, bufferHi, \
filterH, filterH+taps, taps, offset, 1/*pitch*/, m_w/*dstlen*/); filterH, filterH+taps, taps, offset, 1/*pitch*/, m_w/*dstlen*/);
//SynthesisFilterSubsampHaar (wavcoeffs[0]+i*m_w2, wavcoeffs[1]+i*m_w2, tmpLo+i*m_w, 1, m_w); //SynthesisFilterSubsampHaar (wavcoeffs[0]+i*m_w2, wavcoeffs[1]+i*m_w2, tmpLo+i*m_w, 1, m_w);//TODO: this is buggy
//SynthesisFilterSubsampHaar (wavcoeffs[2]+i*m_w2, wavcoeffs[3]+i*m_w2, tmpHi+i*m_w, 1, m_w); //SynthesisFilterSubsampHaar (wavcoeffs[2]+i*m_w2, wavcoeffs[3]+i*m_w2, tmpHi+i*m_w, 1, m_w);
} else { } else {
//SynthesisFilter (wavcoeffs[0]+i*m_w2, wavcoeffs[1]+i*m_w2, tmpLo+i*m_w, bufferLo, bufferHi, \ //SynthesisFilter (wavcoeffs[0]+i*m_w2, wavcoeffs[1]+i*m_w2, tmpLo+i*m_w, bufferLo, bufferHi, \