2013-05-24 2 views
2

TSL 색 공간 (색조 채도 루미넌스)을 사용하려고합니다.RGB를 TSL로 변환하는 루틴에서 버그가 발생했습니다.

/// 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); 
} 

단지이 사실에 초점을, 코드 품질을 고려하지 마십시오 : 내가 코드에 두 가지 간단한 rgb2tsl 및 tsl2rgb 루틴을 시도,이 위키 페이지

TSL color space

읽기 오류 나는 찾을 수 없습니다 : 트리플을 TSL 트리플로 변환하고 아무 것도 변경하지 않고 다시 r, g, b로 변환 할 때 원본 이미지를 얻지 못하지만 실제로는 가능하지 않을 수 있습니다. 방법!

답변

0

RGB2TSL이 나에게 잘 어울리는 데, 그러나 내가 생각하는 클리핑 문제가 있습니다. 나는 어떤 값들이 클램핑 될 필요가 있다고 생각하지만, 정확히 어떤 것이지 확신 할 수 없다.