iplocallab.cc: further cleanups

This commit is contained in:
Ingo Weyrich 2020-06-10 21:18:49 +02:00
parent da954d971f
commit ccb1726f03

View File

@ -51,15 +51,14 @@
#include "StopWatch.h" #include "StopWatch.h"
#include "guidedfilter.h" #include "guidedfilter.h"
#define mSPsharp 39 //minimum size Spot Sharp due to buildblendmask
#define mSPwav 32 //minimum size Spot Wavelet
#pragma GCC diagnostic warning "-Wall" #pragma GCC diagnostic warning "-Wall"
#pragma GCC diagnostic warning "-Wextra" #pragma GCC diagnostic warning "-Wextra"
namespace namespace
{ {
constexpr int mSPsharp = 39; //minimum size Spot Sharp due to buildblendmask
constexpr int mSPwav = 32; //minimum size Spot Wavelet
constexpr int mDEN = 64; //minimum size Spot Denoise constexpr int mDEN = 64; //minimum size Spot Denoise
constexpr int mSP = 5; //minimum size Spot constexpr int mSP = 5; //minimum size Spot
constexpr float MAXSCOPE = 1.25f; constexpr float MAXSCOPE = 1.25f;
@ -198,31 +197,25 @@ float calcLocalFactor(const float lox, const float loy, const float lcx, const f
float calcLocalFactorrect(const float lox, const float loy, const float lcx, const float dx, const float lcy, const float dy, const float ach, const float gradient) float calcLocalFactorrect(const float lox, const float loy, const float lcx, const float dx, const float lcy, const float dy, const float ach, const float gradient)
{ {
float eps = 0.0001f; constexpr float eps = 0.0001f;
float krap = std::fabs(dx / dy); const float krap = std::fabs(dx / dy);
float kx = (lox - lcx); const float kx = lox - lcx;
float ky = (loy - lcy); const float ky = loy - lcy;
float ref = 0.f;
//gradient allows differenciation between transition x and y
float ref;
//gradient allows differenciation between transition x and y
if (std::fabs(kx / (ky + eps)) < krap) { if (std::fabs(kx / (ky + eps)) < krap) {
ref = std::sqrt(rtengine::SQR(dy) * (1.f + rtengine::SQR(kx / (ky + eps)))); ref = std::sqrt(rtengine::SQR(dy) * (1.f + rtengine::SQR(kx / (ky + eps))));
} else { } else {
ref = std::sqrt(rtengine::SQR(dx) * (1.f + rtengine::SQR(ky / (kx + eps)))); ref = std::sqrt(rtengine::SQR(dx) * (1.f + rtengine::SQR(ky / (kx + eps))));
} }
float rad = std::sqrt(rtengine::SQR(kx) + rtengine::SQR(ky)); const float rad = rtengine::max(eps, std::sqrt(rtengine::SQR(kx) + rtengine::SQR(ky)));
const float rapy = std::fabs((loy - lcy) / rad);
const float gradreal = gradient * rapy + 1.f;
if (rad == 0.f) { const float coef = rad / ref;
rad = eps; const float fact = (coef - 1.f) / (ach - 1.f);
}
float rapy = std::fabs((loy - lcy) / rad);
float gradreal = gradient * rapy + 1.f;
float coef = rad / ref;
float ac = 1.f / (ach - 1.f);
float fact = ac * (coef - 1.f);
return pow(fact, rtengine::SQR(gradreal)); return pow(fact, rtengine::SQR(gradreal));
} }
@ -250,6 +243,43 @@ float calcreducdE(float dE, float maxdE, float mindE, float maxdElim, float mind
} }
} }
void deltaEforLaplace(float *dE, const float lap, int bfw, int bfh, rtengine::LabImage* bufexporig, const float hueref, const float chromaref, const float lumaref)
{
const float refa = chromaref * cos(hueref);
const float refb = chromaref * sin(hueref);
const float refL = lumaref;
float maxdE = 5.f + MAXSCOPE * lap;
std::unique_ptr<float[]> dEforLaplace(new float [bfw * bfh]);
float maxC = std::sqrt((rtengine::SQR(refa - bufexporig->a[0][0]) + rtengine::SQR(refb - bufexporig->b[0][0])) + rtengine::SQR(refL - bufexporig->L[0][0])) / 327.68f;
#ifdef _OPENMP
#pragma omp parallel for reduction(max:maxC)
#endif
for (int y = 0; y < bfh; y++) {
for (int x = 0; x < bfw; x++) {
dEforLaplace[y * bfw + x] = std::sqrt((rtengine::SQR(refa - bufexporig->a[y][x]) + rtengine::SQR(refb - bufexporig->b[y][x])) + rtengine::SQR(refL - bufexporig->L[y][x])) / 327.68f;
maxC = rtengine::max(maxC, dEforLaplace[y * bfw + x]);
}
}
if (maxdE > maxC) {
maxdE = maxC - 1.f;
}
const float ade = 1.f / (maxdE - maxC);
const float bde = -ade * maxC;
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
for (int y = 0; y < bfh; y++) {
for (int x = 0; x < bfw; x++) {
dE[y * bfw + x] = dEforLaplace[y * bfw + x] >= maxdE ? ade * dEforLaplace[y * bfw + x] + bde : 1.f;
}
}
}
} }
namespace rtengine namespace rtengine
@ -1321,41 +1351,40 @@ static void calcTransitionrect(const float lox, const float loy, const float ach
{ {
zone = 0; zone = 0;
if (lox >= lp.xc && lox < lp.xc + lp.lx && loy >= lp.yc && loy < lp.yc + lp.ly) { if (lox >= lp.xc && lox < lp.xc + lp.lx) {
if (lox < (lp.xc + lp.lx * ach) && loy < (lp.yc + lp.ly * ach)) { if (loy >= lp.yc && loy < lp.yc + lp.ly) {
if (lox < lp.xc + lp.lx * ach && loy < lp.yc + lp.ly * ach) {
zone = 2; zone = 2;
} else { } else {
zone = 1; zone = 1;
localFactor = calcLocalFactorrect(lox, loy, lp.xc, lp.lx, lp.yc, lp.ly, ach, lp.transgrad); localFactor = pow_F(calcLocalFactorrect(lox, loy, lp.xc, lp.lx, lp.yc, lp.ly, ach, lp.transgrad), lp.transweak);
localFactor = pow(localFactor, lp.transweak);
} }
} else if (lox >= lp.xc && lox < lp.xc + lp.lx && loy < lp.yc && loy > lp.yc - lp.lyT) { } else if (loy < lp.yc && loy > lp.yc - lp.lyT) {
if (lox < (lp.xc + lp.lx * ach) && loy > (lp.yc - lp.lyT * ach)) { if (lox < lp.xc + lp.lx * ach && loy > lp.yc - lp.lyT * ach) {
zone = 2; zone = 2;
} else { } else {
zone = 1; zone = 1;
localFactor = calcLocalFactorrect(lox, loy, lp.xc, lp.lx, lp.yc, lp.lyT, ach, lp.transgrad); localFactor = pow_F(calcLocalFactorrect(lox, loy, lp.xc, lp.lx, lp.yc, lp.lyT, ach, lp.transgrad), lp.transweak);
localFactor = pow(localFactor, lp.transweak);
} }
} else if (lox < lp.xc && lox > lp.xc - lp.lxL && loy <= lp.yc && loy > lp.yc - lp.lyT) { }
} else if (lox < lp.xc && lox > lp.xc - lp.lxL) {
if (loy <= lp.yc && loy > lp.yc - lp.lyT) {
if (lox > (lp.xc - lp.lxL * ach) && loy > (lp.yc - lp.lyT * ach)) { if (lox > (lp.xc - lp.lxL * ach) && loy > (lp.yc - lp.lyT * ach)) {
zone = 2; zone = 2;
} else { } else {
zone = 1; zone = 1;
localFactor = calcLocalFactorrect(lox, loy, lp.xc, lp.lxL, lp.yc, lp.lyT, ach, lp.transgrad); localFactor = pow_F(calcLocalFactorrect(lox, loy, lp.xc, lp.lxL, lp.yc, lp.lyT, ach, lp.transgrad), lp.transweak);
localFactor = pow(localFactor, lp.transweak);
} }
} else if (lox < lp.xc && lox > lp.xc - lp.lxL && loy > lp.yc && loy < lp.yc + lp.ly) { } else if (loy > lp.yc && loy < lp.yc + lp.ly) {
if (lox > (lp.xc - lp.lxL * ach) && loy < (lp.yc + lp.ly * ach)) { if (lox > (lp.xc - lp.lxL * ach) && loy < (lp.yc + lp.ly * ach)) {
zone = 2; zone = 2;
} else { } else {
zone = 1; zone = 1;
localFactor = calcLocalFactorrect(lox, loy, lp.xc, lp.lxL, lp.yc, lp.ly, ach, lp.transgrad); localFactor = pow_F(calcLocalFactorrect(lox, loy, lp.xc, lp.lxL, lp.yc, lp.ly, ach, lp.transgrad), lp.transweak);
localFactor = pow(localFactor, lp.transweak); }
} }
} }
} }
static void calcTransition(const float lox, const float loy, const float ach, const local_params& lp, int &zone, float &localFactor) static void calcTransition(const float lox, const float loy, const float ach, const local_params& lp, int &zone, float &localFactor)
{ {
@ -1371,7 +1400,6 @@ static void calcTransition(const float lox, const float loy, const float ach, co
if (!zone) { if (!zone) {
zone = (zoneVal > 1.f && ((SQR((lox - lp.xc) / (lp.lx)) + SQR((loy - lp.yc) / (lp.ly))) < 1.f)) ? 1 : 0; zone = (zoneVal > 1.f && ((SQR((lox - lp.xc) / (lp.lx)) + SQR((loy - lp.yc) / (lp.ly))) < 1.f)) ? 1 : 0;
if (zone == 1) { if (zone == 1) {
localFactor = pow_F(calcLocalFactor(lox, loy, lp.xc, lp.lx, lp.yc, lp.ly, ach, lp.transgrad), lp.transweak); localFactor = pow_F(calcLocalFactor(lox, loy, lp.xc, lp.lx, lp.yc, lp.ly, ach, lp.transgrad), lp.transweak);
} }
@ -1382,7 +1410,6 @@ static void calcTransition(const float lox, const float loy, const float ach, co
if (!zone) { if (!zone) {
zone = (zoneVal > 1.f && ((SQR((lox - lp.xc) / (lp.lx)) + SQR((loy - lp.yc) / (lp.lyT))) < 1.f)) ? 1 : 0; zone = (zoneVal > 1.f && ((SQR((lox - lp.xc) / (lp.lx)) + SQR((loy - lp.yc) / (lp.lyT))) < 1.f)) ? 1 : 0;
if (zone == 1) { if (zone == 1) {
localFactor = pow_F(calcLocalFactor(lox, loy, lp.xc, lp.lx, lp.yc, lp.lyT, ach, lp.transgrad), lp.transweak); localFactor = pow_F(calcLocalFactor(lox, loy, lp.xc, lp.lx, lp.yc, lp.lyT, ach, lp.transgrad), lp.transweak);
} }
@ -1395,7 +1422,6 @@ static void calcTransition(const float lox, const float loy, const float ach, co
if (!zone) { if (!zone) {
zone = (zoneVal > 1.f && ((SQR((lox - lp.xc) / (lp.lxL)) + SQR((loy - lp.yc) / (lp.lyT))) < 1.f)) ? 1 : 0; zone = (zoneVal > 1.f && ((SQR((lox - lp.xc) / (lp.lxL)) + SQR((loy - lp.yc) / (lp.lyT))) < 1.f)) ? 1 : 0;
if (zone == 1) { if (zone == 1) {
localFactor = pow_F(calcLocalFactor(lox, loy, lp.xc, lp.lxL, lp.yc, lp.lyT, ach, lp.transgrad), lp.transweak); localFactor = pow_F(calcLocalFactor(lox, loy, lp.xc, lp.lxL, lp.yc, lp.lyT, ach, lp.transgrad), lp.transweak);
} }
@ -1406,7 +1432,6 @@ static void calcTransition(const float lox, const float loy, const float ach, co
if (!zone) { if (!zone) {
zone = (zoneVal > 1.f && ((SQR((lox - lp.xc) / (lp.lxL)) + SQR((loy - lp.yc) / (lp.ly))) < 1.f)) ? 1 : 0; zone = (zoneVal > 1.f && ((SQR((lox - lp.xc) / (lp.lxL)) + SQR((loy - lp.yc) / (lp.ly))) < 1.f)) ? 1 : 0;
if (zone == 1) { if (zone == 1) {
localFactor = pow_F(calcLocalFactor(lox, loy, lp.xc, lp.lxL, lp.yc, lp.ly, ach, lp.transgrad), lp.transweak); localFactor = pow_F(calcLocalFactor(lox, loy, lp.xc, lp.lxL, lp.yc, lp.ly, ach, lp.transgrad), lp.transweak);
} }
@ -1415,7 +1440,6 @@ static void calcTransition(const float lox, const float loy, const float ach, co
} }
} }
// Copyright 2018 Alberto Griggio <alberto.griggio@gmail.com> // Copyright 2018 Alberto Griggio <alberto.griggio@gmail.com>
//J.Desmis 12 2019 - I will try to port a raw process in local adjustements //J.Desmis 12 2019 - I will try to port a raw process in local adjustements
// I choose this one because, it is "new" // I choose this one because, it is "new"
@ -3333,11 +3357,10 @@ void ImProcFunctions::deltaEforMask(float **rdE, int bfw, int bfh, LabImage* buf
for (int y = 0; y < bfh; y++) { for (int y = 0; y < bfh; y++) {
for (int x = 0; x < bfw; x++) { for (int x = 0; x < bfw; x++) {
float abdelta2 = SQR(refa - bufcolorig->a[y][x] / 327.68f) + SQR(refb - bufcolorig->b[y][x] / 327.68f); const float abdelta2 = SQR(refa - bufcolorig->a[y][x] / 327.68f) + SQR(refb - bufcolorig->b[y][x] / 327.68f);
float chrodelta2 = SQR(std::sqrt(SQR(bufcolorig->a[y][x] / 327.68f) + SQR(bufcolorig->b[y][x] / 327.68f)) - (chromaref)); const float chrodelta2 = SQR(std::sqrt(SQR(bufcolorig->a[y][x]) + SQR(bufcolorig->b[y][x])) / 327.68f - chromaref);
float huedelta2 = abdelta2 - chrodelta2; const float huedelta2 = abdelta2 - chrodelta2;
const float tempdE = std::sqrt(kab * (kch * chrodelta2 + kH * huedelta2) + kL * SQR(refL - bufcolorig->L[y][x] / 327.68f));
float tempdE = std::sqrt(kab * (kch * chrodelta2 + kH * huedelta2) + kL * SQR(refL - bufcolorig->L[y][x] / 327.68f));
float reducdE; float reducdE;
if (tempdE > maxdE) { if (tempdE > maxdE) {
@ -3370,62 +3393,11 @@ void ImProcFunctions::deltaEforMask(float **rdE, int bfw, int bfh, LabImage* buf
} }
} }
static void deltaEforLaplace(float *dE, const local_params& lp, int bfw, int bfh, LabImage* bufexporig, const float hueref, const float chromaref, const float lumaref)
{
const float refa = chromaref * cos(hueref);
const float refb = chromaref * sin(hueref);
const float refL = lumaref;
float maxdE = 5.f + MAXSCOPE * lp.lap;
float *dEforLaplace = new float [bfw * bfh];
float maxC = std::sqrt((SQR(refa - bufexporig->a[0][0] / 327.68f) + SQR(refb - bufexporig->b[0][0] / 327.68f)) + SQR(refL - bufexporig->L[0][0] / 327.68f));
#ifdef _OPENMP
#pragma omp parallel for reduction(max:maxC)
#endif
for (int y = 0; y < bfh; y++) {
for (int x = 0; x < bfw; x++) {
dEforLaplace[y * bfw + x] = std::sqrt((SQR(refa - bufexporig->a[y][x] / 327.68f) + SQR(refb - bufexporig->b[y][x] / 327.68f)) + SQR(refL - bufexporig->L[y][x] / 327.68f));
maxC = rtengine::max(maxC, dEforLaplace[y * bfw + x]);
}
}
if (maxdE > maxC) {
maxdE = maxC - 1.f;
}
float ade = 1.f / (maxdE - maxC);
float bde = -ade * maxC;
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
for (int y = 0; y < bfh; y++) {
for (int x = 0; x < bfw; x++) {
float reducdEforLap = 1.f;
if (dEforLaplace[y * bfw + x] < maxdE) {
reducdEforLap = 1.f;
} else {
reducdEforLap = ade * dEforLaplace[y * bfw + x] + bde;
}
dE[y * bfw + x] = reducdEforLap;
}
}
delete [] dEforLaplace;
}
static void showmask(int lumask, const local_params& lp, int xstart, int ystart, int cx, int cy, int bfw, int bfh, LabImage* bufexporig, LabImage* transformed, LabImage* bufmaskorigSH, int inv) static void showmask(int lumask, const local_params& lp, int xstart, int ystart, int cx, int cy, int bfw, int bfh, LabImage* bufexporig, LabImage* transformed, LabImage* bufmaskorigSH, int inv)
{ {
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) #pragma omp parallel for schedule(dynamic,16)
#endif #endif
for (int y = 0; y < bfh; y++) { for (int y = 0; y < bfh; y++) {
const int loy = y + ystart + cy; const int loy = y + ystart + cy;
@ -10102,11 +10074,8 @@ void ImProcFunctions::Lab_Local(
calcLocalParams(sp, oW, oH, params->locallab, lp, prevDeltaE, llColorMask, llColorMaskinv, llExpMask, llExpMaskinv, llSHMask, llSHMaskinv, llvibMask, lllcMask, llsharMask, llcbMask, llretiMask, llsoftMask, lltmMask, llblMask, locwavCurveden, locwavdenutili); calcLocalParams(sp, oW, oH, params->locallab, lp, prevDeltaE, llColorMask, llColorMaskinv, llExpMask, llExpMaskinv, llSHMask, llSHMaskinv, llvibMask, lllcMask, llsharMask, llcbMask, llretiMask, llsoftMask, lltmMask, llblMask, locwavCurveden, locwavdenutili);
const float radius = lp.rad / (sk * 1.4f); //0 to 70 ==> see skip const float radius = lp.rad / (sk * 1.4f); //0 to 70 ==> see skip
int strred = 1;//(lp.strucc - 1);
float radiussob = strred / (sk * 1.4f);
int levred; int levred;
bool noiscfactiv = false; bool noiscfactiv;
if (lp.qualmet == 2) { //suppress artifacts with quality enhanced if (lp.qualmet == 2) { //suppress artifacts with quality enhanced
levred = 4; levred = 4;
@ -10132,7 +10101,6 @@ void ImProcFunctions::Lab_Local(
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) if(multiThread) #pragma omp parallel for schedule(dynamic,16) if(multiThread)
#endif #endif
for (int y = std::max(begy - cy, 0); y < std::min(yEn - cy, original->H); y++) { for (int y = std::max(begy - cy, 0); y < std::min(yEn - cy, original->H); y++) {
const int loy = cy + y; const int loy = cy + y;
@ -10146,13 +10114,13 @@ void ImProcFunctions::Lab_Local(
} }
array2D<float> ble(bfw, bfh); array2D<float> ble(bfw, bfh);
const float radiussob = 1.f / (sk * 1.4f);
SobelCannyLuma(ble, bufsob, bfw, bfh, radiussob, true); SobelCannyLuma(ble, bufsob, bfw, bfh, radiussob, true);
array2D<float> &guid = bufsob; array2D<float> &guid = bufsob;
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for if(multiThread) #pragma omp parallel for if(multiThread)
#endif #endif
for (int ir = 0; ir < bfh; ir++) for (int ir = 0; ir < bfh; ir++)
for (int jr = 0; jr < bfw; jr++) { for (int jr = 0; jr < bfw; jr++) {
ble[ir][jr] /= 32768.f; ble[ir][jr] /= 32768.f;
@ -10171,7 +10139,6 @@ void ImProcFunctions::Lab_Local(
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for reduction(+:sombel) if(multiThread) #pragma omp parallel for reduction(+:sombel) if(multiThread)
#endif #endif
for (int ir = 0; ir < bfh; ir++) { for (int ir = 0; ir < bfh; ir++) {
for (int jr = 0; jr < bfw; jr++) { for (int jr = 0; jr < bfw; jr++) {
const float val = ble[ir][jr] * 32768.f; const float val = ble[ir][jr] * 32768.f;
@ -10181,9 +10148,7 @@ void ImProcFunctions::Lab_Local(
} }
const float meansob = sombel / ncsobel; const float meansob = sombel / ncsobel;
Exclude_Local(deltasobelL, hueref, chromaref, lumaref, sobelref, meansob, lp, original, transformed, &bufreserv, reserved, cx, cy, sk); Exclude_Local(deltasobelL, hueref, chromaref, lumaref, sobelref, meansob, lp, original, transformed, &bufreserv, reserved, cx, cy, sk);
} }
//encoding lab at the beginning //encoding lab at the beginning
@ -10202,7 +10167,6 @@ void ImProcFunctions::Lab_Local(
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) if(multiThread) #pragma omp parallel for schedule(dynamic,16) if(multiThread)
#endif #endif
for (int y = ystart; y < yend; y++) { for (int y = ystart; y < yend; y++) {
for (int x = xstart; x < xend; x++) { for (int x = xstart; x < xend; x++) {
bufexporig->L[y - ystart][x - xstart] = original->L[y][x]; bufexporig->L[y - ystart][x - xstart] = original->L[y][x];
@ -10215,9 +10179,7 @@ void ImProcFunctions::Lab_Local(
std::unique_ptr<Imagefloat> tmpImage(new Imagefloat(bfw, bfh)); std::unique_ptr<Imagefloat> tmpImage(new Imagefloat(bfw, bfh));
lab2rgb(*bufexpfin, *tmpImage, params->icm.workingProfile); lab2rgb(*bufexpfin, *tmpImage, params->icm.workingProfile);
log_encode(tmpImage.get(), lp, multiThread, bfw, bfh); log_encode(tmpImage.get(), lp, multiThread, bfw, bfh);
rgb2lab(*(tmpImage.get()), *bufexpfin, params->icm.workingProfile); rgb2lab(*(tmpImage.get()), *bufexpfin, params->icm.workingProfile);
tmpImage.reset(); tmpImage.reset();
//here begin graduated filter //here begin graduated filter
@ -10228,7 +10190,6 @@ void ImProcFunctions::Lab_Local(
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) if(multiThread) #pragma omp parallel for schedule(dynamic,16) if(multiThread)
#endif #endif
for (int ir = 0; ir < bfh; ir++) { for (int ir = 0; ir < bfh; ir++) {
for (int jr = 0; jr < bfw; jr++) { for (int jr = 0; jr < bfw; jr++) {
bufexpfin->L[ir][jr] *= ImProcFunctions::calcGradientFactor(gplog, jr, ir); bufexpfin->L[ir][jr] *= ImProcFunctions::calcGradientFactor(gplog, jr, ir);
@ -10250,7 +10211,7 @@ void ImProcFunctions::Lab_Local(
//Prepare mask for Blur and noise and Denoise //Prepare mask for Blur and noise and Denoise
bool denoiz = false; bool denoiz = false;
if (((lp.noiself > 0.f || lp.noiself0 > 0.f || lp.noiself2 > 0.f || lp.noiselc > 0.f || lp.noisecf > 0.f || lp.noisecc > 0.f || lp.bilat > 0.f) && lp.denoiena)) { if ((lp.noiself > 0.f || lp.noiself0 > 0.f || lp.noiself2 > 0.f || lp.noiselc > 0.f || lp.noisecf > 0.f || lp.noisecc > 0.f || lp.bilat > 0.f) && lp.denoiena) {
denoiz = true; denoiz = true;
} }
@ -10300,11 +10261,10 @@ void ImProcFunctions::Lab_Local(
} }
} }
float strumask = 0.02f * params->locallab.spots.at(sp).strumaskbl; const float strumask = 0.02f * params->locallab.spots.at(sp).strumaskbl;
JaggedArray<float> blendstru(GW, GH); JaggedArray<float> blendstru(GW, GH);
if (lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) { if (lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) {
if (strumask > 0.f) { if (strumask > 0.f) {
float delstrumask = 4.1f - strumask;//4.1 = 2 * max slider strumask + 0.1 float delstrumask = 4.1f - strumask;//4.1 = 2 * max slider strumask + 0.1
buildBlendMask(bufgb->L, blendstru, GW, GH, delstrumask); buildBlendMask(bufgb->L, blendstru, GW, GH, delstrumask);
@ -10322,7 +10282,7 @@ void ImProcFunctions::Lab_Local(
} }
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) #pragma omp parallel for schedule(dynamic,16) if (multiThread)
#endif #endif
for (int ir = 0; ir < GH; ir++) { for (int ir = 0; ir < GH; ir++) {
@ -12094,10 +12054,6 @@ void ImProcFunctions::Lab_Local(
} }
} }
// soft light and retinex_pde // soft light and retinex_pde
if (lp.strng > 0.f && call <= 3 && lp.sfena) { if (lp.strng > 0.f && call <= 3 && lp.sfena) {
int ystart = std::max(static_cast<int>(lp.yc - lp.lyT) - cy, 0); int ystart = std::max(static_cast<int>(lp.yc - lp.lyT) - cy, 0);
@ -12122,7 +12078,6 @@ void ImProcFunctions::Lab_Local(
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) #pragma omp parallel for schedule(dynamic,16)
#endif #endif
for (int y = ystart; y < yend; y++) { for (int y = ystart; y < yend; y++) {
for (int x = xstart; x < xend; x++) { for (int x = xstart; x < xend; x++) {
bufexporig->L[y - ystart][x - xstart] = original->L[y][x]; bufexporig->L[y - ystart][x - xstart] = original->L[y][x];
@ -12139,45 +12094,33 @@ void ImProcFunctions::Lab_Local(
if (lp.softmet == 0) { if (lp.softmet == 0) {
ImProcFunctions::softLight(bufexpfin.get(), softLightParams); ImProcFunctions::softLight(bufexpfin.get(), softLightParams);
} else if (lp.softmet == 1) { } else if (lp.softmet == 1) {
MyMutex::MyLock lock(*fftwMutex);
float *datain = new float[bfwr * bfhr]; const std::unique_ptr<float[]> datain(new float[bfwr * bfhr]);
float *dataout = new float[bfwr * bfhr]; const std::unique_ptr<float[]> dataout(new float[bfwr * bfhr]);
float *dE = new float[bfwr * bfhr]; const std::unique_ptr<float[]> dE(new float[bfwr * bfhr]);
deltaEforLaplace(dE, lp, bfwr, bfhr, bufexpfin.get(), hueref, chromaref, lumaref); deltaEforLaplace(dE.get(), lp.lap, bfwr, bfhr, bufexpfin.get(), hueref, chromaref, lumaref);
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) #pragma omp parallel for schedule(dynamic,16)
#endif #endif
for (int y = 0; y < bfhr; y++) { for (int y = 0; y < bfhr; y++) {
for (int x = 0; x < bfwr; x++) { for (int x = 0; x < bfwr; x++) {
datain[y * bfwr + x] = bufexpfin->L[y][x]; datain[y * bfwr + x] = bufexpfin->L[y][x];
} }
} }
int showorig = lp.showmasksoftmet; const int showorig = lp.showmasksoftmet >= 5 ? 0 : lp.showmasksoftmet;
MyMutex::MyLock lock(*fftwMutex);
if (lp.showmasksoftmet >= 5) { ImProcFunctions::retinex_pde(datain.get(), dataout.get(), bfwr, bfhr, 8.f * lp.strng, 1.f, dE.get(), showorig, 1, 1);
showorig = 0;
}
ImProcFunctions::retinex_pde(datain, dataout, bfwr, bfhr, 8.f * lp.strng, 1.f, dE, showorig, 1, 1);
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) #pragma omp parallel for schedule(dynamic,16)
#endif #endif
for (int y = 0; y < bfhr; y++) { for (int y = 0; y < bfhr; y++) {
for (int x = 0; x < bfwr; x++) { for (int x = 0; x < bfwr; x++) {
// bufexpfin->L[y][x] = dataout[y * bfwr + x] + bufexpfin->L[y][x];
bufexpfin->L[y][x] = dataout[y * bfwr + x]; bufexpfin->L[y][x] = dataout[y * bfwr + x];
} }
} }
delete [] datain;
delete [] dataout;
delete [] dE;
} }
transit_shapedetect2(call, 3, bufexporig.get(), bufexpfin.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); transit_shapedetect2(call, 3, bufexporig.get(), bufexpfin.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk);
@ -12190,69 +12133,56 @@ void ImProcFunctions::Lab_Local(
} }
} }
//local contrast //local contrast
bool wavcurve = false; bool wavcurve = false;
bool wavcurvelev = false;
bool wavcurvecon = false;
bool wavcurvecomp = false;
bool wavcurvecompre = false;
if (locwavCurve && locwavutili) {
if (lp.locmet == 1) { if (lp.locmet == 1) {
if (locwavCurve && locwavutili) {
for (int i = 0; i < 500; i++) { for (int i = 0; i < 500; i++) {
if (locwavCurve[i] != 0.5) { if (locwavCurve[i] != 0.5) {
wavcurve = true; wavcurve = true;
break;
} }
} }
} }
}
bool wavcurvelev = false;
if (loclevwavCurve && loclevwavutili) { if (loclevwavCurve && loclevwavutili) {
if (lp.locmet == 1) {
for (int i = 0; i < 500; i++) { for (int i = 0; i < 500; i++) {
if (loclevwavCurve[i] != 0.) { if (loclevwavCurve[i] != 0.) {
wavcurvelev = true; wavcurvelev = true;
break;
} }
} }
} }
}
bool wavcurvecon = false;
if (locconwavCurve && locconwavutili) { if (locconwavCurve && locconwavutili) {
if (lp.locmet == 1) {
for (int i = 0; i < 500; i++) { for (int i = 0; i < 500; i++) {
if (locconwavCurve[i] != 0.5) { if (locconwavCurve[i] != 0.5) {
wavcurvecon = true; wavcurvecon = true;
break;
} }
} }
} }
}
bool wavcurvecomp = false;
if (loccompwavCurve && loccompwavutili) { if (loccompwavCurve && loccompwavutili) {
if (lp.locmet == 1) {
for (int i = 0; i < 500; i++) { for (int i = 0; i < 500; i++) {
if (loccompwavCurve[i] != 0.) { if (loccompwavCurve[i] != 0.) {
wavcurvecomp = true; wavcurvecomp = true;
break;
} }
} }
} }
}
bool wavcurvecompre = false;
if (loccomprewavCurve && loccomprewavutili) { if (loccomprewavCurve && loccomprewavutili) {
if (lp.locmet == 1) {
for (int i = 0; i < 500; i++) { for (int i = 0; i < 500; i++) {
if (loccomprewavCurve[i] != 0.75) { if (loccomprewavCurve[i] != 0.75) {
wavcurvecompre = true; wavcurvecompre = true;
break;
} }
} }
} }
} }
if ((lp.lcamount > 0.f || wavcurve || lp.showmasklcmet == 2 || lp.enalcMask || lp.showmasklcmet == 3 || lp.showmasklcmet == 4 || lp.prevdE || lp.strwav != 0.f || wavcurvelev || wavcurvecon || wavcurvecomp || wavcurvecompre || lp.edgwena || params->locallab.spots.at(sp).residblur > 0.f || params->locallab.spots.at(sp).levelblur > 0.f || params->locallab.spots.at(sp).residcont != 0.f || params->locallab.spots.at(sp).clarilres != 0.f || params->locallab.spots.at(sp).claricres != 0.f) && call < 3 && lp.lcena) { if ((lp.lcamount > 0.f || wavcurve || lp.showmasklcmet == 2 || lp.enalcMask || lp.showmasklcmet == 3 || lp.showmasklcmet == 4 || lp.prevdE || lp.strwav != 0.f || wavcurvelev || wavcurvecon || wavcurvecomp || wavcurvecompre || lp.edgwena || params->locallab.spots.at(sp).residblur > 0.f || params->locallab.spots.at(sp).levelblur > 0.f || params->locallab.spots.at(sp).residcont != 0.f || params->locallab.spots.at(sp).clarilres != 0.f || params->locallab.spots.at(sp).claricres != 0.f) && call < 3 && lp.lcena) {
int ystart = std::max(static_cast<int>(lp.yc - lp.lyT) - cy, 0); int ystart = std::max(static_cast<int>(lp.yc - lp.lyT) - cy, 0);