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 "improcfun.h"
#include "gauss.h" #include "gauss.h"
#include "bilateral2.h" #include "bilateral2.h"
#include "rt_math.h" #include "rt_math.h"
#include "sleef.c" #include "sleef.c"
#ifdef __SSE2__ #ifdef __SSE2__
#include "sleefsseavx.c" #include "sleefsseavx.c"
#endif #endif
#ifdef _OPENMP #ifdef _OPENMP
@@ -47,54 +47,54 @@ void ImProcFunctions::dcdamping (float** aI, float** aO, float damping, int W, i
#endif #endif
const float dampingFac=-2.0/(damping*damping); const float dampingFac=-2.0/(damping*damping);
#ifdef __SSE2__ #ifdef __SSE2__
__m128 Iv,Ov,Uv,zerov,onev,fourv,fivev,dampingFacv,Tv; __m128 Iv,Ov,Uv,zerov,onev,fourv,fivev,dampingFacv,Tv;
zerov = _mm_setzero_ps( ); zerov = _mm_setzero_ps( );
onev = _mm_set1_ps( 1.0f ); onev = _mm_set1_ps( 1.0f );
fourv = _mm_set1_ps( 4.0f ); fourv = _mm_set1_ps( 4.0f );
fivev = _mm_set1_ps( 5.0f ); fivev = _mm_set1_ps( 5.0f );
dampingFacv = _mm_set1_ps( dampingFac ); dampingFacv = _mm_set1_ps( dampingFac );
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp for #pragma omp for
#endif #endif
for (int i=0; i<H; i++) for (int i=0; i<H; i++)
for (int j=0; j<W-3; j+=4) { for (int j=0; j<W-3; j+=4) {
Iv = _mm_loadu_ps( &aI[i][j] ); Iv = _mm_loadu_ps( &aI[i][j] );
Ov = _mm_loadu_ps( &aO[i][j] ); Ov = _mm_loadu_ps( &aO[i][j] );
Uv = (Ov * xlogf(Iv/Ov) - Iv + Ov) * dampingFacv; Uv = (Ov * xlogf(Iv/Ov) - Iv + Ov) * dampingFacv;
Uv = _mm_min_ps(Uv,onev); Uv = _mm_min_ps(Uv,onev);
Tv = Uv*Uv; Tv = Uv*Uv;
Tv = Tv*Tv; Tv = Tv*Tv;
Uv = Tv*(fivev-Uv*fourv); Uv = Tv*(fivev-Uv*fourv);
Uv = (Ov - Iv) / Iv * Uv + onev; Uv = (Ov - Iv) / Iv * Uv + onev;
Uv = vself(vmaskf_ge(zerov, Iv), zerov, Uv); Uv = vself(vmaskf_ge(zerov, Iv), zerov, Uv);
Uv = vself(vmaskf_ge(zerov, Ov), zerov, Uv); Uv = vself(vmaskf_ge(zerov, Ov), zerov, Uv);
_mm_storeu_ps( &aI[i][j], Uv ); _mm_storeu_ps( &aI[i][j], Uv );
} }
// border pixels are done without SSE2 // border pixels are done without SSE2
float I,O,U; float I,O,U;
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp for #pragma omp for
#endif #endif
for (int i=0; i<H; i++) 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]; I = aI[i][j];
O = aO[i][j]; O = aO[i][j];
if (O<=0.0 || I<=0.0) { if (O<=0.0 || I<=0.0) {
aI[i][j] = 0.0; aI[i][j] = 0.0;
continue; continue;
} }
U = (O * xlogf(I/O) - I + O) * dampingFac; U = (O * xlogf(I/O) - I + O) * dampingFac;
U = min(U,1.0f); U = min(U,1.0f);
U = U*U*U*U*(5.0-U*4.0); U = U*U*U*U*(5.0-U*4.0);
aI[i][j] = (O - I) / I * U + 1.0; aI[i][j] = (O - I) / I * U + 1.0;
} }
#else // without __SSE2__ #else // without __SSE2__
float I,O,U; float I,O,U;
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp for #pragma omp for
#endif #endif
@@ -105,12 +105,12 @@ void ImProcFunctions::dcdamping (float** aI, float** aO, float damping, int W, i
if (O<=0.0 || I<=0.0) { if (O<=0.0 || I<=0.0) {
aI[i][j] = 0.0; aI[i][j] = 0.0;
continue; continue;
} }
U = (O * xlogf(I/O) - I + O) * dampingFac; U = (O * xlogf(I/O) - I + O) * dampingFac;
U = min(U,1.0f); U = min(U,1.0f);
U = U*U*U*U*(5.0-U*4.0); U = U*U*U*U*(5.0-U*4.0);
aI[i][j] = (O - I) / I * U + 1.0; aI[i][j] = (O - I) / I * U + 1.0;
} }
#endif #endif
} }
@@ -127,7 +127,7 @@ void ImProcFunctions::deconvsharpening (LabImage* lab, float** b2) {
tmpI[i][j] = (float)lab->L[i][j]; tmpI[i][j] = (float)lab->L[i][j];
} }
float** tmp = (float**)b2; float** tmp = (float**)b2;
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel #pragma omp parallel
@@ -180,7 +180,7 @@ void ImProcFunctions::deconvsharpening (LabImage* lab, float** b2) {
for (int i=0; i<H; i++) for (int i=0; i<H; i++)
delete [] tmpI[i]; delete [] tmpI[i];
delete [] tmpI; delete [] tmpI;
} }
void ImProcFunctions::sharpening (LabImage* lab, float** b2) { 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. // has waived all copyright and related or neighboring rights to this work.
// This code is licensed under CC0 v1.0, see license information at // This code is licensed under CC0 v1.0, see license information at
// http://creativecommons.org/publicdomain/zero/1.0/ // 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) { void ImProcFunctions::MLmicrocontrast(LabImage* lab) {
if (params->sharpenMicro.enabled==false) if (params->sharpenMicro.enabled==false)
return; return;
@@ -591,13 +595,14 @@ void ImProcFunctions::MLmicrocontrast(LabImage* lab) {
n=0; 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++){ 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))) { 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 temp = v*0.75f+LM[offset2]*0.25f;// 0.75 0.25
n++;
} }
n++;
} }
}
if (LM[offset]>95.0f || LM[offset]<5.0f) if (LM[offset]>95.0f || LM[offset]<5.0f)
contrast *= Cont0[unif]; //+ JD : luminance pyramid to adjust contrast by evaluation of LM[offset] contrast *= Cont0[unif]; //+ JD : luminance pyramid to adjust contrast by evaluation of LM[offset]
else if (LM[offset]>90.0f || LM[offset]<10.0f) 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) { void ImProcFunctions::MLmicrocontrastcam(CieImage* ncie) {
if (params->sharpenMicro.enabled==false) if (params->sharpenMicro.enabled==false)
return; return;
@@ -784,13 +793,14 @@ void ImProcFunctions::MLmicrocontrastcam(CieImage* ncie) {
n=0; 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++){ 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))) { 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 temp = v*0.75f+LM[offset2]*0.25f;// 0.75 0.25
n++;
} }
n++;
} }
}
if (LM[offset]>95.0f || LM[offset]<5.0f) if (LM[offset]>95.0f || LM[offset]<5.0f)
contrast *= Cont0[unif]; //+ JD : luminance pyramid to adjust contrast by evaluation of LM[offset] contrast *= Cont0[unif]; //+ JD : luminance pyramid to adjust contrast by evaluation of LM[offset]
else if (LM[offset]>90.0f || LM[offset]<10.0f) else if (LM[offset]>90.0f || LM[offset]<10.0f)