VC编程使用HSB(HSV)色彩空间实现色差比较

2012-03-15 20:45:08|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C/C++, 图形/图像|来源:唯设编程网

VC编程实现色彩空间RGB与HSB(HSV)相互转换VC编程实现色彩空间XYZ与LAB相互转换VC编程实现色彩空间XYZ与LAB相互转换介绍了VC编程实现色彩空间之间的转换算法公式以及具体的VC代码实现,本文将在其基础上进行补充,首先列出RGB与LAB色彩空间互相转换的VC源代码:

bool CColorUtility::_cie_rgb2lab(const int rgb[3],double (&lab)[3]){
	double xyz[3]={rgb[0],rgb[1],rgb[2]};
	if(_cie_rgb2xyz(rgb,xyz))
		return _cie_xyz2lab(xyz,lab);
	else
		return false;
}
bool CColorUtility::_cie_lab2rgb(const double lab[3],int (&rgb)[3]){
	double xyz[3]={rgb[0],rgb[1],rgb[2]};
	if(_cie_lab2xyz(lab,xyz))
		return _cie_xyz2rgb(xyz,rgb);
	else
		return false;
}
通过以上代码,我们可以更加直观的进行RGB、LAB色彩空间相互转换,下面我们将讨论计算两种颜色色差的方法。RGB色彩空间的模型是一个正方体,无法很好的计算色彩之间的差值(色差),通常我们就需要进行色彩空间的转换。

HSB(HSV)色彩空间的模型是一个圆柱体,色相(H)沿着圆柱体的外圆周变化,饱和度(S)沿着从横截面的圆心的距离变化,明度(B)沿着横截面到底面和顶面的距离而变化,如下图所示:

HSB(HSV)色彩空间模型
HSV 色轮允许用户快速的选择众多颜色。

这种表示可能被认为是 HSB(HSV)色彩空间的精确数学模型,但是在实际中可区分出的饱和度和色相的级别数目随着明度接近黑色而减少。此外计算机典型的用有限精度范围来存储 RGB 值,这约束了精度,再加上人类颜色感知的限制,使圆锥体表示在多数情况下更实用,如下图所示:

HSB(HSV)色彩空间模型
HSV 模型的圆锥表示适合于在一个单一物体中展示整个 HSV 色彩空间。

通过在互联网上的搜索结果以及自己多次试验,使用HSB(HSV)色彩空间进行色差比较具有较高的准确性,并且能够与人眼感知保持一致。下面给出具体的VC计算色差源码。
示例:

//颜色距离计算
double CColorUtility::EuclidDist(double h1 , double s1, double v1, double h2, double s2, double v2) 
{
	return sqrt(pow(h1-h2,2)+pow(s1-s2,2)+pow(v1-v2,2));
}
//比较两种颜色的相似度
double CColorUtility::EuclidDist(COLORREF orgColor,COLORREF desColor){
	double orgHSV[3];	
	int orgRGB[3]={GetRValue(orgColor),GetGValue(orgColor),GetBValue(orgColor)};
	_cie_rgb2hsv(orgRGB,orgHSV);	//转换成HSV
	double desHSV[3];	 
	int desRGB[3]={GetRValue(desColor),GetGValue(desColor),GetBValue(desColor)};
	_cie_rgb2hsv(desRGB,desHSV);
	return EuclidDist(orgHSV[0],orgHSV[1],orgHSV[2],desHSV[0],desHSV[1],desHSV[2]);
}

本文在前面介绍文章的基础上,总结了色彩空间RGB与LAB之间进行转换的方法,详细介绍了HSB(HSV)的精确圆柱模型和更加实用的倒锥模型,以及使用HSB(HSV)色彩空间进行色差比较的算法和具体的VC代码,以供以后使用。

 

发表评论0条 】
网友评论(共?条评论)..
VC编程使用HSB(HSV)色彩空间实现色差比较