Small issue found in Micocontrast on behalf of Reine Edvardson issue 1957
This commit is contained in:
@@ -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)
|
||||
|
Reference in New Issue
Block a user