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



[本日志由 cnfgg 于 2009-07-16 10:54 AM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: vc RGB HSV 代码
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.