newlocallab: further cleanups, #5246

This commit is contained in:
heckflosse
2019-04-02 17:32:57 +02:00
parent bdfeb76fa5
commit 724cb27b98
2 changed files with 127 additions and 220 deletions

View File

@@ -295,12 +295,12 @@ public:
int pitch, int scale, const int luma, const int chroma/*, LUTf & Lcurve, LUTf & abcurve*/);
//locallab
void MSRLocal(int sp, float** luminance, float** templ, const float* const *originalLuminance, const int width, const int height, const procparams::LocallabParams &loc, const int skip, const LocretigainCurve &locRETgainCcurve, const int chrome, const int scall, const float krad, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax);
void calc_ref(int sp, LabImage* original, LabImage* transformed, int cx, int cy, int oW, int oH, int sk, double &huerefblur, double &chromarefblur, double &lumarefblur, double &huere, double &chromare, double &lumare, double &sobelref, float &avg);
void calc_ref(int sp, LabImage* original, LabImage* transformed, int cx, int cy, int oW, int oH, int sk, double &huerefblur, double &chromarefblur, double &lumarefblur, double &hueref, double &chromaref, double &lumaref, double &sobelref, float &avg);
void copy_ref(LabImage* spotbuffer, LabImage* original, LabImage* transformed, int cx, int cy, int sk, const struct local_params & lp, double &huerefspot, double &chromarefspot, double &lumarefspot);
void paste_ref(LabImage* spotbuffer, LabImage* transformed, int cx, int cy, int sk, const struct local_params & lp);
void Lab_Local(int call, int sp, float** shbuffer, LabImage* original, LabImage* transformed, LabImage* reserved, int cx, int cy, int oW, int oH, int sk, const LocretigainCurve & locRETgainCcurve, LUTf & lllocalcurve, bool & locallutili, const LocLHCurve & loclhCurve, const LocHHCurve & lochhCurve, const LocCCmaskCurve & locccmasCurve, bool & lcmasutili, const LocLLmaskCurve & locllmasCurve, bool & llmasutili, const LocHHmaskCurve & lochhmasCurve, bool & lhmasutili, const LocCCmaskexpCurve & locccmasexpCurve, bool &lcmasexputili, const LocLLmaskexpCurve & locllmasexpCurve, bool &llmasexputili, const LocHHmaskexpCurve & lochhmasexpCurve, bool & lhmasexputili,
const LocCCmaskSHCurve & locccmasSHCurve, bool &lcmasSHutili, const LocLLmaskSHCurve & locllmasSHCurve, bool &llmasSHutili, const LocHHmaskSHCurve & lochhmasSHCurve, bool & lhmasSHutili,
bool &LHutili, bool &HHutili, LUTf & cclocalcurve, bool & localcutili, bool & localexutili, LUTf & exlocalcurve, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, LUTf & lightCurveloc, double & huerefblur, double &chromarefblur, double & lumarefblur, double &hueref, double &chromaref, double &lumaref, double &sobelref, int llColorMask, int llExpMask, int llSHMask);
bool &LHutili, bool &HHutili, LUTf & cclocalcurve, bool & localcutili, bool & localexutili, LUTf & exlocalcurve, LUTf & hltonecurveloc, LUTf & shtonecurveloc, LUTf & tonecurveloc, LUTf & lightCurveloc, double & huerefblur, double &chromarefblur, double & lumarefblur, double &hueref, double &chromaref, double &lumaref, double &sobelref, int llColorMask, int llExpMask, int llSHMask);
void addGaNoise(LabImage *lab, LabImage *dst, const float mean, const float variance, const int sk);
void BlurNoise_Localold(int call, const struct local_params& lp, LabImage* original, LabImage* transformed, const LabImage* const tmp1, int cx, int cy);
void InverseBlurNoise_Local(const struct local_params& lp, LabImage* original, LabImage* transformed, const LabImage* const tmp1, int cx, int cy);

View File

@@ -5263,59 +5263,14 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
if (!adecomp.memoryAllocationFailed) {
/*
// Ain = new array2D<float>(bfw, bfh);
#ifdef _OPENMP
#pragma omp parallel for
#endif
for (int i = 0; i < bfh; ++i) {
for (int j = 0; j < bfw; ++j) {
(*Ain)[i][j] = bufwv.a[i][j];
}
}
*/
adecomp.reconstruct(bufwv.a[0]);
}
/*
if (!adecomp.memoryAllocationFailed) {
if ((lp.noisecf >= 0.1f || lp.noisecc >= 0.1f)) {
// fftw_denoise(bfw, bfh, max_numblox_W, min_numblox_W, bufwv.a, Ain, numThreads, lp, 1);
}
}
*/
if (!bdecomp.memoryAllocationFailed) {
/*
// Bin = new array2D<float>(bfw, bfh);
#ifdef _OPENMP
#pragma omp parallel for
#endif
for (int i = 0; i < bfh; ++i) {
for (int j = 0; j < bfw; ++j) {
(*Bin)[i][j] = bufwv.b[i][j];
}
}
*/
bdecomp.reconstruct(bufwv.b[0]);
}
/*
if (!bdecomp.memoryAllocationFailed) {
if ((lp.noisecf >= 0.1f || lp.noisecc >= 0.1f)) {
// fftw_denoise(bfw, bfh, max_numblox_W, min_numblox_W, bufwv.b, Bin, numThreads, lp, 1);
}
}
*/
DeNoise_Local(call, lp, levred, huerefblur, lumarefblur, chromarefblur, original, transformed, bufwv, cx, cy, sk);
}
@@ -5339,9 +5294,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
std::unique_ptr<LabImage> bufexporig(new LabImage(bfw, bfh)); //buffer for data in zone limit
std::unique_ptr<LabImage> bufexpfin(new LabImage(bfw, bfh)); //buffer for data in zone limit
#ifdef _OPENMP
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
#endif
for (int y = ystart; y < yend; y++) {
for (int x = xstart; x < xend; x++) {
@@ -5363,9 +5318,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
bufexpfin->CopyFrom(bufexporig.get());
ImProcFunctions::vibrance(bufexpfin.get(), vibranceParams, params->toneCurve.hrenabled, params->icm.workingProfile);
#ifdef _OPENMP
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
#endif
for (int y = 0; y < bfh; y++) {
for (int x = 0; x < bfw; x++) {
@@ -5398,9 +5353,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
std::unique_ptr<LabImage> bufgb(new LabImage(bfw, bfh)); //buffer for data in zone limit
std::unique_ptr<LabImage> tmp1(new LabImage(bfw, bfh)); //buffer for data in zone limit
#ifdef _OPENMP
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
#endif
for (int y = ystart; y < yend; y++) {
for (int x = xstart; x < xend; x++) {
@@ -5412,9 +5367,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
ImProcFunctions::EPDToneMaplocal(sp, bufgb.get(), tmp1.get(), 5, sk);
#ifdef _OPENMP
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
#endif
for (int y = 0; y < bfh; y++) {
for (int x = 0; x < bfw; x++) {
@@ -5453,9 +5408,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
constexpr double skinprot = 0.;
constexpr int choice = 0;
#ifdef _OPENMP
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
#endif
for (int y = ystart; y < yend; y++) {
for (int x = xstart; x < xend; x++) {
@@ -5467,9 +5422,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
ImProcFunctions::cbdl_local_temp(bufsh, loctemp->L, bfw, bfh, lp.mulloc, 1.f, lp.threshol, skinprot, false, b_l, t_l, t_r, b_r, choice, sk);
#ifdef _OPENMP
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
#endif
for (int ir = 0; ir < bfh; ir++) {
for (int jr = 0; jr < bfw; jr++) {
@@ -5486,9 +5441,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
//chroma CBDL begin here
if (lp.chromacb > 0.f) {
#ifdef _OPENMP
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
#endif
for (int ir = 0; ir < bfh; ir++) {
for (int jr = 0; jr < bfw; jr++) {
bufsh[ir][jr] = sqrt(SQR(loctemp->a[ir][jr]) + SQR(loctemp->b[ir][jr]));
@@ -5502,9 +5457,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
ImProcFunctions::cbdl_local_temp(bufsh, loctemp->L, bfw, bfh, multc, rtengine::max(lp.chromacb, 1.f), lp.threshol, skinprot, false, b_l, t_l, t_r, b_r, choice, sk);
#ifdef _OPENMP
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
#endif
for (int ir = 0; ir < bfh; ir++) {
for (int jr = 0; jr < bfw; jr++) {
@@ -5555,9 +5510,18 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
mean_fab(xstart, ystart, bfw, bfh, bufexporig.get(), original, fab, meanfab, lp.chromaSH);
LUTf *gammamaskSH = nullptr;
LUTf lutTonemaskSH;
lutTonemaskSH(65536);
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
for (int y = 0; y < bfh; y++) {
for (int x = 0; x < bfw; x++) {
bufexporig->L[y][x] = original->L[y + ystart][x + xstart];
}
}
if (lp.showmaskSHmet == 2 || lp.enaSHMask || lp.showmaskSHmet == 3 || lp.showmaskSHmet == 4) {
LUTf lutTonemaskSH(65536);
double pwr = 1.0 / lp.gammaSH;
double gamm = lp.gammaSH;
double ts = lp.slomaSH;
@@ -5584,7 +5548,6 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
double mul = 1. + g_a[4];
for (int i = 0; i < 65536; i++) {
double val = (i) / 65535.;
double x;
@@ -5598,40 +5561,14 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
lutTonemaskSH[i] = CLIP(x * 65535.); // CLIP avoid in some case extra values
}
gammamaskSH = &lutTonemaskSH;
#ifdef _OPENMP
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
for (int y = 0; y < bfh; y++) //{
for (int x = 0; x < bfw; x++) {
if (lp.showmaskSHmet == 2 || lp.enaSHMask || lp.showmaskSHmet == 3 || lp.showmaskSHmet == 4) {
bufmaskorigSH->L[y][x] = original->L[y + ystart][x + xstart];
bufmaskorigSH->a[y][x] = original->a[y + ystart][x + xstart];
bufmaskorigSH->b[y][x] = original->b[y + ystart][x + xstart];
bufmaskblurSH->L[y][x] = original->L[y + ystart][x + xstart];
bufmaskblurSH->a[y][x] = original->a[y + ystart][x + xstart];
bufmaskblurSH->b[y][x] = original->b[y + ystart][x + xstart];
}
bufexporig->L[y][x] = original->L[y + ystart][x + xstart];
}
if (lp.showmaskSHmet == 2 || lp.enaSHMask || lp.showmaskSHmet == 3 || lp.showmaskSHmet == 4) {
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
#endif
for (int ir = 0; ir < bfh; ir++) {
for (int jr = 0; jr < bfw; jr++) {
float kmaskLexp = 0;
float kmaskC = 0;
float kmaskHL = 0;
float kmaskH = 0;
float kmaskCH = 0;
if (locllmasSHCurve && llmasSHutili) {
float ligh = bufexporig->L[ir][jr] / 32768.f;
@@ -5641,10 +5578,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
if (lp.showmaskSHmet != 4) {
if (locccmasSHCurve && lcmasSHutili) {
float chromask = 0.0001f + sqrt(SQR((bufexporig->a[ir][jr]) / fab) + SQR((bufexporig->b[ir][jr]) / fab));
float chromaskr = chromask;
float valCC = float (locccmasSHCurve[500.f * chromaskr]);
valCC = LIM01(1.f - valCC);
kmaskC = valCC;
kmaskCH = LIM01(1.f - locccmasSHCurve[500.f * chromask]);
}
}
@@ -5660,15 +5594,15 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
float valHH = LIM01(1.f - lochhmasSHCurve[500.f * h]);
if (lp.showmaskSHmet != 4) {
kmaskH = valHH;
kmaskCH += valHH;
}
kmaskHL = 32768.f * valHH;
kmaskLexp += 32768.f * valHH;
}
bufmaskblurSH->L[ir][jr] = CLIPLOC(kmaskLexp + kmaskHL);
bufmaskblurSH->a[ir][jr] = kmaskC + kmaskH;
bufmaskblurSH->b[ir][jr] = kmaskC + kmaskH;
bufmaskblurSH->L[ir][jr] = CLIPLOC(kmaskLexp);
bufmaskblurSH->a[ir][jr] = kmaskCH;
bufmaskblurSH->b[ir][jr] = kmaskCH;
ble[ir][jr] = bufmaskblurSH->L[ir][jr] / 32768.f;
guid[ir][jr] = bufexporig->L[ir][jr] / 32768.f;
@@ -5679,16 +5613,16 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
guidedFilter(guid, ble, ble, lp.radmaSH * 10.f / sk, 0.001, multiThread, 4);
}
#ifdef _OPENMP
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
#endif
for (int ir = 0; ir < bfh; ir++)
for (int jr = 0; jr < bfw; jr++) {
float L_;
bufmaskblurSH->L[ir][jr] = LIM01(ble[ir][jr]) * 32768.f;
L_ = 2.f * bufmaskblurSH->L[ir][jr];
bufmaskblurSH->L[ir][jr] = 0.5f * (*gammamaskSH)[L_];
bufmaskblurSH->L[ir][jr] = 0.5f * lutTonemaskSH[L_];
}
}
@@ -5698,9 +5632,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
if (lp.showmaskSHmet == 2 || lp.enaSHMask || lp.showmaskSHmet == 3 || lp.showmaskSHmet == 4) {
#ifdef _OPENMP
#ifdef _OPENMP
#pragma omp parallel
#endif
#endif
{
gaussianBlur(bufmaskblurSH->L, bufmaskorigSH->L, bfw, bfh, radiusb);
gaussianBlur(bufmaskblurSH->a, bufmaskorigSH->a, bfw, bfh, 1.f + (0.5f * lp.radmaSH) / sk);
@@ -5719,9 +5653,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
if (lp.showmaskSHmet == 0 || lp.showmaskSHmet == 1 || lp.showmaskSHmet == 2 || lp.showmaskSHmet == 4 || lp.enaSHMask) {
#ifdef _OPENMP
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
#endif
for (int y = 0; y < bfh ; y++) {
for (int x = 0; x < bfw; x++) {
@@ -5736,9 +5670,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
ImProcFunctions::shadowsHighlights(bufexpfin.get(), lp.hsena, 1, lp.highlihs, lp.shadowhs, lp.radiushs, sk, lp.hltonalhs, lp.shtonalhs);
#ifdef _OPENMP
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
#endif
for (int ir = 0; ir < bfh; ir++) {
for (int jr = 0; jr < bfw; jr++) {
@@ -6203,7 +6137,6 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
if (bfw > 0 && bfh > 0) {
std::unique_ptr<LabImage> bufexporig(new LabImage(bfw, bfh));
std::unique_ptr<LabImage> bufexpfin(new LabImage(bfw, bfh));
std::unique_ptr<LabImage> bufmaskorigexp;
std::unique_ptr<LabImage> bufmaskblurexp;
std::unique_ptr<LabImage> originalmaskexp;
@@ -6218,8 +6151,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
float meansob = 0.f;
if (lp.showmaskexpmet == 2 || lp.enaExpMask || lp.showmaskexpmet == 3 || lp.showmaskexpmet == 5) {
bufmaskorigexp.reset(new LabImage(bfw, bfh, true));
bufmaskblurexp.reset(new LabImage(bfw, bfh, true));
bufmaskblurexp.reset(new LabImage(bfw, bfh));
originalmaskexp.reset(new LabImage(bfw, bfh));
}
@@ -6279,9 +6211,8 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
mean_fab(xstart, ystart, bfw, bfh, bufexporig.get(), original, fab, meanfab, lp.chromaexp);
LUTf *gammamask = nullptr;
LUTf lutTonemask;
lutTonemask(65536);
if (lp.showmaskexpmet == 2 || lp.enaExpMask || lp.showmaskexpmet == 3 || lp.showmaskexpmet == 5) {
LUTf lutTonemask(65536);
double pwr = 1.0 / lp.gammaexp;
double gamm = lp.gammaexp;
double ts = lp.slomaexp;
@@ -6321,28 +6252,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
lutTonemask[i] = CLIP(x * 65535.); // CLIP avoid in some case extra values
}
gammamask = &lutTonemask;
if (lp.showmaskexpmet == 2 || lp.enaExpMask || lp.showmaskexpmet == 3 || lp.showmaskexpmet == 5) {
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
for (int y = 0; y < bfh; y++) {
for (int x = 0; x < bfw; x++) {
bufmaskorigexp->L[y][x] = original->L[y + ystart][x + xstart];
bufmaskorigexp->a[y][x] = original->a[y + ystart][x + xstart];
bufmaskorigexp->b[y][x] = original->b[y + ystart][x + xstart];
}
}
bufmaskblurexp->CopyFrom(bufmaskorigexp.get());
}
if (lp.showmaskexpmet == 2 || lp.enaExpMask || lp.showmaskexpmet == 3 || lp.showmaskexpmet == 5) {
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
for (int ir = 0; ir < bfh; ir++)
for (int jr = 0; jr < bfw; jr++) {
@@ -6382,49 +6294,44 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
kmaskHL = 32768.f * valHH;
}
bufmaskblurexp->L[ir][jr] = CLIPLOC(kmaskLexp + kmaskHL);
bufmaskblurexp->a[ir][jr] = kmaskC + kmaskH;
bufmaskblurexp->b[ir][jr] = kmaskC + kmaskH;
(*ble)[ir][jr] = LIM01(bufmaskblurexp->L[ir][jr] / 32768.f);
(*ble)[ir][jr] = LIM01(CLIPLOC(kmaskLexp + kmaskHL) / 32768.f);
(*guid)[ir][jr] = LIM01(bufexporig->L[ir][jr] / 32768.f);
}
if (lp.radmaexp > 0.f) {
guidedFilter(*guid, *ble, *ble, lp.radmaexp * 10.f / sk, 0.001, multiThread, 4);
}
#ifdef _OPENMP
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
#endif
for (int ir = 0; ir < bfh; ir++) {
for (int jr = 0; jr < bfw; jr++) {
const float L_ = 2.f * LIM01((*ble)[ir][jr]) * 32768.f;
bufmaskblurexp->L[ir][jr] = 0.5f * (*gammamask)[L_];
}
bufmaskblurexp->L[ir][jr] = 0.5f * lutTonemask[L_];
}
}
const float radiusb = 1.f / sk;
if (lp.showmaskexpmet == 2 || lp.enaExpMask || lp.showmaskexpmet == 3 || lp.showmaskexpmet == 5) {
#ifdef _OPENMP
#ifdef _OPENMP
#pragma omp parallel
#endif
#endif
{
gaussianBlur(bufmaskblurexp->L, bufmaskorigexp->L, bfw, bfh, radiusb);
gaussianBlur(bufmaskblurexp->a, bufmaskorigexp->a, bfw, bfh, 1.f + (0.5f * lp.radmaexp) / sk);
gaussianBlur(bufmaskblurexp->b, bufmaskorigexp->b, bfw, bfh, 1.f + (0.5f * lp.radmaexp) / sk);
gaussianBlur(bufmaskblurexp->L, bufmaskblurexp->L, bfw, bfh, radiusb);
gaussianBlur(bufmaskblurexp->a, bufmaskblurexp->a, bfw, bfh, 1.f + (0.5f * lp.radmaexp) / sk);
gaussianBlur(bufmaskblurexp->b, bufmaskblurexp->b, bfw, bfh, 1.f + (0.5f * lp.radmaexp) / sk);
}
if (lp.showmaskexpmet == 0 || lp.showmaskexpmet == 1 || lp.showmaskexpmet == 2 || lp.showmaskexpmet == 4 || lp.showmaskexpmet == 5 || lp.enaExpMask) {
blendmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), original, bufmaskorigexp.get(), originalmaskexp.get(), lp.blendmaexp);
blendmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), original, bufmaskblurexp.get(), originalmaskexp.get(), lp.blendmaexp);
} else if (lp.showmaskexpmet == 3) {
showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskorigexp.get());
showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskblurexp.get());
return;
}
}