Halcon机器视觉论坛

 找回密码
 会员注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3959|回复: 1
收起左侧

[资料] 由RGB到HSV颜色空间的理解

[复制链接]
  • TA的每日心情
    耍酷
    3 天前
  • 签到天数: 636 天

    连续签到: 23 天

    [LV.9]以坛为家II

    353

    主题

    1357

    帖子

    5264

    积分

    Rank: 9

    积分
    5264

    突出贡献优秀版主荣誉管理论坛元老切换助手验证会员最佳新人

    发表于 2016-10-14 18:18:14 | 显示全部楼层 |阅读模式

    管理员 |主题 353|帖子 1357|积分 5264

    51Halcon诚邀您的加入,专注于机器视觉开发与应用技术,我们一直都在努力!

    您需要 登录 才可以下载或查看,没有帐号?会员注册

    x

    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. };  
    复制代码

    转载自:http://blog.csdn.net/viewcode/article/details/8203728#


    无效附件更新 权限提升操作 删帖申请 举报以及其他需要帮助请加入QQ群:214663141 广告位招商 有意者联系
    您需要登录后才可以回帖 会员登录 | 会员注册

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    Halcon鸟叔机器视觉1鸟叔机器视觉 | 51Halcon官方客服咨询官方客服咨询 | Halcon切换助手使用反馈切换助手使用反馈 | 51Halcon论坛管理团队论坛管理团队

    申请友链| 小黑屋| 手机版| Archiver| Halcon机器视觉论坛  

    粤ICP备15095995号-2 粤公网安备44030602000670号

    Powered by Discuz! X3.4 Licensed© 2015-2019 Comsenz Inc.

    快速回复 返回顶部 返回列表