Display pyramid mea[]

This commit is contained in:
Desmis
2020-04-03 07:37:16 +02:00
parent 61c6b19533
commit ac0d54ef3e
2 changed files with 433 additions and 178 deletions

View File

@@ -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;