I'm trying to adjust HSV color space same as PhotoShop.
What I've tried :
RGB to HSV, it's seem that is a correct step. But I found HSV adjusting was a lie.Whatever I try to adjust hue\saturation\Bright, the result isn't equal with PS.
Finally, I changed my mind to make a transform to HSL, I got a same result.But the result just is correct under S less than V(RGB to HSV).
With S more than V, there is another situation in PS, The saturation will be change with a changing of light (RGB To HSL), it's Nonlinear relation that I can't make simulation.
Steps:
RGB to HSL;
RGB to HSV;
Code logic...
if(HSV.S less than HSV.V); Adjust HSL; //H range = -180 to180, Sat = -1 to 1, Light = -1 to 1;
The function
if(S or L less than 0) _S=S+S*Op; _L=L+L*Op; else _S=S+(1-S)*Op _L=L+(1-L)*Op HSL TO RGB
If (HSV.S more than HSV.V)
Nonlinear relation //If add L value,the S will be reduce.
HLSL Code:
//RGB to HSL
Color.xyz=RGB_TO_HSL(Color.xyz);
//Adjustment of increment
//x ~hue [-180,180]
//y ~saturation [-1,1]or[-100%,100%]
//z ~bright [-1,1]or[-100%,100%]
float3 Op = HSVOperate[basehsv].xyz;
//H
float Flag = Color.x;
Color.x += Op.x;
if (Color.x > 360)
Color.x -= 360;
else if(Color.x<0)
Color.x += 360;
//S
float Gap = Max - Min;
float S, V;
if (Max == 0)
S = 0;
else
S = Gap / Max;
V = Max;
if (S <=V){
if (Op.z<0)
Color.z = Color.z + Color.z*Op.z;
else
Color.z = Color.z + (1 - Color.z)*Op.z;
if (Op.y < 0)
Color.y = Color.y + Color.y*Op.y;
else
Color.y = Color.y + (1 - Color.y)*Op.y;
}
else if(S >V){
// process Blue as same as S<V; I don't know why result was
// correct.
if (Flag <= 270 && Flag > 210)
{
if (Op.z<0)
Color.z = Color.z + Color.z*Op.z;
else
Color.z = Color.z + (1 - Color.z)*Op.z;
if (Op.y < 0)
Color.y = Color.y + Color.y*Op.y;
else
Color.y = Color.y + (1 - Color.y)*Op.y;
}
else
{
// Add directly for Saturation
Color.z = Color.z +Op.z;
if (Color.y > 1)
Color.y = 1;
if(Color.y<0)
Color.y = 0;
//But bright will has a influence to Saturation
// ?
// ? I can't simulate the relation using matlab,
// Because different S and V,different relation.
}
}
//L
Color.xyz=HSL_TO_RGB(Color.xyz);