Wavelet levels: denoise and guided filter with hue curve and local contrast (#5894)

* First wavelet denoise

* Gui for wavel denoise

* First version local contrast and denoise

* Second version local contrast and denoise

* second version GUI equalizer

* enable equalizer local contrast denoise 1234

* change local contrast curve defaut

* disable local contrast when curve 1

* denmethod in advanced - standard

* Simulate slider denoise with curve

* Some various chnages

* Chnage reference local contrast

* GUI part reference local contrast

* Enable reference noise mix denoise for local contrast denoise

* Improvment to reference local contrast denoise

* Display comment in console

* Best format string in console

* Change agressive denoise limit to 50 - added tooltip

* Added method quality denoise - change madL in ftblockdn

* Change equalizer 1234 settings - added high level local contrast

* added high levels local contrast curve

* Fixed sigma local contrast

* clean format code

* Some improvments

* normalize level slider high level threshold

* change ordonate curve high level contrast

* Fixed bad level for curve high levels - simplify GUI standard

* several changes - guidefilter final - new double slider threshold

* save provisory work

* save GUI work GF threshold

* save provisory work

* Fixed some bad behavior GUI

* save GUI Hue GF

* Curve Hue for GF

* OMP for hue GF

* addes noisevarhue and fixed some bug

* save GUI equalizer hue

* enable equalizer hue

* Fixed bad behavior GUI in advanced mode

* change some default values

* Others change default values

* Change in progressivity slider threshold local contrast

* simplifie algorithm and GUI

* Added tooltip and chnage some labels

* Change labels and tooltip wavelet denoise

* added level 5 denoise

* Change typo in label guided theshold

* Various changes labels tooltip

* Change minimum wavelet level

* Added level 5 to denoise

* Change slider sigm for a double slider sigm03 sigm45

* small delay for double slider sigm

* Fixed wrong values sigm

* Hide level56 in standard complexity

* Improve in standard complexity

* Various improvment levels 14

* interaction 56 14 - advanced complexity
This commit is contained in:
Desmis
2020-08-30 08:16:31 +02:00
committed by GitHub
parent 287fe74593
commit 467bac3dea
14 changed files with 1527 additions and 106 deletions

View File

@@ -2099,12 +2099,12 @@ float ImProcFunctions::Mad(const float * DataList, const int datalen)
}
//computes Median Absolute Deviation
//DataList values should mostly have abs val < 256 because we are in Lab mode
int histo[256] ALIGNED64 = {0};
//DataList values should mostly have abs val < 256 because we are in Lab mode (32768)
int histo[32768] ALIGNED64 = {0};
//calculate histogram of absolute values of wavelet coeffs
for (int i = 0; i < datalen; ++i) {
histo[static_cast<int>(rtengine::min(255.f, fabsf(DataList[i])))]++;
histo[static_cast<int>(rtengine::min(32768.f, fabsf(DataList[i])))]++;
}
//find median of histogram
@@ -2196,6 +2196,10 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposition& Wavelet
maxlvl = 4; //for refine denoise edge wavelet
}
if (edge == 6) {
maxlvl = 6; //for wavelet denoise
}
if (edge == 2) {
maxlvl = 7; //for locallab denoise
}
@@ -2264,7 +2268,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposition& Wavelet
for (int i = 0; i < Hlvl_L * Wlvl_L; ++i) {
nvl[i] = 0.f;
}
if ((edge == 1 || edge == 2 || edge == 3 || edge == 5) && vari) {
if ((edge == 1 || edge == 2 || edge == 3 || edge == 5 || edge == 6) && vari) {
// nvl = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer
if ((edge == 1 || edge == 3)) {
for (int i = 0; i < Hlvl_L * Wlvl_L; ++i) {
@@ -2272,7 +2276,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposition& Wavelet
}
}
if (edge == 2 || edge == 4 || edge == 5) {
if (edge == 2 || edge == 4 || edge == 5 || edge == 6) {
for (int i = 0; i < Hlvl_L * Wlvl_L; ++i) {
nvl[i] = vari[lvl] * SQR(noisevarlum[i]);
}
@@ -2550,6 +2554,10 @@ bool ImProcFunctions::WaveletDenoiseAllL(wavelet_decomposition& WaveletCoeffs_L,
maxlvl = 4; //for refine denoise edge wavelet
}
if (edge == 6) {
maxlvl = 6; //for wavelet denoise
}
if (edge == 2) {
maxlvl = 7; //for locallab denoise
}
@@ -2565,7 +2573,6 @@ bool ImProcFunctions::WaveletDenoiseAllL(wavelet_decomposition& WaveletCoeffs_L,
maxHL = WaveletCoeffs_L.level_H(lvl);
}
}
bool memoryAllocationFailed = false;
#ifdef _OPENMP
#pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1)
@@ -2690,15 +2697,15 @@ void ImProcFunctions::ShrinkAllL(wavelet_decomposition& WaveletCoeffs_L, float *
nvl[i] = 0.f;
}
if ((edge == 1 || edge == 2 || edge == 3 || edge == 5) && vari) {
if ((edge == 1 || edge == 2 || edge == 3 || edge == 5 || edge == 6) && vari) {
// nvl = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer
if ((edge == 1 || edge == 3)) {
for (int i = 0; i < W_L * H_L; ++i) {
nvl[i] = vari[level]; //* SQR(1.f + 4.f * noisevarchrom[p]);
}
}
}
if (edge == 2 || edge == 4 || edge == 5) {
if (edge == 2 || edge == 4 || edge == 5 || edge == 6) {
for (int i = 0; i < W_L * H_L; ++i) {
nvl[i] = vari[level] * SQR(noisevarlum[i]);
}