VC编程实现色彩空间RGB与HSB(HSV)相互转换

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源代码。

1.计算理论公式:

在 HSV 中 (h, s, v) 值定义的一个颜色,带有 h 在指示色相角度的值域 [0, 360),和分别表示饱和度和明度的 sv 变化于 0 到 1 之间,在 RGB 空间中对应的 (r, g, b) 三原色可以计算为:

色彩空间HSV转RGB计算公式

色彩空间HSV转RGB计算公式

色彩空间HSV转RGB计算公式

色彩空间HSV转RGB计算公式

色彩空间HSV转RGB计算公式

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

色彩空间HSV转RGB计算公式

参考来源:HSL和HSV色彩空间
色彩空间RGB转HSV是HSV转RGB转换公式的逆变换,公式比较简单,本文不再给出。

2. VC源代码

示例:

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

发表评论0条 】
网友评论(共?条评论)..
VC编程实现色彩空间RGB与HSB(HSV)相互转换