首页 > 科学工作 > 色彩空间:HSL和RGB的相互转换

色彩空间:HSL和RGB的相互转换

2007年7月17日 发表评论 阅读评论

做一个计算程序的可视化程序要用到的,需要用色彩表示数值的大小。

试过了很多RGB的组合,还是没有满意的效果,其实用Hue就可以了。不过最后给后处理程序的还是RBG的参数,就需要HSL和RGB之间的相互转换关系了。RGB如左图所示,XYZ为红绿蓝三色空间;右图则是HSL空间,HSL表示色调H、饱和度S和亮度L。

400px-RGBCube_b.svg   300px-Color_cones

一般在有限元中,采用的表示应力、应变的方法就是采用在一定S/L参数下的Hue,根据数值的大小,在空间中一般只占有从0~240度,即从红到蓝的范围。如下图所示:

250px-HueScale.svg
Max ---------------- Min

它们之间的转换公式可以参照 Wiki 上的介绍。“染色”工作已经完成......

PS: RGB=(red, green, blue); HSL=(hue, saturation, lightness)

附录子程序,从HSL到RGB转换。输入HSL参数得到的C[i]就是需要的RGB参数。
其中H~[0,240];S和L~[0,1]。

/*HSL to RGB space transformation. */
double C[3];
void HSL2RGB(double H, double S, double L)
{
    double Q;
    double P;
    double T[3];
    H=H*1.0*1/360;
    T[0]=H+1.0*1/3;
    T[1]=H;
    T[2]=H-1.0*1/3;

    int j;
    for(j=0;j<3;j++)
    {
        if(T[j]<0) T[j]=T[j]+1.0;
        if(T[j]>1) T[j]=T[j]-1.0;
    }
   
    if(L<0.5) Q=L*(1.0+S);
    if(L>=0.5) Q=L+S-(L*S);
    P=2.0*L-Q;
   
    int k;
    for(k=0;k<3;k++)
    {
        if(T[k]<1.0*1/6) C[k]=P+((Q-P)*6.0*T[k]);
        if(T[k]<0.5 && T[k]>=1.0*1/6) C[k]=Q;
        if(T[k]>=0.5 && T[k]<1.0*2/3)  C[k]=P+((Q-P)*(1.0*2/3-T[k])*6.0);
        if(T[k]>=1.0*2/3)  C[k]=P;
    }
}

分类: 科学工作 标签: