review ImProcFunctions::CompressDR(), fixes #4815
This commit is contained in:
parent
e50b68208d
commit
1a191363ce
@ -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);
|
||||
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);
|
||||
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 EPDToneMapCIE(CieImage *ncie, float a_w, float c_, int Wid, int Hei, float minQ, float maxQ, unsigned int Iterates = 0, int skip = 1);
|
||||
|
@ -1425,67 +1425,11 @@ void ImProcFunctions::Eval2 (float ** WavCoeffs_L, int level,
|
||||
MaxN[level] = maxLN;
|
||||
}
|
||||
|
||||
float *ImProcFunctions::ContrastDR(float *Source, int W_L, int H_L, float *Contrast)
|
||||
{
|
||||
int n = W_L * H_L;
|
||||
|
||||
if(Contrast == nullptr) {
|
||||
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)
|
||||
void ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compression, float DetailBoost)
|
||||
{
|
||||
|
||||
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;
|
||||
}
|
||||
constexpr float eps = 0.000001f;
|
||||
const int n = W_L * H_L;
|
||||
|
||||
float temp;
|
||||
|
||||
@ -1501,39 +1445,30 @@ float *ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compre
|
||||
float betemp = expf(-(2.f - DetailBoost + 0.694f)) - 1.f; //0.694 = log(2)
|
||||
temp = 1.2f * xlogf( -betemp);
|
||||
temp /= (-2.f * DetailBoost + 5.5f);
|
||||
}
|
||||
|
||||
else {
|
||||
} else {
|
||||
temp = (Compression - 1.0f) / 20.f;
|
||||
}
|
||||
|
||||
temp += 1.f;
|
||||
|
||||
#ifdef __SSE2__
|
||||
#ifdef _OPENMP
|
||||
#pragma omp parallel
|
||||
#endif
|
||||
{
|
||||
__m128 cev, uev, sourcev;
|
||||
__m128 epsv = _mm_set1_ps( eps );
|
||||
__m128 DetailBoostv = _mm_set1_ps( DetailBoost );
|
||||
__m128 tempv = _mm_set1_ps( temp );
|
||||
vfloat epsv = F2V(eps);
|
||||
vfloat tempv = F2V(temp);
|
||||
#ifdef _OPENMP
|
||||
#pragma omp for
|
||||
#endif
|
||||
|
||||
for(int i = 0; i < n - 3; i += 4) {
|
||||
cev = xexpf(LVFU(Source[i]) + LVFU(ucr[i]) * (tempv)) - epsv;
|
||||
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) );
|
||||
STVFU(Source[i], xexpf(xlogf(LVFU(Source[i]) + epsv) * tempv) - epsv);
|
||||
}
|
||||
}
|
||||
|
||||
for(int i = n - (n % 4); i < n; i++) {
|
||||
float ce = xexpf(Source[i] + ucr[i] * (temp)) - eps;
|
||||
float ue = xexpf(ucr[i]) - eps;
|
||||
Source[i] = xexpf(Source[i]) - eps;
|
||||
Compressed[i] = ce + DetailBoost * (Source[i] - ue);
|
||||
Source[i] = xexpf(xlogf(Source[i] + eps) * temp) - eps;
|
||||
}
|
||||
|
||||
#else
|
||||
@ -1542,21 +1477,11 @@ float *ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compre
|
||||
#endif
|
||||
|
||||
for(int i = 0; i < n; i++) {
|
||||
float ce = xexpf(Source[i] + ucr[i] * (temp)) - eps;
|
||||
float ue = xexpf(ucr[i]) - eps;
|
||||
Source[i] = xexpf(Source[i]) - eps;
|
||||
Compressed[i] = ce + DetailBoost * (Source[i] - ue);
|
||||
Source[i] = xexpf(xlogf(Source[i] + eps) * temp) - eps;
|
||||
}
|
||||
|
||||
#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)
|
||||
@ -1589,7 +1514,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
|
||||
|
Loading…
x
Reference in New Issue
Block a user