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)沿着横截面到底面和顶面的距离而变化,如下图所示:
HSV 色轮允许用户快速的选择众多颜色。
这种表示可能被认为是 HSB(HSV)色彩空间的精确数学模型,但是在实际中可区分出的饱和度和色相的级别数目随着明度接近黑色而减少。此外计算机典型的用有限精度范围来存储 RGB 值,这约束了精度,再加上人类颜色感知的限制,使圆锥体表示在多数情况下更实用,如下图所示:
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代码,以供以后使用。