2014-09-11 7 views
2

HSI 색상 공간에서 컬러 휠을 그려야합니다. 내가 얻을 수있는 색상환에는 시안 색, 노란색 및 마젠타 색이 매우 넓어서 잘못 보입니다. 내가 보았던 다른 모든 컬러 휠에는 가장 넓은 밴드를 가진 빨강, 초록, 파랑이 있습니다.왜 내 HSI 컬러 휠이 이상하게 보입니까?

HSIColorWheel

이는 HSI 컬러 휠의 모양이 얼마나 있습니까? 또는 나의 수학은 틀린가? 나는 RGB에서 HSI의 모든 스 니펫을 찾아서 찾을 수 있었고, 책에서 방정식을 보았다. 방정식에는 많은 변형이 있지만 내 서클을 그릴 때 모두 동일한 결과로 이어집니다. 내가 다르게하고있는 유일한 것은 마지막에 채널을 고정하는 것입니다. 내 강도는 모든 곳에서 1.0이며, 색조는 픽셀의 각도 (조금 더 회전 됨)이며 채도는 중심까지의 거리의 크기입니다.

float r; 
float g; 
float b; 

S = S > 1.0f ? 1.0f : S; 
I = I > 1.0f ? 1.0f : I; 
H = H > 1.0f ? H - 1.0 : H; 
H = H * M_PI * 2.0; 
H = fmod(H, M_PI * 2.0); 

if(S==0.0f){ 
    r = I; 
    g = I; 
    b = I; 
} else{ 
    if((H>=0.0) && (H<2.0*M_PI/3.0)){ 

     b = (1.0f-S)/3.0f; 
     r = (1.0f + S*cosf(H)/cosf(M_PI/3.0-H))/3.0f;   
     g = 1.0f-r-b; 

    } else if((H>=2.0*M_PI/3.0) && (H<4.0*M_PI/3.0)){ 
     H = H - 2.0f*M_PI/3.0f; 
     r = (1.0f-S)/3.0f; 
     g = (1.0f+S*cosf(H)/cosf(M_PI/3.0 - H))/3.0f; 

     b = 1.0f-r-g; 
    } else if ((H>=4.0*M_PI/3.0) && (H<2.0*M_PI)){ 
     H= H-4.0f*M_PI/3.0f; 
     g = (1.0f-S)/3.0f; 
     b = (1.0f+S*cosf(H)/cosf(M_PI/3.0-H))/3.0f; 

     r = 1.0f-b-g; 
    } 
} 
if(r<0.0f) 
    r=0.0f; 
if(g<0.0f) 
    g=0.0f; 
if(b<0.0f) 
    b=0.0f; 
float R = 3.0f*I*r; 
float G = 3.0f*I*g; 
float B = 3.0f*I*b; 

if(R>1.0f) 
    R=1.0f; 
if(G>1.0f) 
    G=1.0f; 
if(B>1.0f) 
    B=1.0f; 
+2

강도를 줄였습니까? 나는 최대 강도로 원색이 최대가되고 1로 클리핑되는 것을 추측하고 있습니다. 따라서 혼합 색상이 휠을 지배합니다. – user3386109

+1

@ user3386109는 I = 1 일 때 기본 색상이 씻겨 나가는 것에 대해 옳습니다. reddest 인 RGB 색상 (1,0,0) 만 I = 1/3에 매핑됩니다. 대신 HSV 또는 HSL을 사용할 수 있습니까? 이러한 색상 공간은보다 직관적 인 사용자 인터페이스를 만들 수 있습니다. – godel9

+1

그건 그렇고, 나는 당신의 코드를 보면서 그것을 빨리 보지 못했다. 나는 가장 중요한 문제가 I = 1.0에 대한 모든 H 및 S 값이 유효한 (R, G, B) 세 쌍둥이로 매핑되지 않는다고 생각합니다. 나는 그것이 당신의 기능이 끝날 때 클리핑 코드가 나오는 이유라고 생각한다. – godel9

답변

0

코멘트를 읽은 후에는 RGB 값을 클램핑하는 것은 CMY 바이어스를 일으키는 명확하게되었다 :

여기에 RGB (목표 - C)에 HSI 변환 내 지저분한 코드입니다. 강도를 줄이면 편향이 제거되었지만 여전히 이상한 밴딩 문제가 있었으며 컬러 휠은 다른 사람의 컬러 휠처럼 보이지 않았습니다. 이 결과는 수학적으로 볼 때 의미가 있습니다. 그러나 어떤 이유로 든 아무도 HSI에 관한 책이나 온라인 정보에서 이러한 문제를 언급하지 않습니다. 사람들은 HSV/B 컬러 휠처럼 보이는 HSI 컬러 휠을 보여 주지만 RGB로 변환 할 때 그 결과를 어떻게 얻었는지 여전히 알 수 없습니다.

해결책 : HSV 색상 공간으로 전환하여 HSI보다 더 나은 요구 사항을 충족 시켰습니다.