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

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
时间: 2024-11-03 21:03:03

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

RGB和HSV颜色空间

转载:http://blog.csdn.net/carson2005/article/details/6243892 RGB颜色空间: RGB(red,green,blue)颜色空间最常用的用途就是显示器系统(计算机.电视机等都是采用RGB颜色空间来进行图像显示).一般来说,电脑,电视机等是利用三个电子枪分别发射R分量,G分量,B分量的电子束,以此来激发屏幕上的RGB三种颜色的荧光粉,从而发出不同颜色.不同亮度的像素.进而组成了一幅图像:很明显,RGB颜色空间利用了物理学中的三原色叠加从而组成产

RGB与HSV颜色空间

RGB颜色空间 1.三基色原理:大多数的颜色可以通过红.绿.蓝三色按照不同的比例合成产生,同样绝大多数单色光也可以分解成红绿蓝三种色光    红绿蓝三基色按照不同的比例相加合成混色称为相加混色.其中一些混色的规律有:    红色+绿色=黄色:    绿色+蓝色=青色:    红色+蓝色=品红:    红色+绿色+蓝色=白色: 2.互补光:当两种光按照适当的比例混合得到白光时,这两种光为互补光 3.亮度:单色光的亮度强度各不相同,根据人的感受是:绿光最亮,红光次之,蓝光最弱 4.假设白光的亮度为1

RGB、HSV、HSI颜色空间

概述 这篇博客主要介绍RGB.HSV和HSI颜色空间以及转换公式. RGB颜色空间 定义 RGB颜色空间通常用于显示器系统,例如:电脑.电视机的显示器使用的都是RGB颜色空间.利用物理学中的三原色叠加原理,可以产生各种颜色.在RGB颜色空间中,R.G.B各颜色分量彼此独立. RGB颜色空间的缺点在于不符合人眼的视觉特性,直接处理多有不便,因此通常需要转换到其他颜色空间进行处理,最后再转换到RGB颜色空间,用于显示器显示. 数学模型 RGB颜色空间中,R.G.B三个分量彼此独立,所能表示的范围也相

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

转自:http://blog.csdn.net/jiangxinyu/article/details/8000999 一般的3D编程只需要使用RGB颜色空间就好了,但其实美术人员更多的是使用HSV(HSL),因为可以方便的调整饱和度和亮度. 有时候美术需要程序帮助调整饱和度来达到特定风格的渲染效果,这时候就需要转换颜色空间了. 出处:http://zh.wikipedia.org/wiki/HSL%E5%92%8CHSV%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4 H

Atitit &#160;rgb yuv &#160;hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别

Atitit  rgb yuv  hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别 1.1. 色彩的三要素 -- 色相.明度.纯度1 1.2. YUV三个字母中,其中"Y"表示明亮度(Lumina nce或Luma),也就是灰阶值:而"U"和"V"表示的则是色度(Chrominance或Chroma)2 1.3. HSB 和 HSV 是是一样的,只是叫法不同,HSL 则还有一些细微的区别:2 2. RGB 是对机器很友好的色彩模式,但

关于HSL和HSV颜色空间的详细论述

目前在计算机视觉领域存在着较多类型的颜色空间(color space).HSL和HSV是两种最常见的圆柱坐标表示的颜色模型,它重新影射了RGB模型,从而能够视觉上比RGB模型更具有视觉直观性. HSV颜色空间 HSV(hue,saturation,value)颜色空间的模型对应于圆柱坐标系中的一个圆锥形子集,圆锥的顶面对应于V=1. 它包含RGB模型中的R=1,G=1,B=1 三个面,所代表的颜色较亮.色彩H由绕V轴的旋转角给定.红色对应于 角度0° ,绿色对应于角度120°,蓝色对应于角度24

RGB与HSV之间的转换公式及颜色表

RGB & HSV 英文全称 RGB - Red, Green, Blue HSV - Hue, Saturation, Value HSV --> RGB 转换公式 HSV --> RGB 颜色表 RGB --> HSV 转换公式 RGB --> HSV 颜色表 参考资料 1.RGB to HSV conversion | color conversion http://www.rapidtables.com/convert/color/rgb-to-hsv.htm 2.

RGB 转化 HSV代码

public void toHSV3( int red , int green , int blue ){ double maxRGB = FqMath.max( red , green , blue );// double minRGB = FqMath.min( red , green , blue ); double itemp = maxRGB; //v'=itemp double temp = maxRGB - minRGB;// if( maxRGB == minRGB ){ thi

第13集 hsv颜色空间

HSV(Hue, Saturation, Value): 这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V). 饱和度=色调/亮度,亮度就是BGR的对角线,亮度越小(掺入的白色越少),色调越大(离轴线的距离越大),饱和度越大 圆圈定义了H通道,对角线上的两种颜色(比如蓝色和***)为互补光(叠加起来为白色的两种光) V定义了亮度 第13集 hsv颜色空间