[转] RGB到HSV转换的vc代码

【转】

 

 

图像处理中经常要进行颜色空间的转换,因为摄像头采集到的图像格式通常是RGB32或RGB24的,而HSV颜色空间的图像更易于分辨颜色分量,能减小光照带来的影响。

HSV颜色空间
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模型对应于画家配色的方法。画家用改变色浓和色深的方法从某种纯色获得不同色调的颜色,在一种纯色中加入白色以改变色浓,加入黑色以改变色深,同时加入不同比例的白色,黑色即可获得各种不同的色调。

下面是RGB到HSV 转换的vc函数代码:

void RGBtoHSV( BYTE r, BYTE g, BYTE b, float &h, float &s, float &v )
{
        BYTE min, max;
        float delta;

        min = MIN( r, g, b );
        max = MAX( r, g, 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 = -1;
                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;
        }
}
 
在开发有关bitmap方面的程序时,经常需要将位图的颜色在RGB和HSV色彩空间之间转换,该颜色转换由C++实现:

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值