Small issue found in Micocontrast on behalf of Reine Edvardson issue 1957

This commit is contained in:
jdc
2013-08-26 12:07:43 +02:00
parent 91b19a5ee5
commit d4b9d024b3

View File

@@ -20,9 +20,9 @@
#include "improcfun.h"
#include "gauss.h"
#include "bilateral2.h"
#include "rt_math.h"
#include "rt_math.h"
#include "sleef.c"
#ifdef __SSE2__
#ifdef __SSE2__
#include "sleefsseavx.c"
#endif
#ifdef _OPENMP
@@ -47,54 +47,54 @@ void ImProcFunctions::dcdamping (float** aI, float** aO, float damping, int W, i
#endif
const float dampingFac=-2.0/(damping*damping);
#ifdef __SSE2__
__m128 Iv,Ov,Uv,zerov,onev,fourv,fivev,dampingFacv,Tv;
zerov = _mm_setzero_ps( );
onev = _mm_set1_ps( 1.0f );
fourv = _mm_set1_ps( 4.0f );
fivev = _mm_set1_ps( 5.0f );
dampingFacv = _mm_set1_ps( dampingFac );
#ifdef __SSE2__
__m128 Iv,Ov,Uv,zerov,onev,fourv,fivev,dampingFacv,Tv;
zerov = _mm_setzero_ps( );
onev = _mm_set1_ps( 1.0f );
fourv = _mm_set1_ps( 4.0f );
fivev = _mm_set1_ps( 5.0f );
dampingFacv = _mm_set1_ps( dampingFac );
#ifdef _OPENMP
#pragma omp for
#endif
for (int i=0; i<H; i++)
for (int j=0; j<W-3; j+=4) {
Iv = _mm_loadu_ps( &aI[i][j] );
for (int j=0; j<W-3; j+=4) {
Iv = _mm_loadu_ps( &aI[i][j] );
Ov = _mm_loadu_ps( &aO[i][j] );
Uv = (Ov * xlogf(Iv/Ov) - Iv + Ov) * dampingFacv;
Uv = _mm_min_ps(Uv,onev);
Tv = Uv*Uv;
Tv = Tv*Tv;
Uv = _mm_min_ps(Uv,onev);
Tv = Uv*Uv;
Tv = Tv*Tv;
Uv = Tv*(fivev-Uv*fourv);
Uv = (Ov - Iv) / Iv * Uv + onev;
Uv = vself(vmaskf_ge(zerov, Iv), zerov, Uv);
Uv = vself(vmaskf_ge(zerov, Ov), zerov, Uv);
Uv = (Ov - Iv) / Iv * Uv + onev;
Uv = vself(vmaskf_ge(zerov, Iv), zerov, Uv);
Uv = vself(vmaskf_ge(zerov, Ov), zerov, Uv);
_mm_storeu_ps( &aI[i][j], Uv );
}
// border pixels are done without SSE2
float I,O,U;
}
// border pixels are done without SSE2
float I,O,U;
#ifdef _OPENMP
#pragma omp for
#endif
#endif
for (int i=0; i<H; i++)
for(int j=W-(W%4);j<W;j++) {
for(int j=W-(W%4);j<W;j++) {
I = aI[i][j];
O = aO[i][j];
if (O<=0.0 || I<=0.0) {
aI[i][j] = 0.0;
continue;
}
}
U = (O * xlogf(I/O) - I + O) * dampingFac;
U = min(U,1.0f);
U = U*U*U*U*(5.0-U*4.0);
aI[i][j] = (O - I) / I * U + 1.0;
}
#else // without __SSE2__
float I,O,U;
}
#else // without __SSE2__
float I,O,U;
#ifdef _OPENMP
#pragma omp for
#endif
@@ -105,12 +105,12 @@ void ImProcFunctions::dcdamping (float** aI, float** aO, float damping, int W, i
if (O<=0.0 || I<=0.0) {
aI[i][j] = 0.0;
continue;
}
}
U = (O * xlogf(I/O) - I + O) * dampingFac;
U = min(U,1.0f);
U = U*U*U*U*(5.0-U*4.0);
aI[i][j] = (O - I) / I * U + 1.0;
}
}
#endif
}
@@ -127,7 +127,7 @@ void ImProcFunctions::deconvsharpening (LabImage* lab, float** b2) {
tmpI[i][j] = (float)lab->L[i][j];
}
float** tmp = (float**)b2;
float** tmp = (float**)b2;
#ifdef _OPENMP
#pragma omp parallel
@@ -180,7 +180,7 @@ void ImProcFunctions::deconvsharpening (LabImage* lab, float** b2) {
for (int i=0; i<H; i++)
delete [] tmpI[i];
delete [] tmpI;
delete [] tmpI;
}
void ImProcFunctions::sharpening (LabImage* lab, float** b2) {
@@ -481,7 +481,11 @@ void ImProcFunctions::MLsharpen (LabImage* lab) {
// has waived all copyright and related or neighboring rights to this work.
// This code is licensed under CC0 v1.0, see license information at
// http://creativecommons.org/publicdomain/zero/1.0/
// addition from JD : pyramid + pondered contrast with matrix 5x5
//! MicroContrast is a sharpening method developed by Manuel Llorens and documented here: http://www.rawness.es/sharpening/?lang=en
//! <BR>The purpose is maximize clarity of the image without creating halo's.
//! <BR>Addition from JD : pyramid + pondered contrast with matrix 5x5
//! \param lab LabImage Image in the CIELab colour space
void ImProcFunctions::MLmicrocontrast(LabImage* lab) {
if (params->sharpenMicro.enabled==false)
return;
@@ -591,13 +595,14 @@ void ImProcFunctions::MLmicrocontrast(LabImage* lab) {
n=0;
for(row=j-k; row<=j+k; row++)
for(row=j-k; row<=j+k; row++){
for(col=i-k,offset2=row*width+col; col<=i+k; col++,offset2++){
if (((v<LM[offset2])&&(signs[n]>0))||((v>LM[offset2])&&(signs[n]<0))) {
temp = v*0.75f+LM[offset2]*0.25f;// 0.75 0.25
n++;
}
n++;
}
}
if (LM[offset]>95.0f || LM[offset]<5.0f)
contrast *= Cont0[unif]; //+ JD : luminance pyramid to adjust contrast by evaluation of LM[offset]
else if (LM[offset]>90.0f || LM[offset]<10.0f)
@@ -675,6 +680,10 @@ void ImProcFunctions::MLmicrocontrast(LabImage* lab) {
}
//! MicroContrast is a sharpening method developed by Manuel Llorens and documented here: http://www.rawness.es/sharpening/?lang=en
//! <BR>The purpose is maximize clarity of the image without creating halo's.
//! <BR>Addition from JD : pyramid + pondered contrast with matrix 5x5
//! \param ncie CieImage Image in the CIECAM02 colour space
void ImProcFunctions::MLmicrocontrastcam(CieImage* ncie) {
if (params->sharpenMicro.enabled==false)
return;
@@ -784,13 +793,14 @@ void ImProcFunctions::MLmicrocontrastcam(CieImage* ncie) {
n=0;
for(row=j-k; row<=j+k; row++)
for(row=j-k; row<=j+k; row++){
for(col=i-k,offset2=row*width+col; col<=i+k; col++,offset2++){
if (((v<LM[offset2])&&(signs[n]>0))||((v>LM[offset2])&&(signs[n]<0))) {
temp = v*0.75f+LM[offset2]*0.25f;// 0.75 0.25
n++;
}
n++;
}
}
if (LM[offset]>95.0f || LM[offset]<5.0f)
contrast *= Cont0[unif]; //+ JD : luminance pyramid to adjust contrast by evaluation of LM[offset]
else if (LM[offset]>90.0f || LM[offset]<10.0f)