您的位置:首页 > 编程语言

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

2011-08-08 17:30 344 查看
【转】

图像处理中经常要进行颜色空间的转换,因为摄像头采集到的图像格式通常是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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: