HSV

HSV格式的图片的各通道取值范围
H:0-360
S:0-1
V:0-1
然而在Opencv中的8Bit取值最大只能到255(32Bit的没事),所以在转换时,被除了2,范围变成了0-180.
而S和V通道则为0-255.

以下会以标准的HSV来说,用到Opencv里转化下就好。

HSV中的H通道时保存的色调,从0-360依次为红,橙,黄,绿,青,蓝,紫。但是分布不是均匀的。
看看自己需要检测什么颜色,从下图选取并测得角度范围即可
这里写图片描述

S通道:当S<0.1时可以算为灰度图像,>0.65时亮度较高。
V通道:当V<0.15是视觉上算是黑色,>0.9时视觉上算是白色。



VERSION2:


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实现


  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的实现 算法:

  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. }; 

03-23
<think>嗯,我现在要了解HSV颜色模型及其在图像处理中的应用。首先,我需要回忆一下之前学过的颜色模型,比如常见的RGB模型。RGB是通过红、绿、蓝三个颜色通道的组合来表示颜色,这在显示设备上很常用,但可能不太符合人类对颜色的直观感知。比如,调整颜色亮度或饱和度时,RGB可能需要同时修改三个通道,而HSV可能更方便。 接下来,HSV的全称是什么呢?应该是Hue(色调)、Saturation(饱和度)、Value(明度)。色调代表颜色类型,比如红、蓝、绿;饱和度指颜色的鲜艳程度,饱和度越高颜色越纯;明度则与颜色亮度相关。这三个分量分开可能更容易进行图像处理操作,比如调整亮度只需修改V分量,而不会影响颜色本身。 那HSV的结构是怎样的呢?资料里提到是圆锥模型,可能需要想象一个六棱锥或者圆柱体。Hue通常用角度表示,0°到360°,对应不同的颜色。Saturation和Value可能是百分比或者0到1之间的值。不过不同的库可能有不同的范围,比如OpenCV中H可能是0-180,S和V是0-255,这需要查证。 然后,应用方面,HSV在图像处理中常用于颜色分割、目标检测等。比如,在识别交通标志时,可以根据颜色(如红色、黄色)在HSV空间中进行阈值分割,这样比RGB更容易区分颜色。另外,调整图像的饱和度和明度可以在HSV空间直接操作,比如增强照片的饱和度使颜色更鲜艳。 还有,HSV与其他颜色模型的转换,比如如何从RGB转换到HSV,公式可能比较复杂,涉及最大值、最小值以及差值计算。在OpenCV中,可能有现成的函数如cvtColor来实现这种转换,但需要了解每个分量的处理方式。 不过,可能存在一些混淆点,比如HSV和HSL的区别。HSL中的L是亮度(Lightness),而HSV中的V是明度(Value),两者的模型结构不同,HSL是双圆锥,HSV是单圆锥。应用场景上,HSL可能更适合调整亮度,而HSV适合颜色选择器之类的应用。 另外,需要注意在图像处理中使用HSV时的范围问题。例如,OpenCV中的H通道范围是0-180,而不是0-360,可能是因为使用8位存储,所以将0-360压缩到0-180。这在进行颜色阈值处理时必须注意,否则可能选错范围。 实际应用中,比如肤色检测,可以设定H在较低的范围(比如0-20)对应皮肤颜色,结合S和V的阈值来分割皮肤区域。或者在图像滤镜中,调整饱和度来增强或减弱颜色效果。 可能遇到的问题包括光照变化对V通道的影响,导致颜色分割不稳定,这时候可能需要结合其他技术如自适应阈值或者使用归一化方法。此外,不同设备采集的图像可能有颜色偏差,转换到HSV空间是否能有效处理这些差异也需要考虑。 总之,理解HSV的各个分量含义,掌握与RGB的转换方法,以及在实际应用中如何利用各分量进行图像处理操作是关键。需要参考具体库的文档,比如OpenCV中的HSV范围和处理函数,确保正确实现所需功能。</think>### HSV颜色模型介绍及其在图像处理中的应用 #### 1. HSV颜色模型的基本概念 HSV是一种基于人类视觉感知的颜色模型,由三个分量组成: - **色调(Hue)**:表示颜色类型,如红、绿、蓝,用角度值$0° \sim 360°$表示[^1]。 - **饱和度(Saturation)**:表示颜色的鲜艳程度,范围$0\% \sim 100\%$(或$0 \sim 1$),值越高颜色越纯。 - **明度(Value)**:表示颜色的亮度,范围$0\% \sim 100\%$(或$0 \sim 1$),值越高颜色越亮。 在OpenCV中,HSV的取值范围略有调整: - $H \in [0, 180]$(为了适配8位存储,将$0° \sim 360°$压缩为$0 \sim 180$) - $S, V \in [0, 255]$。 #### 2. HSV与RGB的对比 - **RGB模型**:基于红、绿、蓝三原色的加色混合,适用于显示器等设备,但调整颜色属性(如亮度)需同时修改多个通道[^2]。 - **HSV模型**:将颜色属性解耦,更符合人类对颜色的直观描述。例如: - 调整亮度只需修改$V$分量; - 过滤特定颜色时,只需在$H$通道设置阈值[^3]。 #### 3. HSV在图像处理中的应用 1. **颜色分割** 通过设定$H$的范围,可快速提取特定颜色区域。例如: ```python import cv2 import numpy as np # 转换到HSV空间 img_hsv = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2HSV) # 定义红色的HSV范围(OpenCV格式) lower_red = np.array([0, 50, 50]) upper_red = np.array([10, 255, 255]) mask = cv2.inRange(img_hsv, lower_red, upper_red) ``` 该方法常用于交通标志检测、肤色识别等[^1]。 2. **亮度/饱和度调整** 直接修改$V$或$S$通道可快速调整图像明暗或鲜艳程度: ```python # 增强饱和度(增加S值) img_hsv[:, :, 1] = np.clip(img_hsv[:, :, 1] * 1.5, 0, 255) ``` 3. **背景去除与滤镜效果** 结合阈值分割和形态学操作,可实现复杂场景下的目标提取。例如,在绿幕抠图中,通过设定绿色$H$范围生成蒙版[^3]。 #### 4. 与其他颜色模型的协作 HSV常与RGB、LAB等模型结合使用: - **RGB转HSV公式**: $$ H = \begin{cases} 60^\circ \times \left( \frac{G-B}{\text{max}(R,G,B)-\text{min}(R,G,B)} \right) & \text{if max}=R \\ 60^\circ \times \left( 2 + \frac{B-R}{\text{max}-\text{min}} \right) & \text{if max}=G \\ 60^\circ \times \left( 4 + \frac{R-G}{\text{max}-\text{min}} \right) & \text{if max}=B \end{cases} $$ $$ S = \frac{\text{max}-\text{min}}{\text{max}}, \quad V = \text{max} $$ - **HSV与LAB结合**:LAB模型更适合处理光照变化,而HSV适合颜色筛选,二者结合可提升复杂场景的鲁棒性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值