Add threshold to wavelet pyramid dynamic compression

This commit is contained in:
Desmis 2020-01-04 13:44:15 +01:00
parent ce7da78aef
commit 40449b931b
12 changed files with 106 additions and 39 deletions

View File

@ -1124,6 +1124,7 @@ HISTORY_MSG_884;Local - Contrast Dynamic Range Laplacian
HISTORY_MSG_885;Local - Contrast Dynamic Range Wavelet
HISTORY_MSG_886;Local - Contrast Wavelet Curve Compression
HISTORY_MSG_887;Local - Contrast Wavelet Compression Residual
HISTORY_MSG_888;Local - Contrast Wavelet Threshold
HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors
HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction
HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction
@ -2595,6 +2596,7 @@ TP_LOCALLAB_TARGET_GRAY;Target Gray Point
TP_LOCALLAB_THRES;Threshold structure
TP_LOCALLAB_THRESDELTAE;Threshold ΔE-scope
TP_LOCALLAB_THRESRETI;Threshold
TP_LOCALLAB_THRESWAV;Threshold
TP_LOCALLAB_TLABEL2;TM Effective Tm=%1 TM=%2
TP_LOCALLAB_TLABEL;TM Datas Min=%1 Max=%2 Mean=%3 Sigma=%4 (Threshold)
TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can act on Threshold to normalize

View File

@ -210,7 +210,7 @@ public:
void EPDToneMapResid(float * WavCoeffs_L0, unsigned int Iterates, int skip, struct cont_params& cp, int W_L, int H_L, float max0, float min0);
void CompressDR(float *Source, int W_L, int H_L, float Compression, float DetailBoost);
void Compresslevels(float **Source, int W_L, int H_L, float Compression, float DetailBoost);
void Compresslevels(float **Source, int W_L, int H_L, float compression, float detailBoost, float thres, float maxp, float maxn);
void ContrastResid(float * WavCoeffs_L0, struct cont_params &cp, int W_L, int H_L, float max0, float min0);
void EPDToneMap(LabImage *lab, unsigned int Iterates = 0, int skip = 1);
@ -324,13 +324,13 @@ public:
const LocwavCurve & locconwavCurve, bool & locconwavutili, bool wavcurvecon,
const LocwavCurve & loccompwavCurve, bool & loccompwavutili, bool wavcurvecomp,
const LocwavCurve & loccomprewavCurve, bool & loccomprewavutili, bool wavcurvecompre,
float sigm, float offs,int & maxlvl, float fatdet, float fatanch, float chromalev, float chromablu, bool blurlc, bool blurena, bool levelena, bool comprena, bool compreena, float compress);
float sigm, float offs,int & maxlvl, float fatdet, float fatanch, float chromalev, float chromablu, bool blurlc, bool blurena, bool levelena, bool comprena, bool compreena, float compress, float thres);
void wavcont(wavelet_decomposition &wdspot, float ****templevel, int level_bl, int maxlvl,
const LocwavCurve & loclevwavCurve, bool & loclevwavutili,
const LocwavCurve & loccompwavCurve, bool & loccompwavutili,
const LocwavCurve & loccomprewavCurve, bool & loccomprewavutili,
float radlevblur, int process, procparams::FattalToneMappingParams &fatParams, float chromablu);
float radlevblur, int process, procparams::FattalToneMappingParams &fatParams, float chromablu, float thres);
void wavcbd(wavelet_decomposition &wdspot, int level_bl, int maxlvl,
const LocwavCurve & locconwavCurve, bool & locconwavutili, float sigm, float offs, float chromalev, int sk);

View File

@ -4096,7 +4096,7 @@ void ImProcFunctions::maskcalccol(int call, bool invmask, bool pde, int bfw, int
bool wavcurvecomp = false;
bool loccomprewavutili = false;
bool wavcurvecompre = false;
wavcontrast4(bufmaskblurcol->L, nullptr, nullptr, contrast, 0.f, 0.f, 0.f, bfw, bfh, level_bl, level_hl, level_br, level_hr, sk, numThreads, loclmasCurvecolwav, lmasutilicolwav, dummy, loclevwavutili, wavcurvelev, dummy, locconwavutili, wavcurvecon, dummy, loccompwavutili, wavcurvecomp, dummy, loccomprewavutili, wavcurvecompre, 1.f, 1.f, maxlvl, 0.f, 0.f, 1.f, 1.f, false, false, false, false, false, 0.f);
wavcontrast4(bufmaskblurcol->L, nullptr, nullptr, contrast, 0.f, 0.f, 0.f, bfw, bfh, level_bl, level_hl, level_br, level_hr, sk, numThreads, loclmasCurvecolwav, lmasutilicolwav, dummy, loclevwavutili, wavcurvelev, dummy, locconwavutili, wavcurvecon, dummy, loccompwavutili, wavcurvecomp, dummy, loccomprewavutili, wavcurvecompre, 1.f, 1.f, maxlvl, 0.f, 0.f, 1.f, 1.f, false, false, false, false, false, 0.f, 0.f);
}
@ -7044,28 +7044,32 @@ void ImProcFunctions::wavcbd(wavelet_decomposition &wdspot, int level_bl, int ma
}
void ImProcFunctions::Compresslevels(float **Source, int W_L, int H_L, float Compression, float DetailBoost)
void ImProcFunctions::Compresslevels(float **Source, int W_L, int H_L, float compression, float detailBoost, float thres, float maxp, float maxn)
{
//J.Desmis 12-2019
float exponent;
if (DetailBoost > 0.f && DetailBoost < 0.05f) {
float betemp = expf(-(2.f - DetailBoost + 0.694f)) - 1.f; //0.694 = log(2)
if (detailBoost > 0.f && detailBoost < 0.05f) {
float betemp = expf(-(2.f - detailBoost + 0.693147f)) - 1.f; //0.69315 = log(2)
exponent = 1.2f * xlogf(-betemp);
exponent /= 20.f;
} else if (DetailBoost >= 0.05f && DetailBoost < 0.25f) {
float betemp = expf(-(2.f - DetailBoost + 0.694f)) - 1.f;
} else if (detailBoost >= 0.05f && detailBoost < 0.25f) {
float betemp = expf(-(2.f - detailBoost + 0.693147f)) - 1.f;
exponent = 1.2f * xlogf(-betemp);
exponent /= (-75.f * DetailBoost + 23.75f);
} else if (DetailBoost >= 0.25f) {
float betemp = expf(-(2.f - DetailBoost + 0.694f)) - 1.f;
exponent /= (-75.f * detailBoost + 23.75f);
} else if (detailBoost >= 0.25f) {
float betemp = expf(-(2.f - detailBoost + 0.693147f)) - 1.f;
exponent = 1.2f * xlogf(-betemp);
exponent /= (-2.f * DetailBoost + 5.5f);
exponent /= (-2.f * detailBoost + 5.5f);
} else {
exponent = (Compression - 1.0f) / 20.f;
exponent = (compression - 1.0f) / 20.f;
}
exponent += 1.f;
if(thres == 0.f) {
thres = 0.00001f;
}
#ifdef _OPENMP
#pragma omp parallel for
@ -7073,10 +7077,10 @@ void ImProcFunctions::Compresslevels(float **Source, int W_L, int H_L, float Com
for (int y = 0; y < H_L; y++) {
for (int x = 0; x < W_L; x++) {
if (Source[y][x] > 0.f) {
Source[y][x] = xexpf(xlogf(Source[y][x]) * exponent);
} else {
Source[y][x] = -xexpf(xlogf(-Source[y][x]) * exponent);
if (Source[y][x] >= 0.f && Source[y][x] < (maxp - thres)) {
Source[y][x] = xexpf(xlogf(Source[y][x] + thres) * exponent);
} else if (Source[y][x] < 0.f && Source[y][x] > (maxn + thres)) {
Source[y][x] = -xexpf(xlogf(-Source[y][x] + thres) * exponent);
}
}
}
@ -7088,7 +7092,7 @@ void ImProcFunctions::wavcont(wavelet_decomposition &wdspot, float ****templevel
const LocwavCurve & loclevwavCurve, bool & loclevwavutili,
const LocwavCurve & loccompwavCurve, bool & loccompwavutili,
const LocwavCurve & loccomprewavCurve, bool & loccomprewavutili,
float radlevblur, int process, FattalToneMappingParams &fatParams, float chromablu)
float radlevblur, int process, FattalToneMappingParams &fatParams, float chromablu, float thres)
{
#ifdef _OPENMP
@ -7147,12 +7151,18 @@ void ImProcFunctions::wavcont(wavelet_decomposition &wdspot, float ****templevel
}
if (process == 3) { //Dynamic compression wavelet
float mean[10];
float meanN[10];
float sigma[10];
float sigmaN[10];
float MaxP[10];
float MaxN[10];
Evaluate2(wdspot, mean, meanN, sigma, sigmaN, MaxP, MaxN);
for (int dir = 1; dir < 4; dir++) {
for (int level = level_bl; level < maxlvl; ++level) {
int W_L = wdspot.level_W(level);
int H_L = wdspot.level_H(level);
if (loccomprewavCurve && loccomprewavutili) {
float klev = 2.f * (loccomprewavCurve[level * 55.5f] - 0.5f);
@ -7160,14 +7170,18 @@ void ImProcFunctions::wavcont(wavelet_decomposition &wdspot, float ****templevel
klev *= 2.f;
}
float Compression = expf(-klev);
float DetailBoost = klev;
float compression = expf(-klev);
float detailBoost = klev;
if (klev < 0.0f) {
DetailBoost = 0.0f;
detailBoost = 0.0f;
}
Compresslevels(templevel[dir - 1][level], W_L, H_L, Compression, DetailBoost);
float thresref = mean[level];
float thresreal = 0.2f * thres * thresref;
Compresslevels(templevel[dir - 1][level], W_L, H_L, compression, detailBoost, thresreal, MaxP[level], MaxN[level]);
}
}
}
@ -7200,7 +7214,7 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f
const LocwavCurve & locconwavCurve, bool & locconwavutili, bool wavcurvecon,
const LocwavCurve & loccompwavCurve, bool & loccompwavutili, bool wavcurvecomp,
const LocwavCurve & loccomprewavCurve, bool & loccomprewavutili, bool wavcurvecompre,
float sigm, float offs, int & maxlvl, float fatdet, float fatanch, float chromalev, float chromablu, bool blurlc, bool blurena, bool levelena, bool comprena, bool compreena, float compress)
float sigm, float offs, int & maxlvl, float fatdet, float fatanch, float chromalev, float chromablu, bool blurlc, bool blurena, bool levelena, bool comprena, bool compreena, float compress, float thres)
{
wavelet_decomposition *wdspot = new wavelet_decomposition(tmp[0], bfw, bfh, maxlvl, 1, sk, numThreads, 6);
@ -7356,6 +7370,15 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f
if (wavcurvelev || wavcurvecomp || wavcurvecompre) {//compress dynamic and blur
float mean[10];
float meanN[10];
float sigma[10];
float sigmaN[10];
float MaxP[10];
float MaxN[10];
Evaluate2(*wdspot, mean, meanN, sigma, sigmaN, MaxP, MaxN);
fatParams.enabled = wavcurvecomp;
templevel = new float***[dir];
@ -7379,15 +7402,15 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f
}
if (wavcurvelev && radlevblur > 0.f && blurena) {
wavcont(*wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 1, fatParams, 1.f);
wavcont(*wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 1, fatParams, 1.f, 0.f);
}
if (wavcurvecomp && comprena) {
wavcont(*wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 2, fatParams, 1.f);
wavcont(*wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 2, fatParams, 1.f, 0.f);
}
if (wavcurvecompre && compreena) {
wavcont(*wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 3, fatParams, 1.f);
wavcont(*wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 3, fatParams, 1.f, thres);
}
//free memory templevel
@ -7557,7 +7580,7 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f
}
if (wavcurvelev && radlevblur > 0.f) {
wavcont(*wdspota, templevela, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 1, fatParams, chromablu);
wavcont(*wdspota, templevela, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 1, fatParams, chromablu, 0.f);
}
wdspota->reconstruct(tmpa[0], 1.f);
@ -7612,7 +7635,7 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f
}
if (wavcurvelev && radlevblur > 0.f) {
wavcont(*wdspotb, templevelb, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 1, fatParams, chromablu);
wavcont(*wdspotb, templevelb, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 1, fatParams, chromablu, 0.f);
}
wdspotb->reconstruct(tmpb[0], 1.f);
@ -9647,7 +9670,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
bool wavcurvecomp = false;
bool loccomprewavutili = false;
bool wavcurvecompre = false;
wavcontrast4(bufmaskblurbl->L, nullptr, nullptr, contrast, 0.f, 0.f, 0.f, GW, GH, level_bl, level_hl, level_br, level_hr, sk, numThreads, loclmasCurveblwav, lmasutiliblwav, dummy, loclevwavutili, wavcurvelev, dummy, locconwavutili, wavcurvecon, dummy, loccompwavutili, wavcurvecomp, dummy, loccomprewavutili, wavcurvecompre, 1.f, 1.f, maxlvl, 0.f, 0.f, 1.f, 1.f, false, false, false, false, false, 0.f);
wavcontrast4(bufmaskblurbl->L, nullptr, nullptr, contrast, 0.f, 0.f, 0.f, GW, GH, level_bl, level_hl, level_br, level_hr, sk, numThreads, loclmasCurveblwav, lmasutiliblwav, dummy, loclevwavutili, wavcurvelev, dummy, locconwavutili, wavcurvecon, dummy, loccompwavutili, wavcurvecomp, dummy, loccomprewavutili, wavcurvecompre, 1.f, 1.f, maxlvl, 0.f, 0.f, 1.f, 1.f, false, false, false, false, false, 0.f, 0.f);
}
int shado = params->locallab.spots.at(sp).shadmaskbl;
@ -11598,8 +11621,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
const bool comprena = params->locallab.spots.at(sp).wavcomp;
const bool compreena = params->locallab.spots.at(sp).wavcompre;
const float compress = params->locallab.spots.at(sp).residcomp;
const float thres = params->locallab.spots.at(sp).threswav;
wavcontrast4(tmp1->L, tmp1->a, tmp1->b, 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, loccomprewavCurve, loccomprewavutili, wavcurvecompre, sigma, offs, maxlvl, fatdet, fatanch, chrol, chrobl, blurlc, blurena, levelena, comprena, compreena, compress);
wavcontrast4(tmp1->L, tmp1->a, tmp1->b, 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, loccomprewavCurve, loccomprewavutili, wavcurvecompre, sigma, offs, maxlvl, fatdet, fatanch, chrol, chrobl, blurlc, blurena, levelena, comprena, compreena, compress, thres);
const float satur = params->locallab.spots.at(sp).residchro;

View File

@ -1432,15 +1432,15 @@ void ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compress
float exponent;
if (DetailBoost > 0.f && DetailBoost < 0.05f ) {
float betemp = expf (- (2.f - DetailBoost + 0.694f)) - 1.f; //0.694 = log(2)
float betemp = expf (- (2.f - DetailBoost + 0.693147f)) - 1.f; //0.693147 = log(2)
exponent = 1.2f * xlogf( -betemp);
exponent /= 20.f;
} else if (DetailBoost >= 0.05f && DetailBoost < 0.25f ) {
float betemp = expf (- (2.f - DetailBoost + 0.694f)) - 1.f; //0.694 = log(2)
float betemp = expf (- (2.f - DetailBoost + 0.693147f)) - 1.f;
exponent = 1.2f * xlogf( -betemp);
exponent /= (-75.f * DetailBoost + 23.75f);
} else if (DetailBoost >= 0.25f) {
float betemp = expf (- (2.f - DetailBoost + 0.694f)) - 1.f; //0.694 = log(2)
float betemp = expf (- (2.f - DetailBoost + 0.693147f)) - 1.f;
exponent = 1.2f * xlogf( -betemp);
exponent /= (-2.f * DetailBoost + 5.5f);
} else {
@ -1448,6 +1448,7 @@ void ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compress
}
exponent += 1.f;
const float eps = 0.0001f;
// now calculate Source = pow(Source, exponent)
#ifdef __SSE2__
@ -1456,17 +1457,19 @@ void ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compress
#endif
{
vfloat exponentv = F2V(exponent);
__m128 epsv = _mm_set1_ps( eps );
#ifdef _OPENMP
#pragma omp for
#endif
for (int i = 0; i < n - 3; i += 4) {
STVFU(Source[i], xexpf(xlogf(LVFU(Source[i])) * exponentv));
STVFU(Source[i], xexpf(xlogf(LVFU(Source[i]) + epsv) * exponentv));
}
}
for (int i = n - (n % 4); i < n; i++) {
Source[i] = xexpf(xlogf(Source[i]) * exponent);
Source[i] = xexpf(xlogf(Source[i] + eps) * exponent);
}
#else

View File

@ -913,6 +913,7 @@ enum ProcEventCode {
Evlocallabwavcompre = 884,
EvlocallabwavCurvecompre = 885,
Evlocallabresidcomp = 886,
Evlocallabthreswav = 887,
NUMOFEVENTS
};

View File

@ -2729,6 +2729,7 @@ LocallabParams::LocallabSpot::LocallabSpot() :
residcomp(0.0),
sigma(1.0),
offset(1.0),
threswav(0.1),
chromalev(1.0),
chromablu(1.0),
fatdet(40.0),
@ -3143,6 +3144,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const
&& residcomp == other.residcomp
&& sigma == other.sigma
&& offset == other.offset
&& threswav == other.threswav
&& chromalev == other.chromalev
&& chromablu == other.chromablu
&& fatdet == other.fatdet
@ -4536,6 +4538,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
saveToKeyfile(!pedited || pedited->locallab.spots.at(i).residcomp, "Locallab", "Residcomp_" + std::to_string(i), spot.residcomp, keyFile);
saveToKeyfile(!pedited || pedited->locallab.spots.at(i).sigma, "Locallab", "Sigma_" + std::to_string(i), spot.sigma, keyFile);
saveToKeyfile(!pedited || pedited->locallab.spots.at(i).offset, "Locallab", "Offset_" + std::to_string(i), spot.offset, keyFile);
saveToKeyfile(!pedited || pedited->locallab.spots.at(i).threswav, "Locallab", "Threswav_" + std::to_string(i), spot.threswav, keyFile);
saveToKeyfile(!pedited || pedited->locallab.spots.at(i).chromalev, "Locallab", "Chromalev_" + std::to_string(i), spot.chromalev, keyFile);
saveToKeyfile(!pedited || pedited->locallab.spots.at(i).chromablu, "Locallab", "Chromablu_" + std::to_string(i), spot.chromablu, keyFile);
saveToKeyfile(!pedited || pedited->locallab.spots.at(i).fatdet, "Locallab", "Fatdet_" + std::to_string(i), spot.fatdet, keyFile);
@ -6080,6 +6083,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
assignFromKeyfile(keyFile, "Locallab", "Residcomp_" + std::to_string(i), pedited, spot.residcomp, spotEdited.residcomp);
assignFromKeyfile(keyFile, "Locallab", "Sigma_" + std::to_string(i), pedited, spot.sigma, spotEdited.sigma);
assignFromKeyfile(keyFile, "Locallab", "Offset_" + std::to_string(i), pedited, spot.offset, spotEdited.offset);
assignFromKeyfile(keyFile, "Locallab", "Threswav_" + std::to_string(i), pedited, spot.threswav, spotEdited.threswav);
assignFromKeyfile(keyFile, "Locallab", "Chromalev_" + std::to_string(i), pedited, spot.chromalev, spotEdited.chromalev);
assignFromKeyfile(keyFile, "Locallab", "Chromablu_" + std::to_string(i), pedited, spot.chromablu, spotEdited.chromablu);
assignFromKeyfile(keyFile, "Locallab", "Fatdet_" + std::to_string(i), pedited, spot.fatdet, spotEdited.fatdet);

View File

@ -1272,6 +1272,7 @@ struct LocallabParams {
double residcomp;
double sigma;
double offset;
double threswav;
double chromalev;
double chromablu;
double fatdet;

View File

@ -916,7 +916,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = {
LUMINANCECURVE, //Evlocallabwavcomp
LUMINANCECURVE, //Evlocallabwavcompre
LUMINANCECURVE, //EvlocallabwavCurvecompre
LUMINANCECURVE //Evlocallabresidcomp
LUMINANCECURVE, //Evlocallabresidcomp
LUMINANCECURVE //Evlocallabthreswav
};

View File

@ -582,6 +582,7 @@ residchro(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RESIDCHRO"), -100., 100., 1.,
residcomp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RESIDCOMP"), -1., 1., 0.01, 0.))),
sigma(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMAWAV"), 0.2, 2.5, 0.01, 1.))),
offset(Gtk::manage(new Adjuster(M("TP_LOCALLAB_OFFSETWAV"), 0.33, 1.66, 0.01, 1., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))),
threswav(Gtk::manage(new Adjuster(M("TP_LOCALLAB_THRESWAV"), 0.001, 1., 0.001, 0.1))),
chromalev(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMALEV"), 0.01, 2., 0.01, 1.))),
chromablu(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMABLU"), 0.01, 2., 0.01, 1.))),
fatdet(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATDETAIL"), -100., 300., 1., 0.))),
@ -2950,6 +2951,7 @@ pe(nullptr)
residcomp->setAdjusterListener(this);
sigma->setAdjusterListener(this);
offset->setAdjusterListener(this);
threswav->setAdjusterListener(this);
chromalev->setAdjusterListener(this);
chromablu->setAdjusterListener(this);
fatdet->setAdjusterListener(this);
@ -3024,6 +3026,7 @@ pe(nullptr)
wavcompre->set_active (false);
compreFrame->set_label_widget(*wavcompre);
compreBox->pack_start(*LocalcurveEditorwavcompre, Gtk::PACK_SHRINK, 4);
compreBox->pack_start(*threswav);
compreBox->pack_start(*residcomp);
compreFrame->add(*compreBox);
@ -5340,6 +5343,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited
pp->locallab.spots.at(pp->locallab.selspot).residcomp = residcomp->getValue();
pp->locallab.spots.at(pp->locallab.selspot).sigma = sigma->getValue();
pp->locallab.spots.at(pp->locallab.selspot).offset = offset->getValue();
pp->locallab.spots.at(pp->locallab.selspot).threswav = threswav->getValue();
pp->locallab.spots.at(pp->locallab.selspot).chromalev = chromalev->getValue();
pp->locallab.spots.at(pp->locallab.selspot).chromablu = chromablu->getValue();
pp->locallab.spots.at(pp->locallab.selspot).fatdet = fatdet->getValue();
@ -5757,6 +5761,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited
pe->locallab.spots.at(pp->locallab.selspot).residcomp = pe->locallab.spots.at(pp->locallab.selspot).residcomp || residcomp->getEditedState();
pe->locallab.spots.at(pp->locallab.selspot).sigma = pe->locallab.spots.at(pp->locallab.selspot).sigma || sigma->getEditedState();
pe->locallab.spots.at(pp->locallab.selspot).offset = pe->locallab.spots.at(pp->locallab.selspot).offset || offset->getEditedState();
pe->locallab.spots.at(pp->locallab.selspot).threswav = pe->locallab.spots.at(pp->locallab.selspot).threswav || threswav->getEditedState();
pe->locallab.spots.at(pp->locallab.selspot).chromalev = pe->locallab.spots.at(pp->locallab.selspot).chromalev || chromalev->getEditedState();
pe->locallab.spots.at(pp->locallab.selspot).chromablu = pe->locallab.spots.at(pp->locallab.selspot).chromablu || chromablu->getEditedState();
pe->locallab.spots.at(pp->locallab.selspot).fatdet = pe->locallab.spots.at(pp->locallab.selspot).fatdet || fatdet->getEditedState();
@ -6173,6 +6178,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited
pedited->locallab.spots.at(pp->locallab.selspot).residcomp = pedited->locallab.spots.at(pp->locallab.selspot).residcomp || residcomp->getEditedState();
pedited->locallab.spots.at(pp->locallab.selspot).sigma = pedited->locallab.spots.at(pp->locallab.selspot).sigma || sigma->getEditedState();
pedited->locallab.spots.at(pp->locallab.selspot).offset = pedited->locallab.spots.at(pp->locallab.selspot).offset || offset->getEditedState();
pedited->locallab.spots.at(pp->locallab.selspot).threswav = pedited->locallab.spots.at(pp->locallab.selspot).threswav || threswav->getEditedState();
pedited->locallab.spots.at(pp->locallab.selspot).chromalev = pedited->locallab.spots.at(pp->locallab.selspot).chromalev || chromalev->getEditedState();
pedited->locallab.spots.at(pp->locallab.selspot).chromablu = pedited->locallab.spots.at(pp->locallab.selspot).chromablu || chromablu->getEditedState();
pedited->locallab.spots.at(pp->locallab.selspot).fatdet = pedited->locallab.spots.at(pp->locallab.selspot).fatdet || fatdet->getEditedState();
@ -6764,6 +6770,7 @@ void Locallab::localcontMethodChanged()
residcomp->hide();
sigma->hide();
offset->hide();
threswav->hide();
chromalev->hide();
chromablu->hide();
fatdet->hide();
@ -6796,6 +6803,7 @@ void Locallab::localcontMethodChanged()
residcomp->show();
sigma->show();
offset->show();
threswav->show();
chromalev->show();
chromablu->show();
fatdet->show();
@ -8967,6 +8975,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c
residcomp->setDefault(defSpot->residcomp);
sigma->setDefault(defSpot->sigma);
offset->setDefault(defSpot->offset);
threswav->setDefault(defSpot->threswav);
chromalev->setDefault(defSpot->chromalev);
chromablu->setDefault(defSpot->chromablu);
fatdet->setDefault(defSpot->fatdet);
@ -9210,6 +9219,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c
residcomp->setDefaultEditedState(Irrelevant);
sigma->setDefaultEditedState(Irrelevant);
offset->setDefaultEditedState(Irrelevant);
threswav->setDefaultEditedState(Irrelevant);
chromalev->setDefaultEditedState(Irrelevant);
chromablu->setDefaultEditedState(Irrelevant);
fatdet->setDefaultEditedState(Irrelevant);
@ -9458,6 +9468,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c
residcomp->setDefaultEditedState(defSpotState->residcomp ? Edited : UnEdited);
sigma->setDefaultEditedState(defSpotState->sigma ? Edited : UnEdited);
offset->setDefaultEditedState(defSpotState->offset ? Edited : UnEdited);
threswav->setDefaultEditedState(defSpotState->threswav ? Edited : UnEdited);
chromalev->setDefaultEditedState(defSpotState->chromalev ? Edited : UnEdited);
chromablu->setDefaultEditedState(defSpotState->chromablu ? Edited : UnEdited);
fatdet->setDefaultEditedState(defSpotState->fatdet ? Edited : UnEdited);
@ -10649,6 +10660,12 @@ void Locallab::adjusterChanged(Adjuster * a, double newval)
}
}
if (a == threswav) {
if (listener) {
listener->panelChanged(Evlocallabthreswav, threswav->getTextValue());
}
}
if (a == chromalev) {
if (listener) {
listener->panelChanged(Evlocallabchromalev, chromalev->getTextValue());
@ -11172,6 +11189,7 @@ void Locallab::setBatchMode(bool batchMode)
residcomp->showEditedCB();
sigma->showEditedCB();
offset->showEditedCB();
threswav->showEditedCB();
chromalev->showEditedCB();
chromablu->showEditedCB();
fatdet->showEditedCB();
@ -12246,6 +12264,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con
residcomp->setValue(pp->locallab.spots.at(index).residcomp);
sigma->setValue(pp->locallab.spots.at(index).sigma);
offset->setValue(pp->locallab.spots.at(index).offset);
threswav->setValue(pp->locallab.spots.at(index).threswav);
chromalev->setValue(pp->locallab.spots.at(index).chromalev);
chromablu->setValue(pp->locallab.spots.at(index).chromablu);
fatdet->setValue(pp->locallab.spots.at(index).fatdet);
@ -12768,6 +12787,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con
residcomp->setEditedState(spotState->residcomp ? Edited : UnEdited);
sigma->setEditedState(spotState->sigma ? Edited : UnEdited);
offset->setEditedState(spotState->offset ? Edited : UnEdited);
threswav->setEditedState(spotState->threswav ? Edited : UnEdited);
chromalev->setEditedState(spotState->chromalev ? Edited : UnEdited);
chromablu->setEditedState(spotState->chromablu ? Edited : UnEdited);
fatdet->setEditedState(spotState->fatdet ? Edited : UnEdited);
@ -13300,6 +13320,7 @@ void Locallab::updateSpecificGUIState()
residcomp->hide();
sigma->hide();
offset->hide();
threswav->hide();
chromalev->hide();
chromablu->hide();
fatdet->hide();
@ -13330,6 +13351,7 @@ void Locallab::updateSpecificGUIState()
levelblur->show();
sigma->show();
offset->show();
threswav->show();
chromalev->show();
chromablu->show();
fatdet->show();

View File

@ -374,6 +374,7 @@ private:
Adjuster* const residcomp;
Adjuster* const sigma;
Adjuster* const offset;
Adjuster* const threswav;
Adjuster* const chromalev;
Adjuster* const chromablu;
Adjuster* const fatdet;

View File

@ -1265,6 +1265,7 @@ void ParamsEdited::initFrom(const std::vector<rtengine::procparams::ProcParams>&
locallab.spots.at(j).residcomp = locallab.spots.at(j).residcomp && pSpot.residcomp == otherSpot.residcomp;
locallab.spots.at(j).sigma = locallab.spots.at(j).sigma && pSpot.sigma == otherSpot.sigma;
locallab.spots.at(j).offset = locallab.spots.at(j).offset && pSpot.offset == otherSpot.offset;
locallab.spots.at(j).threswav = locallab.spots.at(j).threswav && pSpot.threswav == otherSpot.threswav;
locallab.spots.at(j).chromalev = locallab.spots.at(j).chromalev && pSpot.chromalev == otherSpot.chromalev;
locallab.spots.at(j).chromablu = locallab.spots.at(j).chromablu && pSpot.chromablu == otherSpot.chromablu;
locallab.spots.at(j).fatdet = locallab.spots.at(j).fatdet && pSpot.fatdet == otherSpot.fatdet;
@ -4043,6 +4044,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng
toEdit.locallab.spots.at(i).offset = mods.locallab.spots.at(i).offset;
}
if (locallab.spots.at(i).threswav) {
toEdit.locallab.spots.at(i).threswav = mods.locallab.spots.at(i).threswav;
}
if (locallab.spots.at(i).chromalev) {
toEdit.locallab.spots.at(i).chromalev = mods.locallab.spots.at(i).chromalev;
}
@ -5644,6 +5649,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) :
residcomp(v),
sigma(v),
offset(v),
threswav(v),
chromalev(v),
chromablu(v),
fatdet(v),
@ -6048,6 +6054,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v)
residcomp = v;
sigma = v;
offset = v;
threswav = v;
chromalev = v;
chromablu = v;
fatdet = v;

View File

@ -698,6 +698,7 @@ public:
bool residcomp;
bool sigma;
bool offset;
bool threswav;
bool chromalev;
bool chromablu;
bool fatdet;