Wavelet levels - pp3 contrast expanders issue2594

This commit is contained in:
jdc
2015-02-03 08:14:40 +01:00
parent 2a18857b84
commit b05fa5d6a1
74 changed files with 698 additions and 333 deletions

View File

@@ -247,7 +247,7 @@ int wavNestedLevels = 1;
if(minwin*skip < 256) maxlevelcrop = 7;//sampling 128
if(minwin*skip < 128) maxlevelcrop = 6;
if(minwin < 64) maxlevelcrop = 5;
printf("minwin=%d maxcrop=%d\n",minwin, maxlevelcrop);
// printf("minwin=%d maxcrop=%d\n",minwin, maxlevelcrop);
int levwav=params->wavelet.thres;
if(levwav==9 && cp.mul[9]!=0) levwav=10;
@@ -300,12 +300,12 @@ int wavNestedLevels = 1;
if(minsizetile < 128) maxlev2 = 6;
levwav=min(maxlev2,levwav);
printf("levwav = %d\n",levwav);
//printf("levwav = %d\n",levwav);
int numthreads = 1;
int maxnumberofthreadsforwavelet =0;
//reduce memory for big tile size
if(kall!=0) {
if(kall!=0) {
if(realtile <= 22) maxnumberofthreadsforwavelet=2;
if(realtile <= 20) maxnumberofthreadsforwavelet=3;
if(realtile <= 18) maxnumberofthreadsforwavelet=4;
@@ -694,12 +694,57 @@ omp_set_nested(oldNested);
int maxlvl = WaveletCoeffs_L.maxlevel();
int W_L = WaveletCoeffs_L.level_W(1);
int H_L = WaveletCoeffs_L.level_H(1);
float * WavCoeffs_L0 = WaveletCoeffs_L.coeff0;
float maxh=2.5f;//amplification contrast above mean
float maxl=2.5f; //reduction contrast under mean
float contrast=cp.unif;
float multL=(float)contrast*(maxl-1.f)/100.f + 1.f;
float multH=(float) contrast*(maxh-1.f)/100.f + 1.f;
double avedbl=0.f; // use double precision for big summations
#ifdef _OPENMP
#pragma omp parallel for reduction(+:avedbl) num_threads(wavNestedLevels) if(wavNestedLevels>1)
#endif
for (int i=0; i<W_L*H_L; i++) {
avedbl += WavCoeffs_L0[i];
}
float ave = avedbl / (double)(W_L*H_L);
float av=ave/327.68f;
float ah=(multH-1.f)/(av-100.f);//av ==> lumaref
float bh=1.f-100.f*ah;
float al=(multL-1.f)/av;
float bl=1.f;
float factorx=1.f;
#ifdef _OPENMP
#pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1)
#endif
{
#ifdef _OPENMP
#pragma omp for
#endif
for (int i=0; i<W_L*H_L; i++) {//contrast
if(WavCoeffs_L0[i] < 32768.f) {
float prov;
if( WavCoeffs_L0[i]> ave) {
float kh = ah*(WavCoeffs_L0[i]/327.68f)+bh;
prov=WavCoeffs_L0[i];
WavCoeffs_L0[i]=ave+kh*(WavCoeffs_L0[i]-ave);
} else {
float kl = al*(WavCoeffs_L0[i]/327.68f)+1.f;
prov=WavCoeffs_L0[i];
WavCoeffs_L0[i]=ave-kl*(ave-WavCoeffs_L0[i]);
}
float diflc=WavCoeffs_L0[i]-prov;
diflc*=factorx;
WavCoeffs_L0[i] = prov + diflc;
}
}
#ifdef _OPENMP
#pragma omp for nowait
#endif
@@ -761,6 +806,10 @@ omp_set_nested(oldNested);
int H_L = WaveletCoeffs_ab.level_H(1);
float * WavCoeffs_ab0 = WaveletCoeffs_ab.coeff0;
#ifdef _OPENMP
#pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1)
#endif

View File

@@ -463,7 +463,6 @@ void WaveletParams::setDefaults() {
getDefaultOpacityCurveRG(opacityCurveRG);
getDefaultOpacityCurveBY(opacityCurveBY);
enabled = false;
display = true;
median = false;
avoid = false;
Lmethod = "4_";
@@ -1511,8 +1510,7 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, bool fnameAbsol
// save wavelet parameters
if (!pedited || pedited->wavelet.enabled) keyFile.set_boolean ("Wavelet", "Enabled", wavelet.enabled);
if (!pedited || pedited->wavelet.display) keyFile.set_boolean ("Wavelet", "Display", wavelet.display);
if (!pedited || pedited->wavelet.thres) keyFile.set_integer ("Wavelet", "MaxLev", wavelet.thres);
if (!pedited || pedited->wavelet.thres) keyFile.set_integer ("Wavelet", "MaxLev", wavelet.thres);
if (!pedited || pedited->wavelet.Tilesmethod) keyFile.set_string ("Wavelet", "TilesMethod", wavelet.Tilesmethod);
if (!pedited || pedited->wavelet.CLmethod) keyFile.set_string ("Wavelet", "ChoiceLevMethod", wavelet.CLmethod);
if (!pedited || pedited->wavelet.Lmethod) keyFile.set_string ("Wavelet", "LevMethod", wavelet.Lmethod);
@@ -1539,7 +1537,6 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, bool fnameAbsol
if (!pedited || pedited->wavelet.chroma) keyFile.set_integer ("Wavelet", "ThresholdChroma", wavelet.chroma);
if (!pedited || pedited->wavelet.CHmethod) keyFile.set_string ("Wavelet", "CHromaMethod", wavelet.CHmethod);
if (!pedited || pedited->wavelet.chro) keyFile.set_integer ("Wavelet", "ChromaLink", wavelet.chro);
// if (!pedited || pedited->wavelet.unif) keyFile.set_integer ("Wavelet", "Unif", wavelet.unif);
if (!pedited || pedited->wavelet.clvcurve) {
Glib::ArrayHandle<double> clvcurve = wavelet.clvcurve;
keyFile.set_double_list("Wavelet", "ChromaCurve", clvcurve);
@@ -1582,6 +1579,7 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, bool fnameAbsol
Glib::ArrayHandle<int> thresh (wavelet.hueskin2.value, 4, Glib::OWNERSHIP_NONE);
keyFile.set_integer_list("Wavelet", "HueRange", thresh);
}
if (!pedited || pedited->wavelet.unif) keyFile.set_integer ("Wavelet", "Contrast", wavelet.unif);
// save directional pyramid wavelet parameters
@@ -2301,7 +2299,6 @@ if (keyFile.has_group ("Color Management")) {
if (keyFile.has_group ("Wavelet")) {
if (keyFile.has_key ("Wavelet", "Enabled")) { wavelet.enabled = keyFile.get_boolean ("Wavelet", "Enabled"); if (pedited) pedited->wavelet.enabled = true; }
if (keyFile.has_key ("Wavelet", "Display")){ wavelet.display = keyFile.get_boolean ("Wavelet", "Display");if (pedited) pedited->wavelet.display = true;}
if (keyFile.has_key ("Wavelet", "Median")) {wavelet.median = keyFile.get_boolean ("Wavelet", "Median");if (pedited) pedited->wavelet.median = true;}
if (keyFile.has_key ("Wavelet", "AvoidColorShift")) {wavelet.avoid = keyFile.get_boolean ("Wavelet", "AvoidColorShift");if (pedited) pedited->wavelet.avoid = true;}
if (keyFile.has_key ("Wavelet", "LevMethod")) {wavelet.Lmethod = keyFile.get_string ("Wavelet", "LevMethod"); if (pedited) pedited->wavelet.Lmethod = true; }
@@ -2321,7 +2318,7 @@ if (keyFile.has_group ("Wavelet")) {
if (keyFile.has_key ("Wavelet", "ThresholdShadow")) {wavelet.threshold2 = keyFile.get_integer ("Wavelet", "ThresholdShadow"); if (pedited) pedited->wavelet.threshold2 = true; }
if (keyFile.has_key ("Wavelet", "ThresholdChroma")) {wavelet.chroma = keyFile.get_integer ("Wavelet", "ThresholdChroma"); if (pedited) pedited->wavelet.chroma = true; }
if (keyFile.has_key ("Wavelet", "ChromaLink")) {wavelet.chro = keyFile.get_integer ("Wavelet", "ChromaLink"); if (pedited) pedited->wavelet.chro = true; }
if (keyFile.has_key ("Wavelet", "Unif")) {wavelet.unif = keyFile.get_integer ("Wavelet", "Unif"); if (pedited) pedited->wavelet.unif = true; }
if (keyFile.has_key ("Wavelet", "Contrast")) {wavelet.unif = keyFile.get_integer ("Wavelet", "Contrast"); if (pedited) pedited->wavelet.unif = true; }
if (keyFile.has_key ("Wavelet", "ThresholdResidShadow")) {wavelet.thr = keyFile.get_integer ("Wavelet", "ThresholdResidShadow"); if (pedited) pedited->wavelet.thr = true; }
if (keyFile.has_key ("Wavelet", "ThresholdResidHighLight")) {wavelet.thr = keyFile.get_integer ("Wavelet", "ThresholdResidHighLight"); if (pedited) pedited->wavelet.thrH = true; }
if (keyFile.has_key ("Wavelet", "ChromaCurve")) {wavelet.clvcurve = keyFile.get_double_list ("Wavelet", "ChromaCurve"); if (pedited) pedited->wavelet.clvcurve = true; }

View File

@@ -860,7 +860,6 @@ class WaveletParams {
std::vector<double> opacityCurveRG;
std::vector<double> opacityCurveBY;
bool enabled;
bool display;
bool median;
bool avoid;
int c[9];