Merge pull request #4818 from Beep6581/wavelet_CompressDR_review

review ImProcFunctions::CompressDR(), fixes #4815
This commit is contained in:
Ingo Weyrich
2018-09-18 10:00:29 +02:00
committed by GitHub
2 changed files with 19 additions and 97 deletions

View File

@@ -255,9 +255,8 @@ 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 EPDToneMapResid(float * WavCoeffs_L0, unsigned int Iterates, int skip, struct cont_params& cp, int W_L, int H_L, float max0, float min0);
float *CompressDR(float *Source, int W_L, int H_L, float Compression, float DetailBoost, float *Compressed); void CompressDR(float *Source, int W_L, int H_L, float Compression, float DetailBoost);
void ContrastResid(float * WavCoeffs_L0, struct cont_params &cp, int W_L, int H_L, float max0, float min0); void ContrastResid(float * WavCoeffs_L0, struct cont_params &cp, int W_L, int H_L, float max0, float min0);
float *ContrastDR(float *Source, int W_L, int H_L, float *Contrast = nullptr);
void EPDToneMap(LabImage *lab, unsigned int Iterates = 0, int skip = 1); void EPDToneMap(LabImage *lab, unsigned int Iterates = 0, int skip = 1);
void EPDToneMapCIE(CieImage *ncie, float a_w, float c_, int Wid, int Hei, float minQ, float maxQ, unsigned int Iterates = 0, int skip = 1); void EPDToneMapCIE(CieImage *ncie, float a_w, float c_, int Wid, int Hei, float minQ, float maxQ, unsigned int Iterates = 0, int skip = 1);

View File

@@ -1425,115 +1425,48 @@ void ImProcFunctions::Eval2 (float ** WavCoeffs_L, int level,
MaxN[level] = maxLN; MaxN[level] = maxLN;
} }
float *ImProcFunctions::ContrastDR(float *Source, int W_L, int H_L, float *Contrast) void ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compression, float DetailBoost)
{ {
int n = W_L * H_L; const int n = W_L * H_L;
if(Contrast == nullptr) { float exponent;
Contrast = new float[n];
}
memcpy(Contrast, Source, n * sizeof(float));
#ifdef _OPENMP
#pragma omp parallel for
#endif
for (int i = 0; i < W_L * H_L; i++) { //contrast
Contrast[i] = Source[i] ;
}
return Contrast;
}
float *ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compression, float DetailBoost, float *Compressed)
{
const float eps = 0.000001f;
int n = W_L * H_L;
#ifdef __SSE2__
#ifdef _OPENMP
#pragma omp parallel
#endif
{
__m128 epsv = _mm_set1_ps( eps );
#ifdef _OPENMP
#pragma omp for
#endif
for(int ii = 0; ii < n - 3; ii += 4) {
_mm_storeu_ps( &Source[ii], xlogf(LVFU(Source[ii]) + epsv));
}
}
for(int ii = n - (n % 4); ii < n; ii++) {
Source[ii] = xlogf(Source[ii] + eps);
}
#else
#ifdef _OPENMP
#pragma omp parallel for
#endif
for(int ii = 0; ii < n; ii++) {
Source[ii] = xlogf(Source[ii] + eps);
}
#endif
float *ucr = ContrastDR(Source, W_L, H_L);
if(Compressed == nullptr) {
Compressed = ucr;
}
float temp;
if(DetailBoost > 0.f && DetailBoost < 0.05f ) { 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.694f)) - 1.f; //0.694 = log(2)
temp = 1.2f * xlogf( -betemp); exponent = 1.2f * xlogf( -betemp);
temp /= 20.f; exponent /= 20.f;
} else if(DetailBoost >= 0.05f && DetailBoost < 0.25f ) { } 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.694f)) - 1.f; //0.694 = log(2)
temp = 1.2f * xlogf( -betemp); exponent = 1.2f * xlogf( -betemp);
temp /= (-75.f * DetailBoost + 23.75f); exponent /= (-75.f * DetailBoost + 23.75f);
} else if(DetailBoost >= 0.25f) { } 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.694f)) - 1.f; //0.694 = log(2)
temp = 1.2f * xlogf( -betemp); exponent = 1.2f * xlogf( -betemp);
temp /= (-2.f * DetailBoost + 5.5f); exponent /= (-2.f * DetailBoost + 5.5f);
} else {
exponent = (Compression - 1.0f) / 20.f;
} }
else { exponent += 1.f;
temp = (Compression - 1.0f) / 20.f;
}
// now calculate Source = pow(Source, exponent)
#ifdef __SSE2__ #ifdef __SSE2__
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel #pragma omp parallel
#endif #endif
{ {
__m128 cev, uev, sourcev; vfloat exponentv = F2V(exponent);
__m128 epsv = _mm_set1_ps( eps );
__m128 DetailBoostv = _mm_set1_ps( DetailBoost );
__m128 tempv = _mm_set1_ps( temp );
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp for #pragma omp for
#endif #endif
for(int i = 0; i < n - 3; i += 4) { for(int i = 0; i < n - 3; i += 4) {
cev = xexpf(LVFU(Source[i]) + LVFU(ucr[i]) * (tempv)) - epsv; STVFU(Source[i], xexpf(xlogf(LVFU(Source[i])) * exponentv));
uev = xexpf(LVFU(ucr[i])) - epsv;
sourcev = xexpf(LVFU(Source[i])) - epsv;
_mm_storeu_ps( &Source[i], sourcev);
_mm_storeu_ps( &Compressed[i], cev + DetailBoostv * (sourcev - uev) );
} }
} }
for(int i = n - (n % 4); i < n; i++) { for(int i = n - (n % 4); i < n; i++) {
float ce = xexpf(Source[i] + ucr[i] * (temp)) - eps; Source[i] = xexpf(xlogf(Source[i]) * exponent);
float ue = xexpf(ucr[i]) - eps;
Source[i] = xexpf(Source[i]) - eps;
Compressed[i] = ce + DetailBoost * (Source[i] - ue);
} }
#else #else
@@ -1542,21 +1475,11 @@ float *ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compre
#endif #endif
for(int i = 0; i < n; i++) { for(int i = 0; i < n; i++) {
float ce = xexpf(Source[i] + ucr[i] * (temp)) - eps; Source[i] = xexpf(xlogf(Source[i]) * exponent);
float ue = xexpf(ucr[i]) - eps;
Source[i] = xexpf(Source[i]) - eps;
Compressed[i] = ce + DetailBoost * (Source[i] - ue);
} }
#endif #endif
if(Compressed != ucr) {
delete[] ucr;
}
return Compressed;
} }
void ImProcFunctions::ContrastResid(float * WavCoeffs_L0, struct cont_params &cp, int W_L, int H_L, float max0, float min0) void ImProcFunctions::ContrastResid(float * WavCoeffs_L0, struct cont_params &cp, int W_L, int H_L, float max0, float min0)
@@ -1589,7 +1512,7 @@ void ImProcFunctions::ContrastResid(float * WavCoeffs_L0, struct cont_params &cp
} }
CompressDR(WavCoeffs_L0, W_L, H_L, Compression, DetailBoost, WavCoeffs_L0); CompressDR(WavCoeffs_L0, W_L, H_L, Compression, DetailBoost);
#ifdef _OPENMP #ifdef _OPENMP