为什么我的HSI色轮看起来怪异?

时间:2014-09-11 04:52:38

标签: c color-space color-wheel

我正在尝试在HSI色彩空间中绘制色轮。我得到的色轮有青色,黄色和洋红色很宽,看起来不对。我见过的所有其他色轮都有红色,绿色和蓝色,有最宽的带。

HSIColorWheel

这就是HSI色轮的外观吗?还是我的数学错了?我已经尝试了每个可以找到的HSI到RGB的片段,并在书中查看了这个等式。等式有很多变化,但是当我绘制圆圈时它们都会导致相同的结果。我唯一不同的是在最后夹紧通道。我的强度到处都是1.0,Hue是像素的角度(稍微旋转一点),饱和度是到中心的距离的大小。

这是我将HSI转换为RGB(Objective-C)的混乱代码:

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;

1 个答案:

答案 0 :(得分:0)

阅读完评论后,很明显夹住RGB值会导致CMY偏差。降低强度消除了偏差,但仍然存在奇怪的条带问题,色轮仍然看起来不像其他任何人的色轮。考虑到数学,这个结果是有道理的,但由于某些原因,没有人在任何书籍或有关HSI的在线信息中的任何地方提到这些问题。人们显示看起来像HSV / B色轮的HSI色轮,但我仍然不知道他们在转换为RGB时如何得到这个结果。

解决方案:我切换到HSV色彩空间,结果证明比HSI更符合我的要求。