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

struct RGB2HSV_f
{
    typedef float channel_type;
    
    RGB2HSV_f(int _srccn, int _blueIdx, float _hrange)
    : srccn(_srccn), blueIdx(_blueIdx), hrange(_hrange) {}
    
    void operator()(const float* src, float* dst, int n) const
    {
        int i, bidx = blueIdx, scn = srccn;
        float hscale = hrange*(1.f/360.f);
        n *= 3;
    
        for( i = 0; i < n; i += 3, src += scn )
        {
            float b = src[bidx], g = src[1], r = src[bidx^2];
            float h, s, v;
            
            float vmin, diff;
            
            v = vmin = r;
            if( v < g ) v = g;
            if( v < b ) v = b; // v = max(b, g, r)
            if( vmin > g ) vmin = g;
            if( vmin > b ) vmin = b;
            
            diff = v - vmin;
            s = diff/(float)(fabs(v) + FLT_EPSILON); // s = 1 - min/max
            diff = (float)(60./(diff + FLT_EPSILON));
            if( v == r )
                h = (g - b)*diff;
            else if( v == g )
                h = (b - r)*diff + 120.f;
            else
                h = (r - g)*diff + 240.f;
            
            if( h < 0 ) h += 360.f; // h 求值
            
            dst[i] = h*hscale;
            dst[i+1] = s;
            dst[i+2] = v;
        }
    }
    
    int srccn, blueIdx;
    float hrange;
};

RGB --> GRAY的实现 算法:

template<typename _Tp> struct RGB2Gray
{
typedef _Tp channel_type; RGB2Gray(int _srccn, int blueIdx, const float* _coeffs) : srccn(_srccn)
{
static const float coeffs0[] = { 0.299f, 0.587f, 0.114f }; // 三分量系数不同,人眼对绿色最敏感,所以G分量系数较大
memcpy( coeffs, _coeffs ? _coeffs : coeffs0, 3*sizeof(coeffs[0]) );
if(blueIdx == 0)
std::swap(coeffs[0], coeffs[2]);
} void operator()(const _Tp* src, _Tp* dst, int n) const // 运算
{
int scn = srccn;
float cb = coeffs[0], cg = coeffs[1], cr = coeffs[2];
for(int i = 0; i < n; i++, src += scn)
dst[i] = saturate_cast<_Tp>(src[0]*cb + src[1]*cg + src[2]*cr); // 结果
}
int srccn;
float coeffs[3];
}; 转自:http://blog.csdn.net/viewcode/article/details/8203728

由RGB到HSV颜色空间的理解的更多相关文章

  1. RGB颜色空间、HSV颜色空间的理解

    HSV是把H(色相),S(饱和度),V(亮度)当做色值来定位颜色的空间. 1.HSV模型 色相:取值范围是0~360度,用来表示颜色的类别.其中红色是0度,绿色是120度,蓝色是240度.饱和度:取值 ...

  2. RGB与HSV颜色空间

    RGB颜色空间 1.三基色原理:大多数的颜色可以通过红.绿.蓝三色按照不同的比例合成产生,同样绝大多数单色光也可以分解成红绿蓝三种色光    红绿蓝三基色按照不同的比例相加合成混色称为相加混色.其中一 ...

  3. RGB和HSV颜色空间

    转载:http://blog.csdn.net/carson2005/article/details/6243892 RGB颜色空间: RGB(red,green,blue)颜色空间最常用的用途就是显 ...

  4. OpenCV——RGB和HSV颜色空间

    RGB颜色空间 在RGB中,一幅图像有三个独立的图像平面或通道组成:红,绿,蓝(以及第四个通道透明度). RGB颜色表 资料:网络  ◇  编制:王践舜 RGB(255,23,140)是光的三原色,也 ...

  5. RGB颜色空间、色调、饱和度、亮度,HSV颜色空间详解

    本文章会详细的介绍RGB颜色空间与RGB三色中色调.饱和度.亮度之间的关系,最后会介绍HSV颜色空间! RGB颜色空间 概述 RGB颜色空间以R(Red:红).G(Green:绿).B(Blue:蓝) ...

  6. 颜色空间RGB与HSV(HSL)的转换

    一般的3D编程只需要使用RGB颜色空间就好了,但其实美术人员更多的是使用HSV(HSL),因为可以方便的调整饱和度和亮度. 有时候美术需要程序帮助调整饱和度来达到特定风格的渲染效果,这时候就需要转换颜 ...

  7. LCD LED OLED区别 以及RGB、YUV和HSV颜色空间模型

    led 液晶本身不发光,而是有背光作为灯源,白色是由红绿蓝三色组成,黑色是,液晶挡住了led灯光穿过显示器. lcd比led更薄. oled:显示黑色时,灯是灭的,所以显示黑色更深,效果更好. 这就不 ...

  8. RGB、YUV和HSV颜色空间模型

    一.概述 颜色通常用三个独立的属性来描述,三个独立变量综合作用,自然就构成一个空间坐标,这就是颜色空间.但被描述的颜色对象本身是客观的,不同颜色空间只是从不同的角度去衡量同一个对象.颜色空间按照基本机 ...

  9. 06: RGB、YUV和HSV颜色空间模型

    RGBA是代表Red(红色)Green(绿色)Blue(蓝色)和Alpha的色彩空间 YUV:Y"表示明亮度(Luminance或Luma),也就是灰阶值:而"U"和&q ...

随机推荐

  1. strlen、strcmp、strcat、strcpy、memcpy基础函数的实现

    最近实习+投简历+琐事弄得自己忙的不行不行的,终于今天可以开始记录一些东西了... 1.strlen函数的实现 int strlen(const char *str){ assert(str!=NUL ...

  2. 简单QT界面信号图形化输入输出

    右键->转到槽,选择信号 就可以输入代码 右键->转到槽,选择信号 就可以输入代码 2个文本框接受输入数字,第3个文本框输出相加结果 void Dialog::on_pushButton_ ...

  3. IOS学习笔记07---C语言函数-printf函数

    IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...

  4. 【Lucene3.6.2入门系列】第10节_Tika

    首先贴出来的是演示了借助Tika创建索引的HelloTikaIndex.java PS:关于Tika的介绍及用法,详见下方的HelloTika.java package com.jadyer.luce ...

  5. ShareSDK的简化压缩和使用样例

    share sdk 太大了  于是自己 開始简化,  删除了 ipad 的图片和 framework ,  压缩了 sharesdk 中的 图片,用几k的图片 替换了几个 200多k 的图片 仅仅保留 ...

  6. 移动前端不得不了解的HTML5 head 头标签(2016最新版)

    小编推荐:掘金是一个高质量的技术社区,从 ECMAScript 6 到 Vue.js,性能优化到开源类库,让你不错过前端开发的每一个技术干货.各大应用市场搜索「掘金」即可下载APP,技术干货尽在掌握. ...

  7. SqlServer mssql 按月统计所有部门

    以订单统计为例,前端展示柱状图(Jquery统计): 表及主要字段描述如下:表名:Orders1.日期CreateTime2.金额Amount3.用户UserID 情况一:根据部门统计某一年每月销量( ...

  8. asp.net预览图片

    Aspx code <table> <tr> <td class="style3"> <asp:Label ID="Label1 ...

  9. EC读书笔记系列之4:条款8 别让异常逃离析构函数

    条款8 别让异常逃离析构函数 记住: ★析构函数绝对不要吐出异常.若一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们(不传播)或结束程序. ★若客户需对某个操作函数运行期间 ...

  10. git 克隆本地仓库

    如果要从本地仓库克隆到另一个地方使用如下命令 git clone d:/SourceRepository d:/DestinationRepository d:/SourceRepository:本地 ...