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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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计算色差源码。
示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//颜色距离计算
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代码,以供以后使用。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值