rgb和hsv的互相转换
2011-08-29 12:24
344 查看
/******************************************************************************
* 下面两个函数实现rgb和hsv的互相转换
* r,g,b 的值在 0 到 1 之间
* h = [0,360], s = [0,1], v = [0,1]
* if s == 0, then h = -1 (undefined)
*****************************************************************************/
void RGBtoHSV( float r, float g, float b, float *h, float *s, float *v )
{
float min, max, delta;
min = MIN( r, g, b );
max = MAX( r, g, b );
*v = max;
delta = max - min;
if( max != 0 )
*s = delta / max;
else
{
// r = g = b = 0
// s = 0, v 未定义
*s = 0;
*h = -1;
return;
}
if( r == max )
*h = ( g - b ) / delta; // 在 yellow & magenta 之间
else if( g == max )
*h = 2 + ( b - r ) / delta; // 在 cyan & yellow 之间
else
*h = 4 + ( r - g ) / delta; // 在 magenta & cyan 之间
*h *= 60; // degrees
if( *h 0 )
*h += 360;
}
void HSVtoRGB( float *r, float *g, float *b, float h, float s, float v )
{
int i;
float f, p, q, t;
if( s == 0 )
{
// 灰度
*r = *g = *b = v;
return;
}
h /= 60; // 扇区 0 到 5
i = floor( h );
f = h - i;
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:
*r = v;
*g = p;
*b = q;
break;
}
}
* 下面两个函数实现rgb和hsv的互相转换
* r,g,b 的值在 0 到 1 之间
* h = [0,360], s = [0,1], v = [0,1]
* if s == 0, then h = -1 (undefined)
*****************************************************************************/
void RGBtoHSV( float r, float g, float b, float *h, float *s, float *v )
{
float min, max, delta;
min = MIN( r, g, b );
max = MAX( r, g, b );
*v = max;
delta = max - min;
if( max != 0 )
*s = delta / max;
else
{
// r = g = b = 0
// s = 0, v 未定义
*s = 0;
*h = -1;
return;
}
if( r == max )
*h = ( g - b ) / delta; // 在 yellow & magenta 之间
else if( g == max )
*h = 2 + ( b - r ) / delta; // 在 cyan & yellow 之间
else
*h = 4 + ( r - g ) / delta; // 在 magenta & cyan 之间
*h *= 60; // degrees
if( *h 0 )
*h += 360;
}
void HSVtoRGB( float *r, float *g, float *b, float h, float s, float v )
{
int i;
float f, p, q, t;
if( s == 0 )
{
// 灰度
*r = *g = *b = v;
return;
}
h /= 60; // 扇区 0 到 5
i = floor( h );
f = h - i;
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:
*r = v;
*g = p;
*b = q;
break;
}
}
/****************************************************************************** * 下面两个函数实现rgb和hsv的互相转换 * r,g,b 的值在 0 到 1 之间 * h = [0,360], s = [0,1], v = [0,1] * if s == 0, then h = -1 (undefined) *****************************************************************************/ void RGBtoHSV( float r, float g, float b, float *h, float *s, float *v ) { float min, max, delta; min = MIN( r, g, b ); max = MAX( r, g, b ); *v = max; delta = max - min; if( max != 0 ) *s = delta / max; else { // r = g = b = 0 // s = 0, v 未定义 *s = 0; *h = -1; return; } if( r == max ) *h = ( g - b ) / delta; // 在 yellow & magenta 之间 else if( g == max ) *h = 2 + ( b - r ) / delta; // 在 cyan & yellow 之间 else *h = 4 + ( r - g ) / delta; // 在 magenta & cyan 之间 *h *= 60; // degrees if( *h 0 ) *h += 360; } void HSVtoRGB( float *r, float *g, float *b, float h, float s, float v ) { int i; float f, p, q, t; if( s == 0 ) { // 灰度 *r = *g = *b = v; return; } h /= 60; // 扇区 0 到 5 i = floor( h ); f = h - i; 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: *r = v; *g = p; *b = q; break; } }
相关文章推荐
- (zt)RGB、HSV色彩空间模式的互相转换
- 将HSV空间和RGB空间互相转换知识
- RGB和HSV区别与互相转换
- UIColor:RGB和HSV互相转换
- HSV与RGB互相转换
- 【C#/算法】RGB、HSV、HSL颜色模型的互相转换
- RGB与HSV颜色互相转换
- UIColor:RGB和HSV互相转换
- RGB和HSV颜色转换
- RGB颜色空间转换为HSV空间颜色值
- RGB空间与HSV空间的相互转换(C++实现,修正网上大多数的代码错误)
- RGB与HSV模型间的转换程序 RGB与HLS模型间的转换程序
- Delphi图像处理 -- RGB与HSV转换
- 颜色空间RGB与HSV(HSL)的转换
- OpenCV中RGB和HSV转换的问题
- YUV422与RGB互相转换
- RGB和HSV颜色转换
- 从 RGB 到 HSL 或 HSV 的转换
- 【OpenCV】颜色空间RGB与HSV(HSL)的转换
- 颜色空间RGB与HSV(HSL)的转换