Friday 6 April 2007

HSV颜色空间 RGB颜色空间

颜色空间按照基本结构可以分两大类,基色颜色空间和色、亮分离颜色空间。前者的典型是 RGB,还包括 CMY、CMYK、CIE XYZ 等。后者包括 YCC/YUV、Lab、以及一批“色相类颜色空间”。CIE XYZ 是定义一切颜色空间的基准,很奇妙的是,它即属于基色颜色空间,也属于色、亮分离颜色空间,是贯穿两者的枢纽。我们主要要讨论的是色、亮分离颜色空间中的子类型“色相类颜色空间”,它是把颜色分成一个表亮属性,和两个表色属性,其中有一个表色属性是色相。而色相以外的两个属性可以选用不同的变量来定义,而色相的概念不变,因此就构成一族共同使用色相属性,另加表亮属性和表色属性各一个组成的颜色空间。它们是颜色空间中的一个家族。暂且统称为 HSB 颜色空间


只有以 R、G、B 为变量的直角坐标空间才称为 RGB 颜色空间,在 RGB 空间中,三个独立属性变量性质对等,相互加减运算有意义,任何涉及色相、饱和度等等为基本颜色属性的,还有跟“色轮”一类概念直接关联的、用角度表示颜色的等等,都是 HSB 颜色空间,绝没有混淆的余地。在 HSB 颜色空间中,三个颜色属性性质不同,你不可能把色相和饱和度加在一起,就好比时间不能与面积相加,恐龙不能与蚂蚁杂交。

RGB颜色空间

计算机颜色显示器显示颜色的原理与彩色电视机一样,都是采用RGB相加混色的原理,通过发射出三种不同强度的电子束,使屏幕内侧覆盖的红、绿、蓝磷光材料发光而产生颜色的。这种颜色的表示方法称为RGB颜色空间表示。在多媒体计算机技术中,用得最多的是RGB颜色空间表示(图06-01-9)。


根据三基色原理,用基色光单位来表示光的量,则在RGB颜色空间,任意色光F都可以用RGB三色不同分量的相加混合而成:


   Fr [ R ] + g [ G ] + b [ B ]


RGB颜色空间还可以用一个三维的立方体来描述   










fig5-4.gif (11080 bytes)




我们可知自然界中任何一种色光都可由RGB三基色按不同的比例相加混合而成,当三基色分量都为0(最弱)时混合为黑色光;当三基色分量都为k(最强)时混合为白色光。任一颜色F是这个立方体坐标中的一点,调整三色系数rgb中的任一系数都会改变F的坐标值,也即改变了F的色值。RGB颜色空间采用物理三基色表示,因而物理意义很清楚,适合彩色显像管工作。然而这一体制并不适应人的视觉特点。因而,产生了其他不同的颜色空间表示法。




HSV颜色空间【HSIHueSaturation and Intensity)颜色空间】


HSV(hue,saturation,value)表示色相饱和度亮度,这个颜色空间的模型对应于圆柱坐标系中的一个圆锥形子集,圆锥的顶面对应于V=1. 它包含RGB模型中的R=1,G=1,B=1 三个面,所代表的颜色较亮。色彩H由绕V轴的旋转角给定。红色对应于 角度0° ,绿色对应于角度120°,蓝色对应于角度240°。在HSV颜色模型中,每一种颜色和它的补色相差180° 。 饱和度S取值从0到1,所以圆锥顶面的半径为1。HSV颜色模型所代表的颜色域是CIE色度图的一个子集,这个 模型中饱和度为百分之百的颜色,其纯度一般小于百分之百。在圆锥的顶点(即原点)处,V=0,H和S无定义, 代表黑色。圆锥的顶面中心处S=0,V=1,H无定义,代表白色。从该点到原点代表亮度渐暗的灰色,即具有不同 灰度的灰色。对于这些点,S=0,H的值无定义。可以说,HSV模型中的V轴对应于RGB颜色空间中的主对角线。 在圆锥顶面的圆周上的颜色,V=1,S=1,这种颜色是纯色。HSV模型对应于画家配色的方法。画家用改变色浓和 色深的方法从某种纯色获得不同色调的颜色,在一种纯色中加入白色以改变色浓,加入黑色以改变色深,同时加入不同比例的白色,黑色即可获得各种不同的色调。


HSI颜色空间可以用一个圆锥空间模型来描述









conea.GIF (19468 bytes)



coneb.GIF (10739 bytes)















conec.GIF (4108 bytes)



coned.GIF (23036 bytes)



conee.GIF (17268 bytes)




06-02-6   HSI颜色圆锥空间模型


用这种描述HIS颜色空间的圆锥模型相当复杂,但确能把色调、亮度和色饱和度的变化情形表现得很清楚。其中:


AHSI圆锥空间模型


B)线条示意图:圆锥上亮度、色度和饱和度的关系。


C)纵轴表示亮度:亮度值是沿着圆锥的轴线度量的,沿着圆锥轴线上的点表示完全不饱和的颜色,按照不同的灰度等级,最亮点为纯白色、最暗点为纯黑色。


D)圆锥纵切面:描述了同一色调的不同亮度和饱和度关系。


E)圆锥横切面:色调H为绕着圆锥截面度量的色环,圆周上的颜色为完全饱和的纯色,色饱和度为穿过中心的半径横轴。


通常把色调和饱和度通称为色度,用来表示颜色的类别与深浅程度。由于人的视觉对亮度的敏感程度远强于对颜色浓淡的敏感程度,为了便于颜色处理和识别,人的视觉系统经常采用HSI颜色空间,它比RGB颜色空间更符合人的视觉特性。在图像处理和计算机视觉中大量算法都可在HSI颜色空间中方便地使用,它们可以分开处理而且是相互独立的。因此,在HSI颜色空间可以大大简化图像分析和处理的工作量。


HSI颜色空间和RGB颜色空间只是同一物理量的不同表示法,因而它们之间存在着转换关系,如公式所示:


  


其中



RGB颜色空间转换为HSV空间颜色值:


void Rgb2Hsv(float R, float G, float B, float& H, float& S, float&V)
{
      // r,g,b values are from 0 to 1
     // h = [0,360], s = [0,1], v = [0,1]
     // if s == 0, then h = -1 (undefined)


     float min, max, delta,tmp;
     tmp = min(R, G);
     min = min( tmp, B );
     tmp = max( R, G);
     max = max(tmp, B );
     V = max; // v


     delta = max - min;


     if( max != 0 )
       S = delta / max; // s
     else
     {
        // r = g = b = 0 // s = 0, v is undefined
       S = 0;
       H = UNDEFINEDCOLOR;
       return;
     }
     if( R == max )
         H = ( G - B ) / delta; // between yellow & magenta
    else if( G == max )
         H = 2 + ( B - R ) / delta; // between cyan & yellow
    else
         H = 4 + ( R - G ) / delta; // between magenta & cyan


     H *= 60; // degrees
     if( H < 0 )
        H += 360;
}


HSV颜色空间转换为RGB空间颜色值:


void Hsv2Rgb(float H, float S, float V, float &R, float &G, float &B)
{
      int i;
     float f, p, q, t;


     if( S == 0 )
     {
     // achromatic (grey)
         R = G = B = V;
         return;
     }


     H /= 60; // sector 0 to 5
     i = floor( H );
     f = H - i; // factorial part of h
     p = V * ( 1 - S );
     q = V * ( 1 - S * f );
     t = V * ( 1 - S * ( 1 - f ) );


     switch( i )
     {
     case 0:
         R = V;
         G = t;
         B = p;
        break;
     case 1:
        R = q;
        G = V;
        B = p;
        break;
     case 2:
        R = p;
        G = V;
        B = t;
        break;
     case 3:
        R = p;
        G = q;
        B = V;
        break;
     case 4:
        R = t;
        G = p;
        B = V;
        break;
     default: // case 5:
        R = V;
        G = p;
        B = q;
        break;
     }
}







No comments:

Post a Comment