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的运算结果一致。