2012-03-15 20:12:25|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, 图形/图像|来源:唯设编程网
VC编程实现色彩空间RGB与XYZ相互转换、VC编程实现色彩空间XYZ与LAB之间相互转换两篇文章向读者介绍了RGB与LAB通过XYZ色彩空间实现相互转换的算法公式和源代码。在VC编程实现色彩空间RGB与XYZ相互转换已经提到,在PhotoShop中经常使用有RGB(红色、绿色、蓝色)、CMYK(青色、洋红、黄 色、黑色)、HSB(色相、饱和度、亮度)和Lab4中色彩空间。承接前文,本文将介绍RGB与HSB(函数中取名HSV)色彩空间之间的转换方法,并列出具体的算法公式和VC源代码。
在 HSV 中 (h, s, v) 值定义的一个颜色,带有 h 在指示色相角度的值域 [0, 360),和分别表示饱和度和明度的 s 和 v 变化于 0 到 1 之间,在 RGB 空间中对应的 (r, g, b) 三原色可以计算为:





对于每个颜色向量 (r, g, b),

参考来源:HSL和HSV色彩空间
色彩空间RGB转HSV是HSV转RGB转换公式的逆变换,公式比较简单,本文不再给出。
示例:
// RGB模式转为HSV模式
// RGB:R(0-255),G(0-255),B(0-255)
// HSV:H-色相(0-360),S-饱和度(0.0-1.0),V-明度(0.0-1.0)
void CColorUtility::_cie_rgb2hsv(const int RGB[3] ,double (&HSV)[3])
{
double m_max = max(RGB[0],max(RGB[1],RGB[2]));
double m_min = min(RGB[0],min(RGB[1],RGB[2]));
double m_delta = m_max-m_min;
//明度
HSV[2]=m_max/255.0;
//判断RGB三个分量是否相等,包含了3个分量均为0的条件
if (m_delta==0)
{
HSV[0] = 0; //色度
HSV[1] = 0; //饱和度
}
else{
HSV[1] = m_delta / m_max; //饱和度
//计算H(色相)
if (RGB[0]==m_max) //R最大
HSV[0] = (RGB[1]-RGB[2])/m_delta;
else if (RGB[1]==m_max) //G最大
HSV[0]=2+(RGB[2]-RGB[0])/m_delta;
else //B最大
HSV[0] =4+(RGB[0]-RGB[1])/m_delta;
//转换
HSV[0] =HSV[0] * 60;
if(HSV[0] < 0)
HSV[0] = HSV[0] + 360;
}
}
// HSV模式转为RGB模式
// HSV:H-色相(0-360),S-饱和度(0.0-1.0),V-明度(0.0-1.0)
// RGB:R(0-255),G(0-255),B(0-255)
void CColorUtility::_cie_hsv2rgb(const double hsv[3],int (&rgb)[3])
{
//RGB的0.0-1.0表示
double r=0.0;
double g=0.0;
double b=0.0;
//
int h_i = (int)abs(hsv[0]/60.0);
double f =hsv[0]/60.0 - h_i;
double p = hsv[2] * ( 1 - hsv[1] );
double q = hsv[2] * ( 1 - f * hsv[1] );
double t = hsv[2] * ( 1 - (1 - f ) * hsv[1] );
switch(h_i) {
case 0:
r = hsv[2];g = t;b = p;
break;
case 1:
r = q;g = hsv[2];b = p;
break;
case 2:
r = p;g = hsv[2];b = t;
break;
case 3:
r = p;g = q;b = hsv[2];
break;
case 4:
r = t;g = p;b = hsv[2];
break;
case 5:
r = hsv[2];g = p;b = q;
break;
}
//转换成0-255
rgb[0]=(int)(r*255+0.5);
rgb[1]=(int)(g*255+0.5);
rgb[2]=(int)(b*255+0.5);
}
到此,便使用VC编程实现了色彩空间RGB到HSB(HSV)的转换及其逆变换。为方便读者理解,给出了具体的计 算公式和实际源码。VC图形图像处理编程博大精深,有任何建议欢迎留言讨论,后续文章我们将继续介绍VC编程实现其它色彩空间之间的相互转换。 本系列程序均在Win7+VS2008测试通过,并且结果与PS3的运算结果一致。