Added mask to local contrast

This commit is contained in:
Desmis 2019-12-21 12:51:27 +01:00
parent ba750b22a7
commit 46b9aa95e2
8 changed files with 461 additions and 288 deletions

View File

@ -1106,6 +1106,14 @@ HISTORY_MSG_865;Local - Contrast Anchor
HISTORY_MSG_867;Local - Contrast Amount residual
HISTORY_MSG_868;Local - balance ΔE C-H
HISTORY_MSG_869;Local - denoise curve luminance
HISTORY_MSG_870;Local - LC mask curve LC(H)
HISTORY_MSG_871;Local - LC mask curve C(C)
HISTORY_MSG_872;Local - LC mask curve L(L)
HISTORY_MSG_873;Local - LC mask enable
HISTORY_MSG_875;Local - LC mask blend
HISTORY_MSG_876;Local - LC mask radius
HISTORY_MSG_877;Local - LC mask chroma
HISTORY_MSG_878;Local - LC mask curve contrast
HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors
HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction
HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction
@ -2513,12 +2521,13 @@ TP_LOCALLAB_SHARRADIUS;Radius
TP_LOCALLAB_SHORTC;Short Curves 'L' Mask
TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7
TP_LOCALLAB_SHOWC1;Merge file
TP_LOCALLAB_SHOWC;8+* - Mask and modifications
TP_LOCALLAB_SHOWC;9+* - Mask and modifications
TP_LOCALLAB_SHOWCB;2+ - Mask and modifications
TP_LOCALLAB_SHOWDCT;Show process Fourier
TP_LOCALLAB_SHOWE;7+ - Mask and modifications
TP_LOCALLAB_SHOWE;8+ - Mask and modifications
TP_LOCALLAB_SHOWFOURIER;Fourier (dct)
TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first)
TP_LOCALLAB_SHOWLC;6 - Mask and modifications
TP_LOCALLAB_SHOWMASK;Show mask
TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Display modifications.\nBeware, you can only view one modification (color and light or Exposure or Shadows-Highlight or TM or CBDL or Retinex MSR or Blur).\n\nUse Mask is before algorihtm shape detection
TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Show process Fourier:\nShows the different stages of the process.\nLaplace - builds the second derivative according to the threshold (first step).\nFourier -shows the transformed Laplacian with DCT.\nPoisson - show solution of Poisson DCE.\nNormalize - show result whithout normalization luminance.
@ -2528,7 +2537,7 @@ TP_LOCALLAB_SHOWMODIFMASK;Show modifications whith mask
TP_LOCALLAB_SHOWNORMAL;Normalize luminance (no)
TP_LOCALLAB_SHOWPLUS;1+* - Mask and modifications - Smooth-Blur & Denoise
TP_LOCALLAB_SHOWPOISSON;Poisson (pde)
TP_LOCALLAB_SHOWR;6 - Mask and modifications
TP_LOCALLAB_SHOWR;7 - Mask and modifications
TP_LOCALLAB_SHOWS;5+* - Mask and modifications
TP_LOCALLAB_SHOWSTRUC;Show structure Spot
TP_LOCALLAB_SHOWSTRUCEX;Show structure Spot - disabled in "normal"

View File

@ -887,6 +887,7 @@ void Crop::update(int todo)
bool localmaskretiutili = parent->localmaskretiutili;
bool localmaskcbutili = parent->localmaskcbutili;
bool localmaskblutili = parent->localmaskblutili;
bool localmasklcutili = parent->localmasklcutili;
LUTf lmasklocalcurve2(65536, 0);
LUTf lmaskexplocalcurve2(65536, 0);
LUTf lmaskSHlocalcurve2(65536, 0);
@ -895,6 +896,7 @@ void Crop::update(int todo)
LUTf lmaskretilocalcurve2(65536, 0);
LUTf lmaskcblocalcurve2(65536, 0);
LUTf lmaskbllocalcurve2(65536, 0);
LUTf lmasklclocalcurve2(65536, 0);
LUTf hltonecurveloc2(65536, 0); //65536
LUTf shtonecurveloc2(65536, 0);
LUTf tonecurveloc2(65536, 0);
@ -914,6 +916,9 @@ void Crop::update(int todo)
bool lhmasvibutili = parent->lhmasvibutili;
bool lcmasvibutili = parent->lcmasvibutili;
bool llmasvibutili = parent->llmasvibutili;
bool lhmaslcutili = parent->lhmaslcutili;
bool lcmaslcutili = parent->lcmaslcutili;
bool llmaslcutili = parent->llmaslcutili;
bool lhmascbutili = parent->lhmascbutili;
bool lcmascbutili = parent->lcmascbutili;
bool llmascbutili = parent->llmascbutili;
@ -955,6 +960,9 @@ void Crop::update(int todo)
LocCCmaskCurve locccmasvibCurve;
LocLLmaskCurve locllmasvibCurve;
LocHHmaskCurve lochhmasvibCurve;
LocCCmaskCurve locccmaslcCurve;
LocLLmaskCurve locllmaslcCurve;
LocHHmaskCurve lochhmaslcCurve;
LocCCmaskCurve locccmascbCurve;
LocLLmaskCurve locllmascbCurve;
LocHHmaskCurve lochhmascbCurve;
@ -1012,9 +1020,12 @@ void Crop::update(int todo)
lochhmastmCurve.Set(params.locallab.spots.at(sp).HHmasktmcurve, lhmastmutili);
locccmasblCurve.Set(params.locallab.spots.at(sp).CCmaskblcurve, lcmasblutili);
locllmasblCurve.Set(params.locallab.spots.at(sp).LLmaskblcurve, llmasblutili);
lochhmasblCurve.Set(params.locallab.spots.at(sp).HHmaskblcurve, lhmastmutili);
lochhmasblCurve.Set(params.locallab.spots.at(sp).HHmaskblcurve, lhmasblutili);
loclmasCurveblwav.Set(params.locallab.spots.at(sp).LLmaskblcurvewav, lmasutiliblwav);
loclmasCurvecolwav.Set(params.locallab.spots.at(sp).LLmaskcolcurvewav, lmasutilicolwav);
locccmaslcCurve.Set(params.locallab.spots.at(sp).CCmasklccurve, lcmaslcutili);
locllmaslcCurve.Set(params.locallab.spots.at(sp).LLmasklccurve, llmaslcutili);
lochhmaslcCurve.Set(params.locallab.spots.at(sp).HHmasklccurve, lhmaslcutili);
locwavCurve.Set(params.locallab.spots.at(sp).locwavcurve, locwavutili);
locwavCurveden.Set(params.locallab.spots.at(sp).locwavcurveden, locwavdenutili);
@ -1047,8 +1058,8 @@ void Crop::update(int todo)
CurveFactory::curvemaskLocal(localmaskretiutili, params.locallab.spots.at(sp).Lmaskreticurve, lmaskretilocalcurve2, sca);
localmaskcbutili = false;
CurveFactory::curvemaskLocal(localmaskcbutili, params.locallab.spots.at(sp).Lmaskcbcurve, lmaskcblocalcurve2, sca);
localmaskblutili = false;
CurveFactory::curvemaskLocal(localmaskblutili, params.locallab.spots.at(sp).Lmaskblcurve, lmaskbllocalcurve2, sca);
localmasklcutili = false;
CurveFactory::curvemaskLocal(localmasklcutili, params.locallab.spots.at(sp).Lmasklccurve, lmasklclocalcurve2, sca);
double ecomp = params.locallab.spots.at(sp).expcomp;
@ -1102,6 +1113,7 @@ void Crop::update(int todo)
lmaskretilocalcurve2, localmaskretiutili,
lmaskcblocalcurve2, localmaskcbutili,
lmaskbllocalcurve2, localmaskblutili,
lmasklclocalcurve2, localmasklcutili,
locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, lochhhmasCurve, lhhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili,
locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili,
locccmasvibCurve, lcmasvibutili, locllmasvibCurve, llmasvibutili, lochhmasvibCurve, lhmasvibutili,
@ -1109,6 +1121,7 @@ void Crop::update(int todo)
locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili,
locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili,
locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili,
locccmaslcCurve, lcmaslcutili, locllmaslcCurve, llmaslcutili, lochhmaslcCurve, lhmaslcutili,
loclmasCurveblwav,lmasutiliblwav,
loclmasCurvecolwav,lmasutilicolwav,
locwavCurve, locwavutili,
@ -1137,6 +1150,7 @@ void Crop::update(int todo)
lmaskretilocalcurve2, localmaskretiutili,
lmaskcblocalcurve2, localmaskcbutili,
lmaskbllocalcurve2, localmaskblutili,
lmasklclocalcurve2, localmasklcutili,
locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili,lochhhmasCurve, lhhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili,
locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili,
locccmasvibCurve, lcmasvibutili, locllmasvibCurve, llmasvibutili, lochhmasvibCurve, lhmasvibutili,
@ -1144,6 +1158,7 @@ void Crop::update(int todo)
locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili,
locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili,
locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili,
locccmaslcCurve, lcmaslcutili, locllmaslcCurve, llmaslcutili, lochhmaslcCurve, lhmaslcutili,
loclmasCurveblwav,lmasutiliblwav,
loclmasCurvecolwav,lmasutilicolwav,
locwavCurve, locwavutili,
@ -1205,6 +1220,9 @@ void Crop::update(int todo)
locllmasblCurve.Reset();
locccmasblCurve.Reset();
lochhmasblCurve.Reset();
locllmaslcCurve.Reset();
locccmaslcCurve.Reset();
lochhmaslcCurve.Reset();
locwavCurve.Reset();
loclevwavCurve.Reset();
locconwavCurve.Reset();

View File

@ -188,6 +188,7 @@ ImProcCoordinator::ImProcCoordinator() :
lmaskretilocalcurve(65536, 0),
lmaskcblocalcurve(65536, 0),
lmaskbllocalcurve(65536, 0),
lmasklclocalcurve(65536, 0),
locallutili(false),
localclutili(false),
locallcutili(false),
@ -206,6 +207,7 @@ ImProcCoordinator::ImProcCoordinator() :
localmaskretiutili(false),
localmaskcbutili(false),
localmaskblutili(false),
localmasklcutili(false),
lcmasexputili(false),
lhmasexputili(false),
llmasexputili(false),
@ -215,6 +217,9 @@ ImProcCoordinator::ImProcCoordinator() :
lcmasvibutili(false),
lhmasvibutili(false),
llmasvibutili(false),
lcmaslcutili(false),
lhmaslcutili(false),
llmaslcutili(false),
lcmascbutili(false),
lhmascbutili(false),
llmascbutili(false),
@ -1063,6 +1068,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
localmaskretiutili = false;
localmaskcbutili = false;
localmaskblutili = false;
localmasklcutili = false;
lcmasSHutili = false;
lhmasSHutili = false;
llmasSHutili = false;
@ -1072,6 +1078,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
lcmascbutili = false;
lhmascbutili = false;
llmascbutili = false;
lcmaslcutili = false;
lhmaslcutili = false;
llmaslcutili = false;
lcmasretiutili = false;
lhmasretiutili = false;
llmasretiutili = false;
@ -1109,6 +1118,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
locllmascbCurve.Set(params->locallab.spots.at(sp).LLmaskcbcurve, llmascbutili);
locccmascbCurve.Set(params->locallab.spots.at(sp).CCmaskcbcurve, lcmascbutili);
lochhmascbCurve.Set(params->locallab.spots.at(sp).HHmaskcbcurve, lhmascbutili);
locllmaslcCurve.Set(params->locallab.spots.at(sp).LLmasklccurve, llmaslcutili);
locccmaslcCurve.Set(params->locallab.spots.at(sp).CCmasklccurve, lcmaslcutili);
lochhmaslcCurve.Set(params->locallab.spots.at(sp).HHmasklccurve, lhmaslcutili);
locllmasretiCurve.Set(params->locallab.spots.at(sp).LLmaskreticurve, llmasretiutili);
locccmasretiCurve.Set(params->locallab.spots.at(sp).CCmaskreticurve, lcmasretiutili);
lochhmasretiCurve.Set(params->locallab.spots.at(sp).HHmaskreticurve, lhmasretiutili);
@ -1140,6 +1152,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
CurveFactory::curvemaskLocal(localmaskretiutili, params->locallab.spots.at(sp).Lmaskreticurve, lmaskretilocalcurve, sca);
CurveFactory::curvemaskLocal(localmaskcbutili, params->locallab.spots.at(sp).Lmaskcbcurve, lmaskcblocalcurve, sca);
CurveFactory::curvemaskLocal(localmaskblutili, params->locallab.spots.at(sp).Lmaskblcurve, lmaskbllocalcurve, sca);
CurveFactory::curvemaskLocal(localmasklcutili, params->locallab.spots.at(sp).Lmasklccurve, lmasklclocalcurve, sca);
double ecomp = params->locallab.spots.at(sp).expcomp;
double black = params->locallab.spots.at(sp).black;
double hlcompr = params->locallab.spots.at(sp).hlcompr;
@ -1208,7 +1221,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
float Tsigma;
float Tmin;
float Tmax;
if (sp == params->locallab.selspot) {
ipf.Lab_Local(3, sp, (float**)shbuffer, nprevl, nprevl, reserv, lastorigimp, 0, 0, pW, pH, scale, locRETgainCurve, locRETtransCurve,
lllocalcurve, locallutili,
@ -1223,6 +1235,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
lmaskretilocalcurve, localmaskretiutili,
lmaskcblocalcurve, localmaskcbutili,
lmaskbllocalcurve, localmaskblutili,
lmasklclocalcurve, localmasklcutili,
locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, lochhhmasCurve, lhhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili,
locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili,
locccmasvibCurve, lcmasvibutili, locllmasvibCurve, llmasvibutili, lochhmasvibCurve, lhmasvibutili,
@ -1230,6 +1243,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili,
locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili,
locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili,
locccmaslcCurve, lcmaslcutili, locllmaslcCurve, llmaslcutili, lochhmaslcCurve, lhmaslcutili,
loclmasCurveblwav, lmasutiliblwav,
loclmasCurvecolwav, lmasutilicolwav,
locwavCurve, locwavutili,
@ -1263,6 +1277,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
lmaskretilocalcurve, localmaskretiutili,
lmaskcblocalcurve, localmaskcbutili,
lmaskbllocalcurve, localmaskblutili,
lmasklclocalcurve, localmasklcutili,
locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, lochhhmasCurve, lhhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili,
locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili,
locccmasvibCurve, lcmasvibutili, locllmasvibCurve, llmasvibutili, lochhmasvibCurve, lhmasvibutili,
@ -1270,6 +1285,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili,
locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili,
locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili,
locccmaslcCurve, lcmaslcutili, locllmaslcCurve, llmaslcutili, lochhmaslcCurve, lhmaslcutili,
loclmasCurveblwav, lmasutiliblwav,
loclmasCurvecolwav, lmasutilicolwav,
locwavCurve, locwavutili,
@ -1321,6 +1337,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
lmaskretilocalcurve.clear();
lmaskcblocalcurve.clear();
lmaskbllocalcurve.clear();
lmasklclocalcurve.clear();
hltonecurveloc.clear();
shtonecurveloc.clear();
tonecurveloc.clear();
@ -1353,6 +1370,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
locllmasblCurve.Reset();
locccmasblCurve.Reset();
lochhmasblCurve.Reset();
locllmaslcCurve.Reset();
locccmaslcCurve.Reset();
lochhmaslcCurve.Reset();
locwavCurve.Reset();
loclevwavCurve.Reset();
locconwavCurve.Reset();

View File

@ -250,6 +250,7 @@ protected:
LUTf lmaskretilocalcurve;
LUTf lmaskcblocalcurve;
LUTf lmaskbllocalcurve;
LUTf lmasklclocalcurve;
// LUTu lhist16loc;
LocretigainCurve locRETgainCurve;
LocretitransCurve locRETtransCurve;
@ -269,6 +270,9 @@ protected:
LocCCmaskCurve locccmasvibCurve;
LocLLmaskCurve locllmasvibCurve;
LocHHmaskCurve lochhmasvibCurve;
LocCCmaskCurve locccmaslcCurve;
LocLLmaskCurve locllmaslcCurve;
LocHHmaskCurve lochhmaslcCurve;
LocCCmaskCurve locccmascbCurve;
LocLLmaskCurve locllmascbCurve;
LocHHmaskCurve lochhmascbCurve;
@ -307,6 +311,7 @@ protected:
bool localmaskretiutili;
bool localmaskcbutili;
bool localmaskblutili;
bool localmasklcutili;
bool lcmasexputili;
bool lhmasexputili;
bool llmasexputili;
@ -316,6 +321,9 @@ protected:
bool lcmasvibutili;
bool lhmasvibutili;
bool llmasvibutili;
bool lcmaslcutili;
bool lhmaslcutili;
bool llmaslcutili;
bool lcmascbutili;
bool lhmascbutili;
bool llmascbutili;

View File

@ -287,6 +287,7 @@ public:
LUTf & lmaskretilocalcurve, bool & localmaskretiutili,
LUTf & lmaskcblocalcurve, bool & localmaskcbutili,
LUTf & lmaskbllocalcurve, bool & localmaskblutili,
LUTf & lmasklclocalcurve, bool & localmasklcutili,
const LocCCmaskCurve & locccmasCurve, bool & lcmasutili, const LocLLmaskCurve & locllmasCurve, bool & llmasutili, const LocHHmaskCurve & lochhmasCurve, bool & lhmasutili, const LocHHmaskCurve & lochhhmasCurve, bool & lhhmasutili,
const LocCCmaskCurve & locccmasexpCurve, bool &lcmasexputili, const LocLLmaskCurve & locllmasexpCurve, bool &llmasexputili, const LocHHmaskCurve & lochhmasexpCurve, bool & lhmasexputili,
const LocCCmaskCurve & locccmasSHCurve, bool &lcmasSHutili, const LocLLmaskCurve & locllmasSHCurve, bool &llmasSHutili, const LocHHmaskCurve & lochhmasSHCurve, bool & lhmasSHutili,
@ -295,6 +296,7 @@ public:
const LocCCmaskCurve & locccmasretiCurve, bool &lcmasretiutili, const LocLLmaskCurve & locllmasretiCurve, bool &llmasretiutili, const LocHHmaskCurve & lochhmasretiCurve, bool & lhmasretiutili,
const LocCCmaskCurve & locccmastmCurve, bool &lcmastmutili, const LocLLmaskCurve & locllmastmCurve, bool &llmastmutili, const LocHHmaskCurve & lochhmastmCurve, bool & lhmastmutili,
const LocCCmaskCurve & locccmasblCurve, bool &lcmasblutili, const LocLLmaskCurve & locllmasblCurve, bool &llmasblutili, const LocHHmaskCurve & lochhmasblCurve, bool & lhmasblutili,
const LocCCmaskCurve & locccmaslcCurve, bool &lcmaslcutili, const LocLLmaskCurve & locllmaslcCurve, bool &llmaslcutili, const LocHHmaskCurve & lochhmaslcCurve, bool & lhmaslcutili,
const LocwavCurve & loclmasCurveblwav, bool & lmasutiliblwav,
const LocwavCurve & loclmasCurvecolwav, bool & lmasutilicolwav,
const LocwavCurve & locwavCurve, bool & locwavutili,

View File

@ -96,7 +96,7 @@ void calcGammaLut(double gamma, double ts, LUTf &gammaLut)
std::swap(pwr, gamm);
}
printf("OK calcgamm\n");
// printf("OK calcgamm\n");
rtengine::Color::calcGamma(pwr, ts, 0, g_a); // call to calcGamma with selected gamma and slope
@ -211,6 +211,9 @@ struct local_params {
float chromacol;
float gammacol;
float slomacol;
float blendmalc;
float radmalc;
float chromalc;
float radmaexp;
float chromaexp;
float gammaexp;
@ -588,7 +591,6 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall
lp.showmaskSHmetinv = llSHMaskinv;
lp.showmaskvibmet = llvibMask;
lp.showmasklcmet = lllcMask;
printf("lpshamlc=%i\n",lp.showmasklcmet);
lp.showmaskcbmet = llcbMask;
lp.showmaskretimet = llretiMask;
lp.showmasksoftmet = llsoftMask;
@ -799,6 +801,9 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall
float labgridALowlocmerg = locallab.spots.at(sp).labgridALowmerg;
float labgridAHighlocmerg = locallab.spots.at(sp).labgridAHighmerg;
float blendmasklc = ((float) locallab.spots.at(sp).blendmasklc) / 100.f ;
float radmasklc = ((float) locallab.spots.at(sp).radmasklc);
float chromasklc = ((float) locallab.spots.at(sp).chromasklc);
float structcolor = (float) locallab.spots.at(sp).structcol;
float blendmaskcolor = ((float) locallab.spots.at(sp).blendmaskcol) / 100.f ;
float radmaskcolor = ((float) locallab.spots.at(sp).radmaskcol);
@ -934,6 +939,9 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall
lp.chro = local_chroma;
lp.struco = structcolor;
lp.strengrid = strengthgrid;
lp.blendmalc = blendmasklc;
lp.radmalc = radmasklc;
lp.chromalc = chromasklc;
lp.blendmacol = blendmaskcolor;
lp.radmacol = radmaskcolor;
lp.chromacol = chromaskcolor;
@ -3809,7 +3817,6 @@ void ImProcFunctions::maskcalccol(int call, bool invmask, bool pde, int bfw, int
}
}
#ifdef _OPENMP
#pragma omp parallel
#endif
@ -3867,6 +3874,7 @@ void ImProcFunctions::maskcalccol(int call, bool invmask, bool pde, int bfw, int
if (locllmasCurve && llmasutili) {
kmaskL = 32768.f * LIM01(kinv - kneg * locllmasCurve[(500.f / 32768.f) * bufcolorig->L[ir][jr]]);
}
if (!deltaE && locccmasCurve && lcmasutili) {
@ -3988,7 +3996,6 @@ void ImProcFunctions::maskcalccol(int call, bool invmask, bool pde, int bfw, int
rtengine::guidedFilter(guid, ble, ble, r2, 0.2 * epsil, multiThread);
}
printf("OK A\n");
LUTf lutTonemaskexp(65536);
calcGammaLut(gamma, slope, lutTonemaskexp);
@ -6180,12 +6187,14 @@ void ImProcFunctions::transit_shapedetect2(int call, int senstype, const LabImag
const bool colshow = ((lp.showmaskcolmet == 1 || lp.showmaskcolmet == 2) && senstype == 0);
const bool SHshow = ((lp.showmaskSHmet == 1 || lp.showmaskSHmet == 2) && senstype == 9);
const bool tmshow = ((lp.showmasktmmet == 1 || lp.showmasktmmet == 2) && senstype == 8);
const bool lcshow = ((lp.showmasklcmet == 1 || lp.showmasklcmet == 2) && senstype == 10);
const bool previewvib = ((lp.showmaskvibmet == 4) && senstype == 2);
const bool previewexp = ((lp.showmaskexpmet == 5) && senstype == 1);
const bool previewcol = ((lp.showmaskcolmet == 5) && senstype == 0);
const bool previewSH = ((lp.showmaskSHmet == 4) && senstype == 9);
const bool previewtm = ((lp.showmasktmmet == 4) && senstype == 8);
const bool previewlc = ((lp.showmasklcmet == 4) && senstype == 10);
float radius = 3.f / sk;
@ -6217,7 +6226,8 @@ void ImProcFunctions::transit_shapedetect2(int call, int senstype, const LabImag
const bool usemaskcol = (lp.showmaskcolmet == 2 || lp.enaColorMask || lp.showmaskcolmet == 5) && senstype == 0;
const bool usemaskSH = (lp.showmaskSHmet == 2 || lp.enaSHMask || lp.showmaskSHmet == 4) && senstype == 9;
const bool usemasktm = (lp.showmasktmmet == 2 || lp.enatmMask || lp.showmasktmmet == 4) && senstype == 8;
const bool usemaskall = (usemaskexp || usemaskvib || usemaskcol || usemaskSH || usemasktm);
const bool usemasklc = (lp.showmasklcmet == 2 || lp.enalcMask || lp.showmasklcmet == 4) && senstype == 10;
const bool usemaskall = (usemaskexp || usemaskvib || usemaskcol || usemaskSH || usemasktm || usemasklc);
//blur a little mask
if (usemaskall) {
@ -6404,7 +6414,7 @@ void ImProcFunctions::transit_shapedetect2(int call, int senstype, const LabImag
difb = factorx * realstrbdE;
float maxdifab = max(fabs(difa), fabs(difb));
if (expshow || vibshow || colshow || SHshow || tmshow) {//show modifications
if (expshow || vibshow || colshow || SHshow || tmshow || lcshow) {//show modifications
if (diflc < 1000.f) {//if too low to be view use ab
diflc += 0.5f * maxdifab;
}
@ -6412,7 +6422,7 @@ void ImProcFunctions::transit_shapedetect2(int call, int senstype, const LabImag
transformed->L[y + ystart][x + xstart] = CLIP(12000.f + diflc);
transformed->a[y + ystart][x + xstart] = CLIPC(difa);
transformed->b[y + ystart][x + xstart] = CLIPC(difb);
} else if (previewexp || previewvib || previewcol || previewSH || previewtm) {//show deltaE
} else if (previewexp || previewvib || previewcol || previewSH || previewtm || previewlc) {//show deltaE
if (fabs(difb) < 500.f) {//if too low to be view use L
if (difb < 0.f) {
difb -= 0.5f * diflc;
@ -9041,6 +9051,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
LUTf & lmaskretilocalcurve, bool & localmaskretiutili,
LUTf & lmaskcblocalcurve, bool & localmaskcbutili,
LUTf & lmaskbllocalcurve, bool & localmaskblutili,
LUTf & lmasklclocalcurve, bool & localmasklcutili,
const LocCCmaskCurve & locccmasCurve, bool & lcmasutili, const LocLLmaskCurve & locllmasCurve, bool & llmasutili, const LocHHmaskCurve & lochhmasCurve, bool & lhmasutili, const LocHHmaskCurve & lochhhmasCurve, bool & lhhmasutili,
const LocCCmaskCurve & locccmasexpCurve, bool & lcmasexputili, const LocLLmaskCurve & locllmasexpCurve, bool & llmasexputili, const LocHHmaskCurve & lochhmasexpCurve, bool & lhmasexputili,
const LocCCmaskCurve & locccmasSHCurve, bool & lcmasSHutili, const LocLLmaskCurve & locllmasSHCurve, bool & llmasSHutili, const LocHHmaskCurve & lochhmasSHCurve, bool & lhmasSHutili,
@ -9049,6 +9060,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
const LocCCmaskCurve & locccmasretiCurve, bool & lcmasretiutili, const LocLLmaskCurve & locllmasretiCurve, bool & llmasretiutili, const LocHHmaskCurve & lochhmasretiCurve, bool & lhmasretiutili,
const LocCCmaskCurve & locccmastmCurve, bool & lcmastmutili, const LocLLmaskCurve & locllmastmCurve, bool & llmastmutili, const LocHHmaskCurve & lochhmastmCurve, bool & lhmastmutili,
const LocCCmaskCurve & locccmasblCurve, bool & lcmasblutili, const LocLLmaskCurve & locllmasblCurve, bool & llmasblutili, const LocHHmaskCurve & lochhmasblCurve, bool & lhmasblutili,
const LocCCmaskCurve & locccmaslcCurve, bool & lcmaslcutili, const LocLLmaskCurve & locllmaslcCurve, bool & llmaslcutili, const LocHHmaskCurve & lochhmaslcCurve, bool & lhmaslcutili,
const LocwavCurve & loclmasCurveblwav, bool & lmasutiliblwav,
const LocwavCurve & loclmasCurvecolwav, bool & lmasutilicolwav,
const LocwavCurve & locwavCurve, bool & locwavutili,
@ -9065,7 +9077,6 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
if (params->locallab.enabled) {
BENCHFUN
int complexsoft = options.complexity;
#ifdef _DEBUG
// init variables to display Munsell corrections
MunsellDebugInfo* MunsDebugInfo = new MunsellDebugInfo();
@ -10116,7 +10127,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
float slope = lp.slomacb;
float blendm = lp.blendmacb;
float lap = params->locallab.spots.at(sp).lapmaskcb;
float pde = params->locallab.spots.at(sp).laplac;
bool pde = params->locallab.spots.at(sp).laplac;
LocwavCurve dummy;
bool delt = params->locallab.spots.at(sp).deltae;
int sco = params->locallab.spots.at(sp).scopemask;
@ -10341,7 +10352,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
float slope = lp.slomavib;
float blendm = lp.blendmavib;
float lap = params->locallab.spots.at(sp).lapmaskvib;
float pde = params->locallab.spots.at(sp).laplac;
bool pde = params->locallab.spots.at(sp).laplac;
LocwavCurve dummy;
bool lmasutilicolwav = false;
bool delt = params->locallab.spots.at(sp).deltae;
@ -10577,7 +10588,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
float slope = lp.slomatm;
float blendm = lp.blendmatm;
float lap = params->locallab.spots.at(sp).lapmasktm;
float pde = params->locallab.spots.at(sp).laplac;
bool pde = params->locallab.spots.at(sp).laplac;
int shortcu = 0; //lp.mergemet;// params->locallab.spots.at(sp).shortc;
int lumask = params->locallab.spots.at(sp).lumask;
@ -10812,7 +10823,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
float slope = lp.slomaSH;
float blendm = lp.blendmaSH;
float lap = params->locallab.spots.at(sp).lapmaskSH;
float pde = params->locallab.spots.at(sp).laplac;
bool pde = params->locallab.spots.at(sp).laplac;
LocwavCurve dummy;
bool lmasutilicolwav = false;
bool delt = params->locallab.spots.at(sp).deltae;
@ -10971,7 +10982,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
float slope = lp.slomaSH;
float blendm = lp.blendmaSH;
float lap = params->locallab.spots.at(sp).lapmaskSH;
float pde = params->locallab.spots.at(sp).laplac;
bool pde = params->locallab.spots.at(sp).laplac;
LocwavCurve dummy;
bool lmasutilicolwav = false;
// bool delt = params->locallab.spots.at(sp).deltae;
@ -11160,7 +11171,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
}
}
if ((lp.lcamount > 0.f || wavcurve || wavcurvelev || wavcurvecon || wavcurvecomp || 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 || wavcurvelev || wavcurvecon || wavcurvecomp || 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 yend = std::min(static_cast<int>(lp.yc + lp.ly) - cy, original->H);
int xstart = std::max(static_cast<int>(lp.xc - lp.lxL) - cx, 0);
@ -11178,6 +11191,16 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
optfft(N_fftwsize, bfh, bfw, bfhr, bfwr, reduH, reduW, lp, original->H, original->W, xstart, ystart, xend, yend, cx, cy);
}
std::unique_ptr<LabImage> bufmaskblurlc;
std::unique_ptr<LabImage> originalmasklc;
std::unique_ptr<LabImage> bufmaskoriglc;
if (lp.showmasklcmet == 2 || lp.enalcMask || lp.showmasklcmet == 3 || lp.showmasklcmet == 4) {
bufmaskblurlc.reset(new LabImage(bfw, bfh));
originalmasklc.reset(new LabImage(bfw, bfh));
bufmaskoriglc.reset(new LabImage(bfw, bfh));
}
array2D<float> buflight(bfw, bfh);
JaggedArray<float> bufchro(bfw, bfh);
std::unique_ptr<LabImage> bufgb(new LabImage(bfw, bfh));
@ -11207,273 +11230,356 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
}
}
if (lp.locmet == 0) {
LocalContrastParams localContrastParams;
LocallabParams locallabparams;
localContrastParams.enabled = true;
localContrastParams.radius = params->locallab.spots.at(sp).lcradius;
localContrastParams.amount = params->locallab.spots.at(sp).lcamount;
localContrastParams.darkness = params->locallab.spots.at(sp).lcdarkness;
localContrastParams.lightness = params->locallab.spots.at(sp).lightness;
bool fftwlc = false;
if (!lp.ftwlc) { // || (lp.ftwlc && call != 2)) {
ImProcFunctions::localContrast(tmp1.get(), tmp1->L, localContrastParams, fftwlc, sk);
} else {
std::unique_ptr<LabImage> tmpfftw(new LabImage(bfwr, bfhr));
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#pragma omp parallel for schedule(dynamic,16)
#endif
for (int y = 0; y < bfhr; y++) {
for (int x = 0; x < bfwr; x++) {
tmpfftw->L[y][x] = tmp1->L[y][x];
tmpfftw->a[y][x] = tmp1->a[y][x];
tmpfftw->b[y][x] = tmp1->b[y][x];
}
}
fftwlc = true;
ImProcFunctions::localContrast(tmpfftw.get(), tmpfftw->L, localContrastParams, fftwlc, sk);
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
for (int y = 0; y < bfhr; y++) {
for (int x = 0; x < bfwr; x++) {
tmp1->L[y][x] = tmpfftw->L[y][x];
tmp1->a[y][x] = tmpfftw->a[y][x];
tmp1->b[y][x] = tmpfftw->b[y][x];
}
}
}
} else if (lp.locmet == 1) { //wavelet
int wavelet_level = params->locallab.spots.at(sp).levelwav;
float mL = (float)(params->locallab.spots.at(sp).clarilres / 100.f);
float mC = (float)(params->locallab.spots.at(sp).claricres / 100.f);
float softr = (float)(params->locallab.spots.at(sp).clarisoft);
float mL0;
float mC0;
#ifdef _OPENMP
const int numThreads = omp_get_max_threads();
#else
const int numThreads = 1;
#endif
// adap maximum level wavelet to size of RT-spot
int minwin = min(bfw, bfh);
int maxlevelspot = 9;
while ((1 << maxlevelspot) >= (minwin * sk) && maxlevelspot > 1) {
--maxlevelspot ;
}
wavelet_level = min(wavelet_level, maxlevelspot);
bool exec = false;
bool origlc = params->locallab.spots.at(sp).origlc;
if (origlc) {//merge only with original
clarimerge(mL, mC, exec, tmpresid.get(), wavelet_level, sk, numThreads);
}
int maxlvl;
const float contrast = params->locallab.spots.at(sp).residcont;
int level_bl = params->locallab.spots.at(sp).csthreshold.getBottomLeft();
int level_hl = params->locallab.spots.at(sp).csthreshold.getTopLeft();
int level_br = params->locallab.spots.at(sp).csthreshold.getBottomRight();
int level_hr = params->locallab.spots.at(sp).csthreshold.getTopRight();
const float radblur = (params->locallab.spots.at(sp).residblur) / sk;
const bool blurlc = params->locallab.spots.at(sp).blurlc;
const float radlevblur = (params->locallab.spots.at(sp).levelblur) / sk;
const float sigma = params->locallab.spots.at(sp).sigma;
const float fatdet = params->locallab.spots.at(sp).fatdet;
const float fatanch = params->locallab.spots.at(sp).fatanch;
const float fatres = params->locallab.spots.at(sp).fatres;
wavcontrast4(tmp1->L, contrast, fatres, radblur, radlevblur, tmp1->W, tmp1->H, level_bl, level_hl, level_br, level_hr, sk, numThreads, locwavCurve, locwavutili, loclevwavCurve, loclevwavutili, wavcurvelev, locconwavCurve, locconwavutili, wavcurvecon, loccompwavCurve, loccompwavutili, wavcurvecomp, sigma, maxlvl, fatdet, fatanch);
const float satur = params->locallab.spots.at(sp).residchro;
if (satur != 0.f || radblur > 0.f) {
wavelet_decomposition *wdspota = new wavelet_decomposition(tmp1->a[0], tmp1->W, tmp1->H, wavelet_level, 1, sk, numThreads, 6);
if (wdspota->memoryAllocationFailed) {
return;
}
float *wav_ab0a = wdspota->coeff0;
// int maxlvla = wdspota->maxlevel();
int W_La = wdspota->level_W(0);
int H_La = wdspota->level_H(0);
if (radblur > 0.f && !blurlc) {
array2D<float> bufa(W_La, H_La);
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
for (int y = 0; y < H_La; y++) {
for (int x = 0; x < W_La; x++) {
bufa[y][x] = wav_ab0a [y * W_La + x];
}
}
#pragma omp parallel
{
gaussianBlur(bufa, bufa, W_La, H_La, radblur);
}
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
for (int y = 0; y < H_La; y++) {
for (int x = 0; x < W_La; x++) {
wav_ab0a[y * W_La + x] = bufa[y][x];
}
}
}
if (satur != 0.f) {
#ifdef _OPENMP
#pragma omp parallel for if (multiThread)
#endif
for (int i = 0; i < W_La * H_La; i++) {
wav_ab0a[i] *= (1.f + sin(rtengine::RT_PI * (satur / 200.f)));//more progressive than linear
wav_ab0a[i] = CLIPC(wav_ab0a[i]);
}
}
wdspota->reconstruct(tmp1->a[0], 1.f);
delete wdspota;
wavelet_decomposition *wdspotb = new wavelet_decomposition(tmp1->b[0], tmp1->W, tmp1->H, wavelet_level, 1, sk, numThreads, 6);
if (wdspotb->memoryAllocationFailed) {
return;
}
float *wav_ab0b = wdspotb->coeff0;
// int maxlvlb = wdspotb->maxlevel();
int W_Lb = wdspotb->level_W(0);
int H_Lb = wdspotb->level_H(0);
if (radblur > 0.f && !blurlc) {
array2D<float> bufb(W_Lb, H_Lb);
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
for (int y = 0; y < H_Lb; y++) {
for (int x = 0; x < W_Lb; x++) {
bufb[y][x] = wav_ab0b [y * W_Lb + x];
}
}
#pragma omp parallel
{
gaussianBlur(bufb, bufb, W_Lb, H_Lb, radblur);
}
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
for (int y = 0; y < H_Lb; y++) {
for (int x = 0; x < W_Lb; x++) {
wav_ab0b[y * W_Lb + x] = bufb[y][x];
}
}
}
if (satur != 0.f) {
#ifdef _OPENMP
#pragma omp parallel for if (multiThread)
#endif
for (int i = 0; i < W_Lb * H_Lb; i++) {
wav_ab0b[i] *= (1.f + sin(rtengine::RT_PI * (satur / 200.f)));
wav_ab0b[i] = CLIPC(wav_ab0b[i]);
}
}
wdspotb->reconstruct(tmp1->b[0], 1.f);
delete wdspotb;
}
if (!origlc) {//merge all files
exec = false;
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
//copy previous calculation in merge possibilities
for (int y = 0; y < bfhr; y++) {
for (int x = 0; x < bfwr; x++) {
tmpresid->L[y][x] = tmp1->L[y][x];
tmpresid->a[y][x] = tmp1->a[y][x];
tmpresid->b[y][x] = tmp1->b[y][x];
}
}
clarimerge(mL, mC, exec, tmpresid.get(), wavelet_level, sk, numThreads);
}
float thr = 0.001f;
int flag = 0;
if (maxlvl <= 4) {
mL0 = 0.f;
mC0 = 0.f;
mL = -1.5f * mL;//increase only for sharpen
mC = -mC;
thr = 1.f;
flag = 0;
} else if (maxlvl > 4) {
mL0 = mL;
mC0 = mC;
thr = 1.f;
flag = 1;
} else {
mL0 = mL = mC0 = mC = 0.f;
}
if (exec) {
bool origl = false;
// origlc = false;
LabImage *mergfile = origl ? tmpres.get() : tmp1.get();
#ifdef _OPENMP
#pragma omp parallel for
#endif
for (int x = 0; x < bfh; x++)
for (int y = 0; y < bfw; y++) {
tmp1->L[x][y] = CLIPLOC((1.f + mL0) * mergfile->L[x][y] - mL * tmpresid->L[x][y]);
tmp1->a[x][y] = CLIPC((1.f + mC0) * mergfile->a[x][y] - mC * tmpresid->a[x][y]);
tmp1->b[x][y] = CLIPC((1.f + mC0) * mergfile->b[x][y] - mC * tmpresid->b[x][y]);
}
if (softr > 0.f && fabs(mL) > 0.001f) {
softproc(tmpres.get(), tmp1.get(), softr, bfh, bfw, 0.0001, 0.00001, thr, sk, multiThread, flag);
}
for (int y = 0; y < bfh; y++) {
for (int x = 0; x < bfw; x++) {
bufgb->L[y][x] = original->L[y + ystart][x + xstart];
}
}
int inv = 0;
bool showmaske = false;
bool enaMask = false;
bool deltaE = false;
bool modmask = false;
bool zero = false;
bool modif = false;
transit_shapedetect2(call, 10, bufgb.get(), tmp1.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk);
if (lp.showmasklcmet == 3) {
showmaske = true;
}
if (lp.enalcMask) {
enaMask = true;
}
if (lp.showmasklcmet == 4) {
deltaE = true;
}
if (lp.showmasklcmet == 2) {
modmask = true;
}
if (lp.showmasklcmet == 1) {
modif = true;
}
if (lp.showmasklcmet == 0) {
zero = true;
}
float chrom = lp.chromalc;
float rad = lp.radmalc;
float blendm = lp.blendmalc;
float gamma = 1.f;
float slope = 0.f;
float lap = 0.f; //params->locallab.spots.at(sp).lapmaskexp;
bool pde = false; //params->locallab.spots.at(sp).laplac;
LocwavCurve dummy;
bool lmasutilicolwav = false;
bool delt = params->locallab.spots.at(sp).deltae;
int sco = params->locallab.spots.at(sp).scopemask;
int shado = 0;
int shortcu = 0;//lp.mergemet; //params->locallab.spots.at(sp).shortc;
const int limscope = 80;
const float mindE = 2.f + MINSCOPE * sco * lp.thr;
const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr);
const float mindElim = 2.f + MINSCOPE * limscope * lp.thr;
const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr);
float amountcd = 0.f;
float anchorcd = 50.f;
int lumask = params->locallab.spots.at(sp).lumask;
LocHHmaskCurve lochhhmasCurve;
bool lhhmasutili = false;
maskcalccol(call, false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufgb.get(), bufmaskoriglc.get(), originalmasklc.get(), original, reserved, inv, lp,
0.f, false,
locccmaslcCurve, lcmaslcutili, locllmaslcCurve, llmaslcutili, lochhmaslcCurve, lhmaslcutili, lochhhmasCurve, lhhmasutili, multiThread,
enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, amountcd, anchorcd, lmasklclocalcurve, localmasklcutili, dummy, lmasutilicolwav, 1, 1, 5, 5,
shortcu, delt, hueref, chromaref, lumaref,
maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco
);
if (lp.showmasklcmet == 3) {
showmask(lumask, lp, xstart, ystart, cx, cy, bfw, bfh, bufgb.get(), transformed, bufmaskoriglc.get(), 0);
return;
}
if (lp.showmasklcmet == 0 || lp.showmasklcmet == 1 || lp.showmasklcmet == 2 || lp.showmasklcmet == 4 || lp.enalcMask) {
if (lp.locmet == 0) {
LocalContrastParams localContrastParams;
LocallabParams locallabparams;
localContrastParams.enabled = true;
localContrastParams.radius = params->locallab.spots.at(sp).lcradius;
localContrastParams.amount = params->locallab.spots.at(sp).lcamount;
localContrastParams.darkness = params->locallab.spots.at(sp).lcdarkness;
localContrastParams.lightness = params->locallab.spots.at(sp).lightness;
bool fftwlc = false;
if (!lp.ftwlc) { // || (lp.ftwlc && call != 2)) {
ImProcFunctions::localContrast(tmp1.get(), tmp1->L, localContrastParams, fftwlc, sk);
} else {
std::unique_ptr<LabImage> tmpfftw(new LabImage(bfwr, bfhr));
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
for (int y = 0; y < bfhr; y++) {
for (int x = 0; x < bfwr; x++) {
tmpfftw->L[y][x] = tmp1->L[y][x];
tmpfftw->a[y][x] = tmp1->a[y][x];
tmpfftw->b[y][x] = tmp1->b[y][x];
}
}
fftwlc = true;
ImProcFunctions::localContrast(tmpfftw.get(), tmpfftw->L, localContrastParams, fftwlc, sk);
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
for (int y = 0; y < bfhr; y++) {
for (int x = 0; x < bfwr; x++) {
tmp1->L[y][x] = tmpfftw->L[y][x];
tmp1->a[y][x] = tmpfftw->a[y][x];
tmp1->b[y][x] = tmpfftw->b[y][x];
}
}
}
} else if (lp.locmet == 1) { //wavelet
int wavelet_level = params->locallab.spots.at(sp).levelwav;
float mL = (float)(params->locallab.spots.at(sp).clarilres / 100.f);
float mC = (float)(params->locallab.spots.at(sp).claricres / 100.f);
float softr = (float)(params->locallab.spots.at(sp).clarisoft);
float mL0;
float mC0;
#ifdef _OPENMP
const int numThreads = omp_get_max_threads();
#else
const int numThreads = 1;
#endif
// adap maximum level wavelet to size of RT-spot
int minwin = min(bfw, bfh);
int maxlevelspot = 9;
while ((1 << maxlevelspot) >= (minwin * sk) && maxlevelspot > 1) {
--maxlevelspot ;
}
wavelet_level = min(wavelet_level, maxlevelspot);
bool exec = false;
bool origlc = params->locallab.spots.at(sp).origlc;
if (origlc) {//merge only with original
clarimerge(mL, mC, exec, tmpresid.get(), wavelet_level, sk, numThreads);
}
int maxlvl;
const float contrast = params->locallab.spots.at(sp).residcont;
int level_bl = params->locallab.spots.at(sp).csthreshold.getBottomLeft();
int level_hl = params->locallab.spots.at(sp).csthreshold.getTopLeft();
int level_br = params->locallab.spots.at(sp).csthreshold.getBottomRight();
int level_hr = params->locallab.spots.at(sp).csthreshold.getTopRight();
const float radblur = (params->locallab.spots.at(sp).residblur) / sk;
const bool blurlc = params->locallab.spots.at(sp).blurlc;
const float radlevblur = (params->locallab.spots.at(sp).levelblur) / sk;
const float sigma = params->locallab.spots.at(sp).sigma;
const float fatdet = params->locallab.spots.at(sp).fatdet;
const float fatanch = params->locallab.spots.at(sp).fatanch;
const float fatres = params->locallab.spots.at(sp).fatres;
wavcontrast4(tmp1->L, contrast, fatres, radblur, radlevblur, tmp1->W, tmp1->H, level_bl, level_hl, level_br, level_hr, sk, numThreads, locwavCurve, locwavutili, loclevwavCurve, loclevwavutili, wavcurvelev, locconwavCurve, locconwavutili, wavcurvecon, loccompwavCurve, loccompwavutili, wavcurvecomp, sigma, maxlvl, fatdet, fatanch);
const float satur = params->locallab.spots.at(sp).residchro;
if (satur != 0.f || radblur > 0.f) {
wavelet_decomposition *wdspota = new wavelet_decomposition(tmp1->a[0], tmp1->W, tmp1->H, wavelet_level, 1, sk, numThreads, 6);
if (wdspota->memoryAllocationFailed) {
return;
}
float *wav_ab0a = wdspota->coeff0;
// int maxlvla = wdspota->maxlevel();
int W_La = wdspota->level_W(0);
int H_La = wdspota->level_H(0);
if (radblur > 0.f && !blurlc) {
array2D<float> bufa(W_La, H_La);
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
for (int y = 0; y < H_La; y++) {
for (int x = 0; x < W_La; x++) {
bufa[y][x] = wav_ab0a [y * W_La + x];
}
}
#pragma omp parallel
{
gaussianBlur(bufa, bufa, W_La, H_La, radblur);
}
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
for (int y = 0; y < H_La; y++) {
for (int x = 0; x < W_La; x++) {
wav_ab0a[y * W_La + x] = bufa[y][x];
}
}
}
if (satur != 0.f) {
#ifdef _OPENMP
#pragma omp parallel for if (multiThread)
#endif
for (int i = 0; i < W_La * H_La; i++) {
wav_ab0a[i] *= (1.f + sin(rtengine::RT_PI * (satur / 200.f)));//more progressive than linear
wav_ab0a[i] = CLIPC(wav_ab0a[i]);
}
}
wdspota->reconstruct(tmp1->a[0], 1.f);
delete wdspota;
wavelet_decomposition *wdspotb = new wavelet_decomposition(tmp1->b[0], tmp1->W, tmp1->H, wavelet_level, 1, sk, numThreads, 6);
if (wdspotb->memoryAllocationFailed) {
return;
}
float *wav_ab0b = wdspotb->coeff0;
// int maxlvlb = wdspotb->maxlevel();
int W_Lb = wdspotb->level_W(0);
int H_Lb = wdspotb->level_H(0);
if (radblur > 0.f && !blurlc) {
array2D<float> bufb(W_Lb, H_Lb);
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
for (int y = 0; y < H_Lb; y++) {
for (int x = 0; x < W_Lb; x++) {
bufb[y][x] = wav_ab0b [y * W_Lb + x];
}
}
#pragma omp parallel
{
gaussianBlur(bufb, bufb, W_Lb, H_Lb, radblur);
}
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
for (int y = 0; y < H_Lb; y++) {
for (int x = 0; x < W_Lb; x++) {
wav_ab0b[y * W_Lb + x] = bufb[y][x];
}
}
}
if (satur != 0.f) {
#ifdef _OPENMP
#pragma omp parallel for if (multiThread)
#endif
for (int i = 0; i < W_Lb * H_Lb; i++) {
wav_ab0b[i] *= (1.f + sin(rtengine::RT_PI * (satur / 200.f)));
wav_ab0b[i] = CLIPC(wav_ab0b[i]);
}
}
wdspotb->reconstruct(tmp1->b[0], 1.f);
delete wdspotb;
}
if (!origlc) {//merge all files
exec = false;
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
//copy previous calculation in merge possibilities
for (int y = 0; y < bfhr; y++) {
for (int x = 0; x < bfwr; x++) {
tmpresid->L[y][x] = tmp1->L[y][x];
tmpresid->a[y][x] = tmp1->a[y][x];
tmpresid->b[y][x] = tmp1->b[y][x];
}
}
clarimerge(mL, mC, exec, tmpresid.get(), wavelet_level, sk, numThreads);
}
float thr = 0.001f;
int flag = 0;
if (maxlvl <= 4) {
mL0 = 0.f;
mC0 = 0.f;
mL = -1.5f * mL;//increase only for sharpen
mC = -mC;
thr = 1.f;
flag = 0;
} else if (maxlvl > 4) {
mL0 = mL;
mC0 = mC;
thr = 1.f;
flag = 1;
} else {
mL0 = mL = mC0 = mC = 0.f;
}
if (exec) {
bool origl = false;
// origlc = false;
LabImage *mergfile = origl ? tmpres.get() : tmp1.get();
#ifdef _OPENMP
#pragma omp parallel for
#endif
for (int x = 0; x < bfh; x++)
for (int y = 0; y < bfw; y++) {
tmp1->L[x][y] = CLIPLOC((1.f + mL0) * mergfile->L[x][y] - mL * tmpresid->L[x][y]);
tmp1->a[x][y] = CLIPC((1.f + mC0) * mergfile->a[x][y] - mC * tmpresid->a[x][y]);
tmp1->b[x][y] = CLIPC((1.f + mC0) * mergfile->b[x][y] - mC * tmpresid->b[x][y]);
}
if (softr > 0.f && fabs(mL) > 0.001f) {
softproc(tmpres.get(), tmp1.get(), softr, bfh, bfw, 0.0001, 0.00001, thr, sk, multiThread, flag);
}
}
}
transit_shapedetect2(call, 10, bufgb.get(), tmp1.get(), originalmasklc.get(), hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk);
// transit_shapedetect(10, tmp1.get(), nullptr, bufchro, false, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk);
tmp1.reset();
tmp1.reset();
}
if (params->locallab.spots.at(sp).recurs) {
original->CopyFrom(transformed);
@ -11539,7 +11645,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
if (params->locallab.spots.at(sp).recurs) {
original->CopyFrom(transformed);
float avge;
calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge,locwavCurveden, locwavdenutili );
calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili);
}
}
@ -12483,7 +12589,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
float slope = lp.slomaexp;
float blendm = lp.blendmaexp;
float lap = params->locallab.spots.at(sp).lapmaskexp;
float pde = params->locallab.spots.at(sp).laplac;
bool pde = params->locallab.spots.at(sp).laplac;
LocwavCurve dummy;
bool lmasutilicolwav = false;
bool delt = params->locallab.spots.at(sp).deltae;
@ -12671,7 +12777,6 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
}
}
printf("OK 10\n");
//shadows with ipshadowshighlight
if ((lp.expcomp != 0.f && lp.expcomp != 0.01f) || (exlocalcurve && localexutili)) {
@ -12781,7 +12886,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
float slope = lp.slomaexp;
float blendm = lp.blendmaexp;
float lap = params->locallab.spots.at(sp).lapmaskexp;
float pde = params->locallab.spots.at(sp).laplac;
bool pde = params->locallab.spots.at(sp).laplac;
LocwavCurve dummy;
bool lmasutilicolwav = false;
// bool delt = params->locallab.spots.at(sp).deltae;
@ -13085,7 +13190,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
float slope = lp.slomacol;
float blendm = lp.blendmacol;
float lap = params->locallab.spots.at(sp).lapmaskcol;
float pde = params->locallab.spots.at(sp).laplac;
bool pde = params->locallab.spots.at(sp).laplac;
int shado = params->locallab.spots.at(sp).shadmaskcol;
bool delt = params->locallab.spots.at(sp).deltae;
bool astool = params->locallab.spots.at(sp).toolcol;
@ -14409,7 +14514,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
float slope = lp.slomacol;
float blendm = lp.blendmacol;
float lap = params->locallab.spots.at(sp).lapmaskcol;
float pde = params->locallab.spots.at(sp).laplac;
bool pde = params->locallab.spots.at(sp).laplac;
int shado = params->locallab.spots.at(sp).shadmaskcol;
int level_bl = params->locallab.spots.at(sp).csthresholdcol.getBottomLeft();
int level_hl = params->locallab.spots.at(sp).csthresholdcol.getTopLeft();

View File

@ -1101,6 +1101,9 @@ private:
LocCCmaskCurve locccmasvibCurve;
LocLLmaskCurve locllmasvibCurve;
LocHHmaskCurve lochhmasvibCurve;
LocCCmaskCurve locccmaslcCurve;
LocLLmaskCurve locllmaslcCurve;
LocHHmaskCurve lochhmaslcCurve;
LocCCmaskCurve locccmascbCurve;
LocLLmaskCurve locllmascbCurve;
LocHHmaskCurve lochhmascbCurve;
@ -1138,6 +1141,7 @@ private:
LUTf lmaskretilocalcurve(65536, 0);
LUTf lmaskcblocalcurve(65536, 0);
LUTf lmaskbllocalcurve(65536, 0);
LUTf lmasklclocalcurve(65536, 0);
// int maxspot = 1;
float** shbuffer = nullptr;
@ -1172,6 +1176,7 @@ private:
bool localmaskretiutili = false;
bool localmaskcbutili = false;
bool localmaskblutili = false;
bool localmasklcutili = false;
bool lcmasexputili = false;
bool lhmasexputili = false;
bool llmasexputili = false;
@ -1181,6 +1186,9 @@ private:
bool lcmasvibutili = false;
bool lhmasvibutili = false;
bool llmasvibutili = false;
bool lcmaslcutili = false;
bool lhmaslcutili = false;
bool llmaslcutili = false;
bool lcmascbutili = false;
bool lhmascbutili = false;
bool llmascbutili = false;
@ -1251,6 +1259,7 @@ private:
CurveFactory::curvemaskLocal(localmaskretiutili, params.locallab.spots.at(sp).Lmaskreticurve, lmaskretilocalcurve, 1);
CurveFactory::curvemaskLocal(localmaskcbutili, params.locallab.spots.at(sp).Lmaskcbcurve, lmaskcblocalcurve, 1);
CurveFactory::curvemaskLocal(localmaskblutili, params.locallab.spots.at(sp).Lmaskblcurve, lmaskbllocalcurve, 1);
CurveFactory::curvemaskLocal(localmasklcutili, params.locallab.spots.at(sp).Lmasklccurve, lmasklclocalcurve, 1);
//provisory
double ecomp = params.locallab.spots.at(sp).expcomp;
double black = params.locallab.spots.at(sp).black;
@ -1298,6 +1307,7 @@ private:
lmaskretilocalcurve, localmaskretiutili,
lmaskcblocalcurve, localmaskcbutili,
lmaskbllocalcurve, localmaskblutili,
lmasklclocalcurve, localmasklcutili,
locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, lochhhmasCurve, lhhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili,
locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili,
locccmasvibCurve, lcmasvibutili, locllmasvibCurve, llmasvibutili, lochhmasvibCurve, lhmasvibutili,
@ -1305,6 +1315,7 @@ private:
locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili,
locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili,
locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili,
locccmaslcCurve, lcmaslcutili, locllmaslcCurve, llmaslcutili, lochhmaslcCurve, lhmaslcutili,
loclmasCurveblwav,lmasutiliblwav,
loclmasCurvecolwav,lmasutilicolwav,
locwavCurve, locwavutili,

View File

@ -238,7 +238,7 @@ Locallab::Locallab():
expcurvcol(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_EXPCURV")))),
expmaskexp(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWE")))),
expmasksh(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWS")))),
expmasklc(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWCB")))),
expmasklc(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWLC")))),
expmaskcb(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWCB")))),
expmaskreti(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWR")))),
expmasktm(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWT")))),
@ -3094,7 +3094,7 @@ pe(nullptr)
// }
expmasklc->add(*masklcBox, false);
// contrastBox->pack_start(*expmasklc, false, false);
contrastBox->pack_start(*expmasklc, false, false);
expcontrast->add(*contrastBox, false);
expcontrast->setLevel(2);