VC编程实现色彩空间RGB与XYZ相互转换、VC编程实现色彩空间XYZ与LAB之间相互转换两篇文章向读者介绍了RGB与LAB通过XYZ色彩空间实现相互转换的算法公式和源代码。在VC编程实现色彩空间RGB与XYZ相互转换已经提到,在PhotoShop中经常使用有RGB(红色、绿色、蓝色)、CMYK(青色、洋红、黄 色、黑色)、HSB(色相、饱和度、亮度)和Lab4中色彩空间。承接前文,本文将介绍RGB与HSB(函数中取名HSV)色彩空间之间的转换方法,并列出具体的算法公式和VC源代码。
在 HSV 中 (h, s, v) 值定义的一个颜色,带有 h 在指示色相角度的值域 [0, 360),和分别表示饱和度和明度的 s 和 v 变化于 0 到 1 之间,在 RGB 空间中对应的 (r, g, b) 三原色可以计算为:
对于每个颜色向量 (r, g, b),
参考来源:HSL和HSV色彩空间
色彩空间RGB转HSV是HSV转RGB转换公式的逆变换,公式比较简单,本文不再给出。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
// 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的运算结果一致。