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 "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)
|
||||||
|
Reference in New Issue
Block a user