Optimization for Vibrance - Lab adjustements - CIE Colour Appearance see issue1789

This commit is contained in:
jdc
2013-03-19 13:17:22 +01:00
parent d881987484
commit d7ed4be9e1
2 changed files with 18 additions and 12 deletions

View File

@@ -1470,7 +1470,7 @@ if(params->colorappearance.enabled) {
float HH, Lprov1, Chprov1;
Lprov1=lab->L[i][j]/327.68f;
Chprov1=sqrt(SQR(lab->a[i][j]/327.68f) + SQR(lab->b[i][j]/327.68f));
HH=atan2(lab->b[i][j],lab->a[i][j]);
HH=xatan2f(lab->b[i][j],lab->a[i][j]);
#ifdef _DEBUG
bool neg=false;
@@ -1483,8 +1483,10 @@ if(params->colorappearance.enabled) {
#endif
lab->L[i][j]=Lprov1*327.68f;
lab->a[i][j]=327.68f*Chprov1*cos(HH);
lab->b[i][j]=327.68f*Chprov1*sin(HH);
float2 sincosval = xsincosf(HH);
lab->a[i][j]=327.68f*Chprov1*sincosval.y;
lab->b[i][j]=327.68f*Chprov1*sincosval.x;
}
}
@@ -1640,7 +1642,7 @@ if((params->colorappearance.tonecie && (params->edgePreservingDecompositionUI.en
float HH, Lprov1, Chprov1;
Lprov1=lab->L[i][j]/327.68f;
Chprov1=sqrt(SQR(lab->a[i][j]/327.68f) + SQR(lab->b[i][j]/327.68f));
HH=atan2(lab->b[i][j],lab->a[i][j]);
HH=xatan2f(lab->b[i][j],lab->a[i][j]);
#ifdef _DEBUG
bool neg=false;
@@ -1651,10 +1653,11 @@ if((params->colorappearance.tonecie && (params->edgePreservingDecompositionUI.en
//gamut control : Lab values are in gamut
Color::gamutLchonly(HH,Lprov1,Chprov1, R, G, B, wipa, highlight, 0.15f, 0.96f);
#endif
float2 sincosval = xsincosf(HH);
lab->L[i][j]=Lprov1*327.68f;
lab->a[i][j]=327.68f*Chprov1*cos(HH);
lab->b[i][j]=327.68f*Chprov1*sin(HH);
lab->a[i][j]=327.68f*Chprov1*sincosval.y;
lab->b[i][j]=327.68f*Chprov1*sincosval.x;
}
}
@@ -2390,7 +2393,7 @@ void ImProcFunctions::chromiLuminanceCurve (int pW, LabImage* lold, LabImage* ln
for (int j=0; j<W; j++) {
float LL=lold->L[i][j]/327.68f;
float CC=sqrt(SQR(lold->a[i][j]/327.68f) + SQR(lold->b[i][j]/327.68f));
float HH=atan2(lold->b[i][j],lold->a[i][j]);
float HH=xatan2f(lold->b[i][j],lold->a[i][j]);
float Chprov=CC;
float Chprov1=CC;
float memChprov=Chprov;
@@ -2613,8 +2616,10 @@ void ImProcFunctions::chromiLuminanceCurve (int pW, LabImage* lold, LabImage* ln
else if(fabs(correctionHue) < 0.1f) HH+=0.35f*correctlum;
else if(fabs(correctionHue) < 0.015f) HH+=correctlum; // correct only if correct Munsell chroma very little.
*/
lnew->a[i][j]=327.68f*Chprov*cos(HH+correctionHue);// apply Munsell
lnew->b[i][j]=327.68f*Chprov*sin(HH+correctionHue);
float2 sincosval = xsincosf(HH+correctionHue);
lnew->a[i][j]=327.68f*Chprov*sincosval.y;// apply Munsell
lnew->b[i][j]=327.68f*Chprov*sincosval.x;
}
}
else {

View File

@@ -207,7 +207,7 @@ void ImProcFunctions::vibrance (LabImage* lab) {
//int pos = i*width+j;
float LL=lab->L[i][j]/327.68f;
float CC=sqrt(SQR(lab->a[i][j]/327.68f)+ SQR(lab->b[i][j]/327.68f));
float HH=atan2(lab->b[i][j],lab->a[i][j]);
float HH=xatan2f(lab->b[i][j],lab->a[i][j]);
//double pyramid: LL and HH
//I try to take into account: Munsell response (human vision) and Gamut..(less response for red): preferably using Prophoto or WideGamut
//blue: -1.80 -3.14 green = 2.1 3.14 green-yellow=1.4 2.1 red:0 1.4 blue-purple:-0.7 -1.4 purple: 0 -0.7
@@ -411,8 +411,9 @@ void ImProcFunctions::vibrance (LabImage* lab) {
Color::AllMunsellLch(/*lumaMuns*/false, Lprov,Lprov,HH,Chprov,memChprov,correctionHue,correctlum);
#endif
}
aprovn=Chprov*cos(HH+correctionHue);
bprovn=Chprov*sin(HH+correctionHue);
float2 sincosval = xsincosf(HH+correctionHue);
aprovn=Chprov*sincosval.y;
bprovn=Chprov*sincosval.x;
float fyy = (0.00862069f *Lprov )+ 0.137932f;
float fxx = (0.002f * aprovn) + fyy;