[转] 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;
}
}
图像处理中经常要进行颜色空间的转换,因为摄像头采集到的图像格式通常是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;
}
}
相关文章推荐
- RGB转换为HSV的VC++代码
- RGB颜色空间到HSV和YUV的转换关系(含VC代码)
- RGB空间与HSV空间的相互转换(C++实现,修正网上大多数的代码错误)
- VC编程实现色彩空间RGB与HSB(HSV)相互转换
- VC编程实现色彩空间RGB与HSB(HSV)相互转换
- [转]RGB转换为灰度图的vc代码
- RGB空间与HSV空间的相互转换(C++实现,修正网上大多数的代码错误)
- HSV颜色到RGB的转换C++代码 直接可用
- RGB空间与HSV空间的相互转换(C++实现,修正网上大多数的代码错误)
- » RGB与HSV(HSB)的转换公式 mybeky’s blog
- RGB和HSV颜色转换
- RGB颜色空间转换为HSV空间颜色值
- RGB、HSB\HSV、HSL三种颜色空间的原理理解与转换
- HSV颜色空间理解及RGB图像转换到HSV空间的方法(数据集扩充)
- Delphi图像处理 -- RGB与HSV转换
- RGB通过转换成HSV增加明度和饱和度
- RGB和HSV区别与互相转换
- 颜色空间RGB与HSV(HSL)的转换
- 色度空间转换CSC(RGB转换YCBCR)的可综合verilog代码编写
- 基于OpenCV的RGB和HSV色彩空间相互转换C++程序