diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 848451090..2b741a89b 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -138,6 +138,9 @@ struct cont_params { float edgampl; int neigh; bool lipp; + float balchrom; + float chromfi; + float chromco; }; int wavNestedLevels = 1; @@ -196,6 +199,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (params->wavelet.BAmethod != "none") { cp.bam = true; + if (params->wavelet.BAmethod == "sli") { cp.BAmet = 1; } else if (params->wavelet.BAmethod == "cur") { @@ -260,7 +264,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const DaubLen = 8; } else if (params->wavelet.daubcoeffmethod == "10_") { DaubLen = 12; - } else /* if (params->wavelet.daubcoeffmethod == "14_") */{ + } else { /* if (params->wavelet.daubcoeffmethod == "14_") */ DaubLen = 16; } @@ -394,6 +398,9 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.val = waparams.edgval; cp.til = waparams.edgthresh; cp.eff = waparams.edgeffect; + cp.balchrom = waparams.balchrom; + cp.chromfi = waparams.chromfi; + cp.chromco = waparams.chromco; cp.conres = waparams.rescon; cp.conresH = waparams.resconH; @@ -860,7 +867,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (cp.val > 0 || ref || contr) { //edge Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN); } - + //init for edge and denoise float vari[4]; @@ -877,7 +884,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const vari[3] = rtengine::max(0.0001f, vari[3]); float* noisevarlum = nullptr; // we need a dummy to pass it to WaveletDenoiseAllL - WaveletDenoiseAllL (*Ldecomp, noisevarlum, madL, vari, edge, 1); + WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, vari, edge, 1); } //Flat curve for Contrast=f(H) in levels @@ -906,6 +913,213 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } + + /* + float variC[7]; + float variCb[7]; + + float noisecfr = cp.chromfi; + float noiseccr = cp.chromco; + + if (cp.balchrom > 0.f) { + noisecfr = cp.chromfi * ((100.f + cp.balchrom) / 10.f); + noiseccr = cp.chromco + ((100.f + cp.balchrom) / 10.f); + } + + float noisecfb = cp.chromfi; + float noiseccb = cp.chromco; + + if (cp.balchrom < 0.f) { + noisecfb = cp.chromfi * ((100.f - cp.balchrom) / 10.f); + noiseccb = cp.chromco * ((100.f - cp.balchrom) / 10.f); + } + + + if (noisecfr < 0.f) { + noisecfr = 0.0001f; + } + + if (noiseccr < 0.f) { + noiseccr = 0.0001f; + } + + if (noisecfb < 0.f) { + noisecfb = 0.0001f; + } + + if (noiseccb < 0.f) { + noiseccb = 0.0001f; + } + + int edge = 2; + variC[0] = SQR(noisecfr); + variC[1] = SQR(noisecfr); + variC[2] = SQR(noisecfr); + + variC[3] = SQR(noisecfr); + variC[4] = SQR(noisecfr); + variC[5] = SQR(noiseccr); + variC[6] = SQR(noiseccr); + + variCb[0] = SQR(noisecfb); + variCb[1] = SQR(noisecfb); + variCb[2] = SQR(noisecfb); + + variCb[3] = SQR(noisecfb); + variCb[4] = SQR(noisecfb); + variCb[5] = SQR(noiseccb); + variCb[6] = SQR(noiseccb); + + float k1 = 0.f; + float k2 = 0.f; + float k3 = 0.f; + + if (cp.chromfi) { + k1 = 0.f; + k2 = 0.f; + k3 = 0.f; + } else if (cp.chromfi < 0.3f) { + k1 = 0.1f; + k2 = 0.0f; + k3 = 0.f; + } else if (cp.chromfi < 0.5f) { + k1 = 0.2f; + k2 = 0.1f; + k3 = 0.f; + } else if (cp.chromfi < 0.8f) { + k1 = 0.3f; + k2 = 0.25f; + k3 = 0.f; + } else if (cp.chromfi < 1.f) { + k1 = 0.4f; + k2 = 0.25f; + k3 = 0.1f; + } else if (cp.chromfi < 2.f) { + k1 = 0.5f; + k2 = 0.3f; + k3 = 0.15f; + } else if (cp.chromfi < 3.f) { + k1 = 0.6f; + k2 = 0.45f; + k3 = 0.3f; + } else if (cp.chromfi < 4.f) { + k1 = 0.7f; + k2 = 0.5f; + k3 = 0.4f; + } else if (cp.chromfi < 5.f) { + k1 = 0.8f; + k2 = 0.6f; + k3 = 0.5f; + } else if (cp.chromfi < 10.f) { + k1 = 0.85f; + k2 = 0.7f; + k3 = 0.6f; + } else if (cp.chromfi < 20.f) { + k1 = 0.9f; + k2 = 0.8f; + k3 = 0.7f; + } else if (cp.chromfi < 50.f) { + k1 = 1.f; + k2 = 1.f; + k3 = 0.9f; + + } else { + k1 = 1.f; + k2 = 1.f; + k3 = 1.f; + } + + float minic = 0.0001f; + variC[0] = max(minic, variC[0]); + variC[1] = max(minic, k1 * variC[1]); + variC[2] = max(minic, k2 * variC[2]); + variC[3] = max(minic, k3 * variC[3]); + + variCb[0] = max(minic, variCb[0]); + variCb[1] = max(minic, k1 * variCb[1]); + variCb[2] = max(minic, k2 * variCb[2]); + variCb[3] = max(minic, k3 * variCb[3]); + + float k4 = 0.f; + float k5 = 0.f; + float k6 = 0.f; + + if (cp.chromco == 0.01f) { + k4 = 0.f; + k5 = 0.0f; + } else if (cp.chromco < 0.2f) { + k4 = 0.1f; + k5 = 0.0f; + } else if (cp.chromco < 0.5f) { + k4 = 0.15f; + k5 = 0.0f; + } else if (cp.chromco < 1.f) { + k4 = 0.15f; + k5 = 0.1f; + } else if (cp.chromco < 3.f) { + k4 = 0.3f; + k5 = 0.15f; + } else if (cp.chromco < 4.f) { + k4 = 0.6f; + k5 = 0.4f; + } else if (cp.chromco < 6.f) { + k4 = 0.8f; + k5 = 0.6f; + } else { + k4 = 1.f; + k5 = 1.f; + } + + variC[4] = max(0.0001f, k4 * variC[4]); + variC[5] = max(0.0001f, k5 * variC[5]); + variCb[4] = max(0.0001f, k4 * variCb[4]); + variCb[5] = max(0.0001f, k5 * variCb[5]); + + if (cp.chromco < 4.f) { + k6 = 0.f; + } else if (cp.chromco < 5.f) { + k6 = 0.4f; + } else if (cp.chromco < 6.f) { + k6 = 0.7f; + } else { + k6 = 1.f; + } + + variC[6] = max(0.0001f, k6 * variC[6]); + variCb[6] = max(0.0001f, k6 * variCb[6]); + float nvch = 0.6f;//high value + float nvcl = 0.1f;//low value + + if (cp.chromco > 100.f) { + nvch = 0.8f; + nvcl = 0.4f; + } + + float seuil = 4000.f;//low + float seuil2 = 15000.f;//high + //ac and bc for transition + float ac = (nvch - nvcl) / (seuil - seuil2); + float bc = nvch - seuil * ac; + int GW = labco->W; + int GH = labco->H; + float* noisevarchrom = new float[GH * GW]; + //noisevarchrom in function chroma + int GW2 = (GW + 1) / 2; + float noisevarab_r = 100.f; //SQR(lp.noisecc / 10.0); + for (int ir = 0; ir < GH; ir++) + for (int jr = 0; jr < GW; jr++) { + float cN = sqrt(SQR(labco->a[ir][jr]) + SQR(labco->b[ir][jr])); + + if (cN < seuil) { + noisevarchrom[(ir >> 1)*GW2 + (jr >> 1)] = nvch; + } else if (cN < seuil2) { + noisevarchrom[(ir >> 1)*GW2 + (jr >> 1)] = ac * cN + bc; + } else { + noisevarchrom[(ir >> 1)*GW2 + (jr >> 1)] = nvcl; + } + } + */ + //Flat curve for H=f(H) in residual image FlatCurve* hhCurve = new FlatCurve(params->wavelet.hhcurve); //curve H=f(H) bool hhutili = false; @@ -971,7 +1185,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (!adecomp->memoryAllocationFailed && !bdecomp->memoryAllocationFailed) { Evaluate2(*adecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); - WaveletcontAllAB(labco, varhue, varchro, *adecomp,wavblcurve, waOpacityCurveW, cp, true, skip, meanab, sigmaab); + WaveletcontAllAB(labco, varhue, varchro, *adecomp, wavblcurve, waOpacityCurveW, cp, true, skip, meanab, sigmaab); Evaluate2(*bdecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab); WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip, meanab, sigmaab); WaveletAandBAllAB(*adecomp, *bdecomp, cp, hhCurve, hhutili); @@ -983,6 +1197,8 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } + // delete[] noisevarchrom; + if (hhCurve) { delete hhCurve; } @@ -1248,7 +1464,7 @@ void ImProcFunctions::Aver(float * RESTRICT DataList, int datalen, float &averag int countP = 0, countN = 0; double averaP = 0.0, averaN = 0.0; // use double precision for large summations - constexpr float thres = 32.7f;//different fom zero to take into account only data large enough 32.7 = 0.1 in range 0..100 very low value + constexpr float thres = 32.7f;//different fom zero to take into account only data large enough 32.7 = 0.1 in range 0..100 very low value max = 0.f; min = RT_INFINITY_F; #ifdef _OPENMP @@ -1350,51 +1566,54 @@ void ImProcFunctions::Evaluate2(const wavelet_decomposition &WaveletCoeffs_L, void ImProcFunctions::calceffect(int level, float *mean, float *sigma, float *mea, float effect, float offs) { - float rap = 0.f; - float sig = 1.f; - if(effect < 1.f) { - sig = effect; - } + float rap = 0.f; + float sig = 1.f; - if(effect <= 1.f) { - rap = offs * mean[level] - sig * sigma[level]; - } - - if (rap > 0.f) { - mea[0] = rap; - } else { - mea[0] = mean[level] / 6.f; - } + if (effect < 1.f) { + sig = effect; + } - rap = 0.f; - if(effect <= 1.f) { - rap = offs * mean[level] - 0.5f * sig * sigma[level]; - } + if (effect <= 1.f) { + rap = offs * mean[level] - sig * sigma[level]; + } - if (rap > 0.f) { - mea[1] = rap; - } else { - mea[1] = mean[level] / 4.f; - } + if (rap > 0.f) { + mea[0] = rap; + } else { + mea[0] = mean[level] / 6.f; + } - rap = 0.f; - if(effect <= 1.f) { - rap = offs * mean[level] - 0.2f * sig * sigma[level]; - } - - if (rap > 0.f) { - mea[2] = rap; - } else { - mea[2] = mean[level] / 2.f; - } - - mea[3] = offs * mean[level]; // 50% data - mea[4] = offs * mean[level] + effect * sigma[level] / 2.f; - mea[5] = offs * mean[level] + effect * sigma[level]; //66% - mea[6] = offs * mean[level] + effect * 1.2f * sigma[level]; - mea[7] = offs * mean[level] + effect * 1.5f * sigma[level]; // - mea[8] = offs * mean[level] + effect * 2.f * sigma[level]; //95% - mea[9] = offs * mean[level] + effect * 2.5f * sigma[level]; //99% + rap = 0.f; + + if (effect <= 1.f) { + rap = offs * mean[level] - 0.5f * sig * sigma[level]; + } + + if (rap > 0.f) { + mea[1] = rap; + } else { + mea[1] = mean[level] / 4.f; + } + + rap = 0.f; + + if (effect <= 1.f) { + rap = offs * mean[level] - 0.2f * sig * sigma[level]; + } + + if (rap > 0.f) { + mea[2] = rap; + } else { + mea[2] = mean[level] / 2.f; + } + + mea[3] = offs * mean[level]; // 50% data + mea[4] = offs * mean[level] + effect * sigma[level] / 2.f; + mea[5] = offs * mean[level] + effect * sigma[level]; //66% + mea[6] = offs * mean[level] + effect * 1.2f * sigma[level]; + mea[7] = offs * mean[level] + effect * 1.5f * sigma[level]; // + mea[8] = offs * mean[level] + effect * 2.f * sigma[level]; //95% + mea[9] = offs * mean[level] + effect * 2.5f * sigma[level]; //99% } void ImProcFunctions::Eval2(float ** WavCoeffs_L, int level, @@ -1725,7 +1944,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif { - if(contrast != 0.f && cp.resena && max0 > 0.f) { // contrast = 0.f means that all will be multiplied by 1.f, so we can skip this step + if (contrast != 0.f && cp.resena && max0 > 0.f) { // contrast = 0.f means that all will be multiplied by 1.f, so we can skip this step { #ifdef _OPENMP @@ -1784,71 +2003,76 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } #ifdef _OPENMP - #pragma omp barrier + #pragma omp barrier #endif - if((cp.conres != 0.f || cp.conresH != 0.f) && cp.resena && cp.oldsh) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step + if ((cp.conres != 0.f || cp.conresH != 0.f) && cp.resena && cp.oldsh) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step #ifdef _OPENMP - #pragma omp for nowait + #pragma omp for nowait #endif - for (int i = 0; i < W_L * H_L; i++) { - float LL = WavCoeffs_L0[i]; - float LL100 = LL / 327.68f; - float tran = 5.f;//transition - //shadow - float alp = 3.f; //increase contrast sahdow in lowlights between 1 and ?? + for (int i = 0; i < W_L * H_L; i++) { + float LL = WavCoeffs_L0[i]; + float LL100 = LL / 327.68f; + float tran = 5.f;//transition + //shadow + float alp = 3.f; //increase contrast sahdow in lowlights between 1 and ?? - if(cp.th > (100.f - tran)) { - tran = 100.f - cp.th; - } + if (cp.th > (100.f - tran)) { + tran = 100.f - cp.th; + } - if(LL100 < cp.th) { - float aalp = (1.f - alp) / cp.th; //no changes for LL100 = cp.th - float kk = aalp * LL100 + alp; - WavCoeffs_L0[i] *= (1.f + kk * cp.conres / 200.f); - } else if(LL100 < cp.th + tran) { - float ath = -cp.conres / tran; - float bth = cp.conres - ath * cp.th; - WavCoeffs_L0[i] *= (1.f + (LL100 * ath + bth) / 200.f); - } + if (LL100 < cp.th) { + float aalp = (1.f - alp) / cp.th; //no changes for LL100 = cp.th + float kk = aalp * LL100 + alp; + WavCoeffs_L0[i] *= (1.f + kk * cp.conres / 200.f); + } else if (LL100 < cp.th + tran) { + float ath = -cp.conres / tran; + float bth = cp.conres - ath * cp.th; + WavCoeffs_L0[i] *= (1.f + (LL100 * ath + bth) / 200.f); + } - //highlight - tran = 5.f; + //highlight + tran = 5.f; - if(cp.thH < (tran)) { - tran = cp.thH; - } + if (cp.thH < (tran)) { + tran = cp.thH; + } - if(LL100 > cp.thH) { - WavCoeffs_L0[i] *= (1.f + cp.conresH / 200.f); - } else if(LL100 > (cp.thH - tran)) { - float athH = cp.conresH / tran; - float bthH = cp.conresH - athH * cp.thH; - WavCoeffs_L0[i] *= (1.f + (LL100 * athH + bthH) / 200.f); - } + if (LL100 > cp.thH) { + WavCoeffs_L0[i] *= (1.f + cp.conresH / 200.f); + } else if (LL100 > (cp.thH - tran)) { + float athH = cp.conresH / tran; + float bthH = cp.conresH - athH * cp.thH; + WavCoeffs_L0[i] *= (1.f + (LL100 * athH + bthH) / 200.f); } } + } //Blur luma - if(cp.blurres != 0.f && cp.resena) { + if (cp.blurres != 0.f && cp.resena) { float rad = 0.7f * cp.blurres / skip; float * bef = new float[W_L * H_L]; float * aft = new float[W_L * H_L]; for (int i = 0; i < H_L * W_L; i++) { - bef[i] = WavCoeffs_L0[i]; + bef[i] = WavCoeffs_L0[i]; } + boxblur(bef, aft, rad, W_L, H_L, false); for (int i = 0; i < H_L * W_L; i++) { WavCoeffs_L0[i] = aft[i]; } - delete bef; - delete aft; + delete[] bef; + delete[] aft; } + // + int n0, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n32; + n0 = n1 = n2 = n3 = n4 = n5 = n6 = n7 = n8 = n9 = n10 = n32 = 0; + #ifdef _OPENMP #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif @@ -1992,6 +2216,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * // end } + bool wavcurvecomp = false;//not enable if 0.75 if (wavblcurve) { @@ -2003,7 +2228,8 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } #ifdef _OPENMP - #pragma omp for schedule(dynamic) collapse(2) + // #pragma omp for schedule(dynamic) collapse(2) + #pragma omp for reduction(+:n0, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n32) schedule(dynamic) collapse(2) #endif for (int dir = 1; dir < 4; dir++) { @@ -2017,12 +2243,13 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * ContAllL(koeLi, maxkoeLi, true, maxlvl, labco, varhue, varchrom, WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); //blur level float klev = 1.f; - if(wavblcurve && wavcurvecomp && cp.blena) { + + if (wavblcurve && wavcurvecomp && cp.blena) { float mea[10]; float effect = cp.bluwav; float beta = 0.f; float offs = 1.f; - + calceffect(lvl, mean, sigma, mea, effect, offs); float * bef = new float[Wlvl_L * Hlvl_L]; @@ -2032,37 +2259,58 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * bef[co] = WavCoeffs_L[dir][co]; float WavCL = std::fabs(WavCoeffs_L[dir][co]); - if (WavCL < mea[0]) { - beta = 0.05f; - } else if (WavCL < mea[1]) { - beta = 0.2f; - } else if (WavCL < mea[2]) { - beta = 0.7f; - } else if (WavCL < mea[3]) { - beta = 1.f; //standard - } else if (WavCL < mea[4]) { - beta = 1.f; - } else if (WavCL < mea[5]) { - beta = 0.8f; //+sigma - } else if (WavCL < mea[6]) { - beta = 0.6f; - } else if (WavCL < mea[7]) { - beta = 0.4f; - } else if (WavCL < mea[8]) { - beta = 0.2f; // + 2 sigma - } else if (WavCL < mea[9]) { - beta = 0.1f; - } else { - beta = 0.0f; + if (WavCL < mea[0]) { + beta = 0.05f; + n0++; + + if (WavCL < 32.7) { + n32++; } - - + } else if (WavCL < mea[1]) { + beta = 0.2f; + n1++; + } else if (WavCL < mea[2]) { + beta = 0.7f; + n2++; + } else if (WavCL < mea[3]) { + beta = 1.f; //standard + n3++; + } else if (WavCL < mea[4]) { + beta = 1.f; + n4++; + } else if (WavCL < mea[5]) { + beta = 0.8f; //+sigma + n5++; + } else if (WavCL < mea[6]) { + beta = 0.6f; + n6++; + } else if (WavCL < mea[7]) { + beta = 0.4f; + n7++; + } else if (WavCL < mea[8]) { + beta = 0.2f; // + 2 sigma + n8++; + } else if (WavCL < mea[9]) { + beta = 0.1f; + n9++; + } else { + beta = 0.01f; + n10++; + } + + + } + + if (settings->verbose) { + printf("lvl=%i n0=%i n32=%i n1=%i n2=%i n3=%i n4=%i n5=%i n6=%i n7=%i n8=%i n9=%i n10=%i\n", lvl, n0, n0 - n32, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10); } klev = (wavblcurve[lvl * 55.5f]); float lvr = lvl; - if(lvr == 0) { + + if (lvr == 0) { lvr = 1; } + klev *= beta * lvr * 100.f / skip; boxblur(bef, aft, klev, Wlvl_L, Hlvl_L, false); @@ -2070,8 +2318,8 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * WavCoeffs_L[dir][co] = aft[co]; } - delete bef; - delete aft; + delete[] bef; + delete[] aft; } } } @@ -2272,41 +2520,42 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float } } } - + //Blur chroma - if(cp.blurcres != 0.f && cp.resena) { - float rad = 0.7f * cp.blurcres / skip; - float * bef = new float[W_L * H_L]; - float * aft = new float[W_L * H_L]; + if (cp.blurcres != 0.f && cp.resena) { + float rad = 0.7f * cp.blurcres / skip; + float * bef = new float[W_L * H_L]; + float * aft = new float[W_L * H_L]; - for (int i = 0; i < H_L * W_L; i++) { - bef[i] = WavCoeffs_ab0[i]; - } - boxblur(bef, aft, rad, W_L, H_L, false); + for (int i = 0; i < H_L * W_L; i++) { + bef[i] = WavCoeffs_ab0[i]; + } - for (int i = 0; i < H_L * W_L; i++) { - WavCoeffs_ab0[i] = aft[i]; + boxblur(bef, aft, rad, W_L, H_L, false); + + for (int i = 0; i < H_L * W_L; i++) { + WavCoeffs_ab0[i] = aft[i]; + } + + delete[] bef; + delete[] aft; } - delete bef; - delete aft; - } + bool wavcurvecomp = false;//not enable if 0.75 - bool wavcurvecomp = false;//not enable if 0.75 - - if (wavblcurve) { - for (int i = 0; i < 500; i++) { - if (wavblcurve[i] != 0.) { - wavcurvecomp = true; + if (wavblcurve) { + for (int i = 0; i < 500; i++) { + if (wavblcurve[i] != 0.) { + wavcurvecomp = true; + } } } - } #ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif - + for (int dir = 1; dir < 4; dir++) { for (int lvl = 0; lvl < maxlvl; lvl++) { @@ -2316,63 +2565,66 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); ContAllAB(labco, maxlvl, varhue, varchrom, WavCoeffs_ab, WavCoeffs_ab0, lvl, dir, waOpacityCurveW, cp, Wlvl_ab, Hlvl_ab, useChannelA); - if(wavblcurve && wavcurvecomp && cp.blena && cp.chrwav > 0.f) { + if (wavblcurve && wavcurvecomp && cp.blena && cp.chrwav > 0.f) { float mea[10]; float effect = cp.bluwav; float beta = 0.f; float offs = 1.f; - + calceffect(lvl, meanab, sigmaab, mea, effect, offs); - + float * bef = new float[Wlvl_ab * Hlvl_ab]; float * aft = new float[Wlvl_ab * Hlvl_ab]; float klev; + for (int co = 0; co < Hlvl_ab * Wlvl_ab; co++) { bef[co] = WavCoeffs_ab[dir][co]; - float WavCab = std::fabs(WavCoeffs_ab[dir][co]); + float WavCab = std::fabs(WavCoeffs_ab[dir][co]); + + if (WavCab < mea[0]) { + beta = 0.05f; + } else if (WavCab < mea[1]) { + beta = 0.2f; + } else if (WavCab < mea[2]) { + beta = 0.7f; + } else if (WavCab < mea[3]) { + beta = 1.f; //standard + } else if (WavCab < mea[4]) { + beta = 1.f; + } else if (WavCab < mea[5]) { + beta = 0.8f; //+sigma + } else if (WavCab < mea[6]) { + beta = 0.6f; + } else if (WavCab < mea[7]) { + beta = 0.4f; + } else if (WavCab < mea[8]) { + beta = 0.2f; // + 2 sigma + } else if (WavCab < mea[9]) { + beta = 0.1f; + } else { + beta = 0.0f; + } + - if (WavCab < mea[0]) { - beta = 0.05f; - } else if (WavCab < mea[1]) { - beta = 0.2f; - } else if (WavCab < mea[2]) { - beta = 0.7f; - } else if (WavCab < mea[3]) { - beta = 1.f; //standard - } else if (WavCab < mea[4]) { - beta = 1.f; - } else if (WavCab < mea[5]) { - beta = 0.8f; //+sigma - } else if (WavCab < mea[6]) { - beta = 0.6f; - } else if (WavCab < mea[7]) { - beta = 0.4f; - } else if (WavCab < mea[8]) { - beta = 0.2f; // + 2 sigma - } else if (WavCab < mea[9]) { - beta = 0.1f; - } else { - beta = 0.0f; - } - - } - klev = (wavblcurve[lvl * 55.5f]); + + klev = (wavblcurve[lvl * 55.5f]); float lvr = lvl; - if(lvr == 0) { + + if (lvr == 0) { lvr = 1; } klev *= beta * cp.chrwav * lvr * 200.f / skip; - + boxblur(bef, aft, klev, Wlvl_ab, Hlvl_ab, false); for (int co = 0; co < Hlvl_ab * Wlvl_ab; co++) { WavCoeffs_ab[dir][co] = aft[co]; } - delete bef; - delete aft; + delete[] bef; + delete[] aft; } @@ -2725,11 +2977,13 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz float mea[10]; float beta = 1.f; - if(cp.eff < 2.5f) { + + if (cp.eff < 2.5f) { float effect = cp.eff; float offs = 1.f; calceffect(level, mean, sigma, mea, effect, offs); + for (int co = 0; co < H_L * W_L; co++) { float WavCL = std::fabs(WavCoeffs_L[dir][co]); @@ -2756,14 +3010,14 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz } else { beta = 0.0f; } - + } } if (cp.val > 0 && cp.edgeena) { - - + + float * koe = nullptr; float maxkoe = 0.f; @@ -2852,6 +3106,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz float atten01234 = 0.80f; value *= (atten01234 * scaleskip[1]); //for zoom < 100% reduce strength...I choose level 1...but!! } + value *= beta; float edge = 1.f; float lim0 = 20.f; //arbitrary limit for low radius and level between 2 or 3 to 30 maxi @@ -2862,8 +3117,8 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz if (cp.reinforce != 2) { const float brepart = cp.reinforce == 1 - ? 3.f - : 0.5f; + ? 3.f + : 0.5f; const float arepart = -(brepart - 1.f) / (lim0 / 60.f); if (rad < lim0 / 60.f) { @@ -3186,7 +3441,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz float red0 = 0.005f * (110.f - lowthr); float red1 = 0.008f * (110.f - lowthr); float red2 = 0.011f * (110.f - lowthr); - + for (int i = 0; i < W_L * H_L; i++) { float kLlev = 1.f; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 836cdfe1f..21507ce05 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -543,7 +543,7 @@ Wavelet::Wavelet() : chroBox->pack_start(*chromfi); chroBox->pack_start(*chromco); chroFrame->add(*chroBox); - noiseBox->pack_start(*chroFrame); +// noiseBox->pack_start(*chroFrame); //Clarity