TSL 色空間 (Tint Saturation Luminance) を試しています。このwikiページを読む
2 つの単純な rgb2tsl および tsl2rgb ルーチンをコーディングしようとしました。
/// input: r,g,b in [0..1]
/// output: t,s,l in [0..1]
void RGB2TSL( float r, float g, float b, float &t, float &s, float &l )
{
float rn, gn;
if ( r+g+b == 0.0f )
{
t = s = l = 0.0f;
return ;
}
rn = r/(r+g+b);
gn = g/(r+g+b);
float r1, g1;
r1 = rn-1.0f/3.0f;
g1 = gn-1.0f/3.0f;
l = 0.299*r+0.587*g+0.114*b;
if ( g1 > 0 )
t = (1.0f/(2.0f*PI))*atan2f(r1, g1) + 1.0f/4.0f;
else if ( g1 < 0 )
t = (1.0f/(2.0f*PI))*atan2f(r1, g1) + 3.0f/4.0f;
else
t = 0;
s = sqrtf(9.0f/5.0f*(r1*r1+g1*g1));
}
/// input: t,s,l in [0..1]
/// output: r,g,b in [0..1]
void TSL2RGB( float t, float s, float l, float &r, float &g, float &b )
{
float r1, g1, k, x;
x = -sinf(2*PI*t);
if ( x != 0 )
x = cosf(2*PI*t)/x;
if ( t > 0.5f )
g1 = -s*sqrtf(5.0f/(9.0*(x*x+1.0f)));
else if ( t < 0.5f )
g1 = s*sqrtf(5.0f/(9.0*(x*x+1.0f)));
else
g1 = 0;
if ( t == 0 )
r1 = (sqrtf(5.0f)/3.0f)*s;
else
r1 = x*g1+1.0f/3.0f;
k = 1.0f/(0.185*r1+0.473*g1+0.114);
r = k*r1;
g = k*g1;
b = k*(1-r1-g1);
}
コードの品質を考慮しないでください。見つけられないエラーがあるという事実に注目してください。rgb トリプルを tsl トリプルに変換し、何も変更せずに r、g、b に戻す場合、元の画像は取得できませんが、実際にはまったく異なり、可能な限り間違っています!