由RGB到HSV颜色空间的理解

1. RGB模型

2. HSV模型

3. 如何理解RGB与HSV的联系

4. HSV在图像处理中的应用

5. OpenCV中RGB-->HSV实现


在图像处理中,最常用的颜色空间是RGB模型,常用于颜色显示和图像处理,三维坐标的模型形式,非常容易被理解。

而HSV模型,是针对用户观感的一种颜色模型,侧重于色彩表示,什么颜色、深浅如何、明暗如何。第一次接触HSV,书本里首先抛出的是一个圆锥模型,由于很少使用HSV,所以印象不深刻,但看一些资料时,HSV的概念时不时出来骚扰一些人的神经,所以,弄清楚HSV与RGB的关系,建立直观的印象是很有必要的。


1. RGB模型。

三维坐标:


原点到白色顶点的中轴线是灰度线,r、g、b三分量相等,强度可以由三分量的向量表示。

用RGB来理解色彩、深浅、明暗变化:

色彩变化: 三个坐标轴RGB最大分量顶点与黄紫青YMC色顶点的连线

深浅变化:RGB顶点和CMY顶点到原点和白色顶点的中轴线的距离

明暗变化:中轴线的点的位置,到原点,就偏暗,到白色顶点就偏亮


PS: 光学的分析

三原色RGB混合能形成其他的颜色,并不是说物理上其他颜色的光是由三原色的光混合形成的,每种单色光都有自己独特的光谱,如黄光是一种单色光,但红色与绿色混合能形成黄色,原因是人的感官系统所致,与人的生理系统有关。

只能说“将三原色光以不同的比例复合后,对人的眼睛可以形成与各种频率的可见光等效的色觉。”


2. HSV模型

倒锥形模型:


这个模型就是按色彩、深浅、明暗来描述的。

H是色彩

S是深浅, S = 0时,只有灰度

V是明暗,表示色彩的明亮程度,但与光强无直接联系,(意思是有一点点联系吧)。




3. RGB与HSV的联系

从上面的直观的理解,把RGB三维坐标的中轴线立起来,并扁化,就能形成HSV的锥形模型了。

但V与强度无直接关系,因为它只选取了RGB的一个最大分量。而RGB则能反映光照强度(或灰度)的变化。

v = max(r, g, b)

由RGB到HSV的转换:


"  HSV对用户来说是一种直观的颜色模型。我们可以从一种纯色彩开始,即指定色彩角H,并让V=S=1,然后我们可以通过向其中加入黑色和白色来得到我们需要的颜色。增加黑色可以减小V而S不变,同样增加白色可以减小S而V不变。例如,要得到深蓝色,V=0.4 S=1 H=240度。要得到淡蓝色,V=1 S=0.4 H=240度。" --百度百科


4. HSV在图像处理应用


HSV在用于指定颜色分割时,有比较大的作用。

H和S分量代表了色彩信息。

分割应用:

      用H和S分量来表示颜色距离,颜色距离指代表两种颜色之间的数值差异
     Androutsos等人通过实验对HSV颜色空间进行了大致划分,亮度大于75%并且饱和度大于20%为亮彩色区域,亮度小于25%为黑色区域,亮度大于75%并且饱和度小于20%为白色区域,其他为彩色区域。

   对于不同的彩色区域,混合H与S变量,划定阈值,即可进行简单的分割。


HSV的去阴影算法

Improving shadow suppression in moving object detection with HSV color information


5. RGB --> HSV中的opencv实现


[cpp]  view plain  copy
  1. struct RGB2HSV_f  
  2. {  
  3.     typedef float channel_type;  
  4.       
  5.     RGB2HSV_f(int _srccn, int _blueIdx, float _hrange)  
  6.     : srccn(_srccn), blueIdx(_blueIdx), hrange(_hrange) {}  
  7.       
  8.     void operator()(const float* src, float* dst, int n) const  
  9.     {  
  10.         int i, bidx = blueIdx, scn = srccn;  
  11.         float hscale = hrange*(1.f/360.f);  
  12.         n *= 3;  
  13.       
  14.         for( i = 0; i < n; i += 3, src += scn )  
  15.         {  
  16.             float b = src[bidx], g = src[1], r = src[bidx^2];  
  17.             float h, s, v;  
  18.               
  19.             float vmin, diff;  
  20.               
  21.             v = vmin = r;  
  22.             if( v < g ) v = g;  
  23.             if( v < b ) v = b;       // v = max(b, g, r)  
  24.             if( vmin > g ) vmin = g;  
  25.             if( vmin > b ) vmin = b;  
  26.               
  27.             diff = v - vmin;  
  28.             s = diff/(float)(fabs(v) + FLT_EPSILON);  // s = 1 - min/max  
  29.             diff = (float)(60./(diff + FLT_EPSILON));  
  30.             if( v == r )  
  31.                 h = (g - b)*diff;  
  32.             else if( v == g )  
  33.                 h = (b - r)*diff + 120.f;  
  34.             else  
  35.                 h = (r - g)*diff + 240.f;  
  36.               
  37.             if( h < 0 ) h += 360.f;  // h 求值  
  38.               
  39.             dst[i] = h*hscale;  
  40.             dst[i+1] = s;  
  41.             dst[i+2] = v;  
  42.         }  
  43.     }  
  44.       
  45.     int srccn, blueIdx;  
  46.     float hrange;  
  47. };  


RGB --> GRAY的实现 算法:

[cpp]  view plain  copy
  1. template<typename _Tp> struct RGB2Gray  
  2. {  
  3.     typedef _Tp channel_type;  
  4.       
  5.     RGB2Gray(int _srccn, int blueIdx, const float* _coeffs) : srccn(_srccn)  
  6.     {  
  7.         static const float coeffs0[] = { 0.299f, 0.587f, 0.114f };  // 三分量系数不同,人眼对绿色最敏感,所以G分量系数较大  
  8.         memcpy( coeffs, _coeffs ? _coeffs : coeffs0, 3*sizeof(coeffs[0]) );  
  9.         if(blueIdx == 0)  
  10.             std::swap(coeffs[0], coeffs[2]);  
  11.     }  
  12.       
  13.     void operator()(const _Tp* src, _Tp* dst, int n) const  // 运算  
  14.     {  
  15.         int scn = srccn;  
  16.         float cb = coeffs[0], cg = coeffs[1], cr = coeffs[2];  
  17.         for(int i = 0; i < n; i++, src += scn)  
  18.             dst[i] = saturate_cast<_Tp>(src[0]*cb + src[1]*cg + src[2]*cr);  // 结果  
  19.     }  
  20.     int srccn;  
  21.     float coeffs[3];  
  22. };  
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RGB颜色空间转换为HSV颜色空间可以有多种方法。 一种常用的方法是基于数学计算的转换公式。根据这个方法,我们可以使用以下转换公式来计算HSV颜色空间中的H、S和V值: H = 0(如果S = 0) H = 60 * ((G - B) / (max - min)) + 360(如果R = max) H = 60 * ((B - R) / (max - min)) + 120(如果G = max) H = 60 * ((R - G) / (max - min)) + 240(如果B = max) S = (max - min) / max V = max 这种方法通过计算RGB颜色分量的比例来确定颜色的色相(H),饱和度(S)和明度(V)。 另一种方法是通过使用编程库或软件来进行转换。许多图像处理软件和编程语言都提供了内置的函数或方法来直接将RGB颜色转换为HSV颜色。这些函数通常会自动处理转换的细节,使得转换过程更加简单快捷。 通过这两种方法,我们可以将RGB颜色空间转换为HSV颜色空间,以便更好地理解和操作颜色。HSV颜色空间在描述颜色时更接近人类视觉感知,因此在图像处理、计算机图形学和颜色选取等领域有广泛的应用。 ### 回答2: RGB颜色空间是一种以红色(R)、绿色(G)、蓝色(B)三个基色来表示颜色的模型,而HSV颜色空间则是一种以色调(H)、饱和度(S)、明度(V)三个要素来表示颜色的模型。在将RGB颜色空间转换为HSV颜色空间时,有以下两种常见的方法: 1. 基于数学公式的转换:根据RGBHSV之间的数学关系,可通过一系列计算公式将RGB颜色转换为HSV颜色。这种方法常用的公式包括: - 计算色调H:H = arccos[(0.5 * (R-G) + (R-B)) / sqrt((R-G)^2 + (R-B)*(G-B))] - 计算饱和度S:S = 1 - 3 * min(R, G, B) / (R + G + B) - 计算明度V:V = (R + G + B) / 3 这些公式将RGB的色彩信息转换为HSV的要素值,从而实现颜色空间的转换。 2. 基于颜色空间模型的转换:还可以通过将RGB颜色空间先转换为另一个颜色空间,如CIE XYZ颜色空间,然后再将其转换为HSV颜色空间。这种方法需要使用一些颜色空间的转换矩阵和算法来实现。 无论是使用基于公式的转换还是基于颜色空间模型的转换,它们都可以将RGB颜色空间转换为HSV颜色空间,从而实现不同颜色空间间的转换和计算。选择哪种方法取决于具体的应用场景和需求。 ### 回答3: RGB颜色空间转换为HSV颜色空间有多种方法。其中最常用且较为简单的方法是通过以下公式进行转换: 1. 归一化RGB值:将RGB颜色空间中的R、G、B分量分别除以255,将其值归一化到0到1范围内。 2. 计算最大值和最小值:找出归一化后的RGB值中的最大值和最小值,分别记为max_val和min_val。 3. 计算亮度(V):HSV颜色空间中的V值直接等于最大值max_val。 4. 计算饱和度(S):根据计算得到的max_val和min_val,计算饱和度S的公式如下: S = (max_val - min_val) / max_val 5. 计算色调(H):色调是HSV颜色空间中最复杂的一个分量。根据计算得到的max_val、min_val以及归一化后的RGB值,可以通过以下公式计算色调: 如果max_val等于min_val,则H为0; 否则,根据max_val和归一化后的RGB值中的R、G、B分量的关系计算H: - 如果max_val等于归一化后的R值,则H等于60 * ((归一化后的G值 - 归一化后的B值) / (max_val - min_val)); - 如果max_val等于归一化后的G值,则H等于60 * (2 + ((归一化后的B值 - 归一化后的R值) / (max_val - min_val)))); - 如果max_val等于归一化后的B值,则H等于60 * (4 + ((归一化后的R值 - 归一化后的G值) / (max_val - min_val)))))。 通过以上步骤,我们可以将RGB颜色空间转换为HSV颜色空间中的亮度、饱和度和色调三个分量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值