Minor improvements; fixes problem that impulse denoise removed fine detail unless Ldetail=100.
This commit is contained in:
@@ -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
|
||||||
|
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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, \
|
||||||
|
Reference in New Issue
Block a user