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; }
HSB(HSV)色彩空间的模型是一个圆柱体,色相(H)沿着圆柱体的外圆周变化,饱和度(S)沿着从横截面的圆心的距离变化,明度(B)沿着横截面到底面和顶面的距离而变化,如下图所示:
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代码,以供以后使用。