VC编程实现色彩空间RGB与HSB(HSV)相互转换

VC编程实现色彩空间RGB与HSB(HSV)相互转换

VC编程实现色彩空间RGB与XYZ相互转换、VC编程实现色彩空间XYZ与LAB之间相互转换两篇文章向读者介绍了RGB与LAB通过XYZ色彩空间实现相互转换的算法公式和源代码。在VC编程实现色彩空间RGB与XYZ相互转换已经提到,在PhotoShop中经常使用有RGB(红色、绿色、蓝色)、CMYK(青色、洋红、黄 色、黑色)、HSB(色相、饱和度、亮度)和Lab4中色彩空间。承接前文,本文将介绍RGB与HSB(函数中取名HSV)色彩空间之间的转换方法,并列出具体的算法公式和VC源代码。

1.计算理论公式:

在 HSV 中 (hsv) 值定义的一个颜色,带有 h 在指示色相角度的值域 [0, 360),和分别表示饱和度和明度的 s 和 v 变化于 0 到 1 之间,在 RGB 空间中对应的 (rgb) 三原色可以计算为:

色彩空间HSV转RGB计算公式

色彩空间HSV转RGB计算公式

色彩空间HSV转RGB计算公式

色彩空间HSV转RGB计算公式

色彩空间HSV转RGB计算公式

对于每个颜色向量 (rgb),

色彩空间HSV转RGB计算公式

参考来源:HSL和HSV色彩空间
色彩空间RGB转HSV是HSV转RGB转换公式的逆变换,公式比较简单,本文不再给出。

2. VC源代码

示例:

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的运算结果一致。


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RGB(Red, Green, Blue)和HSB(Hue, Saturation, Brightness)都是常用的颜色模型。RGB模型是基于颜色的三个基本分量,即红色、绿色和蓝色,而HSB模型则是基于颜色的色相、饱和度和亮度。 RGB转换HSB的数学原理如下: 1. 首先需要将RGB转换为0-1的标准化值。假设原始颜色的RGB值为(r, g, b),则对应的标准化值为: r' = r / 255 g' = g / 255 b' = b / 255 2. 计算色相H。色相是指颜色在色轮上的位置,取值范围为0-360度。具体计算方式如下: - 如果最大值和最小值相等,那么色相H为0。 - 如果最大值是红色分量r,那么色相H的计算公式为:H = (g' - b') / (max(r', g', b') - min(r', g', b')) * 60 - 如果最大值是绿色分量g,那么色相H的计算公式为:H = ((b' - r') / (max(r', g', b') - min(r', g', b')) + 2) * 60 - 如果最大值是蓝色分量b,那么色相H的计算公式为:H = ((r' - g') / (max(r', g', b') - min(r', g', b')) + 4) * 60 需要注意的是,由于色相的取值范围是0-360度,所以如果计算出来的H值小于0,需要加上360度。 3. 计算饱和度S。饱和度是指颜色的纯度,取值范围为0-100%。具体计算方式如下: S = (max(r', g', b') - min(r', g', b')) / max(r', g', b') * 100 4. 计算亮度B。亮度是指颜色的明亮程度,取值范围为0-100%。具体计算方式可以参考我之前回答问题中的内容。 通过以上计算,可以得到HSB模型中的色相H、饱和度S和亮度B值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值