HSV颜色空间

本文详细解释了HSV颜色模型的概念,包括它的构成、应用和与RGB颜色空间的转换过程。HSV模型通过使用圆锥坐标系来表示颜色,提供了一种直观的方式来调整颜色的饱和度和亮度。此外,文章还提供了从RGB到HSV和从HSV到RGB的转换公式,并附上了相应的VC代码示例。

1.什么是HSV

         HSV(hue,saturation,value)颜色空间的模型对应于圆柱坐标系中的一个圆锥形子集,圆锥的顶面对应于V=1。它包含RGB模型中的 R=1,G=1,B=1三个面,所代表的颜色较亮。色彩H由绕V轴的旋转角给定。红色对应于角度0°,绿色对应于角度120°,蓝色对应于角度240°。在HSV颜色模型中,每一种颜色和它的补色相差180°。饱和度S取值从0到1,所以圆锥顶面的半径为1。HSV颜色模型所代表的颜色域是CIE色度图的一个子集,这个模型中饱和度为百分之百的颜色,其纯度一般小于百分之百。在圆锥的顶点(即原点)处,V=0,H和S无定义,代表黑色。圆锥的顶面中心处 S=0,V=1,H无定义,代表白色。从该点到原点代表亮度渐暗的灰色,即具有不同灰度的灰色。对于这些点,S=0,H的值无定义。可以说,HSV模型中的V轴对应于RGB颜色空间中的主对角线。在圆锥顶面的圆周上的颜色,V=1,S=1,这种颜色是纯色。HSV模型对应于画家配色的方法。画家用改变色浓和色深的方法从某种纯色获得不同色调的颜色,在一种纯色中加入白色以改变色浓,加入黑色以改变色深,同时加入不同比例的白色,黑色即可获得各种不同的色调。

HSV 颜色空间可以用一个圆锥空间模型来描述 ,如图(1)、图(2)所示:

 

图(1)

 

 

图(2)

一般对颜色空间的图像进行有效处理都是在HSV空间进行的,然后对于基本色中对应的HSV分量需要给定一个严格的范围,下面是通过实验计算的模糊范围(准确的范围在网上都没有给出)。

 H:  0 --180  S:  0 -- 255   V:  0 --- 255 
此处把部分红色归为紫色范围,详见下表:

2.HSV与RGB转换

2.1 RGB--> HSV

设 (rgb)分别是一个颜色的红、绿和蓝坐标,它们的值是在0到1之间的实数。设max等价于rgb中的最大者。设min等于这些值中的最小者。要找到在HSL空间中的 (h,sl)值,这里的h ∈ [0, 360)是角度的色相角,而sl ∈ [0,1]是饱和度和亮度,计算为:

h =\begin{cases}0^\circ & \mbox{if } max = min \\60^\circ \times \frac{g - b}{max - min} + 0^\circ,   & \mbox{if } max = r \mbox{ and } g \ge b \\60^\circ \times \frac{g - b}{max - min} + 360^\circ,   & \mbox{if } max = r \mbox{ and } g < b \\60^\circ \times \frac{b - r}{max - min} + 120^\circ, & \mbox{if } max = g \\60^\circ \times \frac{r - g}{max - min} + 240^\circ, & \mbox{if } max = b\end{cases}
l = \begin{matrix} \frac{1}{2} \end{matrix} (max + min)
s =\begin{cases}0 & \mbox{if } l = 0 \mbox{ or } max = min \\\frac{max-min}{max+min} = \frac{max-min}{2l}, & \mbox{if } 0 < l \leq \frac{1}{2} \\\frac{max-min}{2-(max+min)} = \frac{max-min}{2-2l}, & \mbox{if } l > \frac{1}{2}\end{cases}

h的值通常规范化到位于0到360°之间。而h = 0用于max = min的(就是灰色)时候而不是留下h未定义。

HSL和HSV有同样的色相定义,但是其他分量不同。HSV颜色的sv的值定义如下:

s =\begin{cases}0, & \mbox{if } max = 0 \\\frac{max - min}{max} = 1 - \frac{min}{max}, & \mbox{otherwise}\end{cases}
v = max \,

设 (rgb) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数。设 max等价于 rgb中的最大者。设 min等于这些值中的最小者。要找到在 HSV 空间中的 (hsv) 值,这里的 h∈ [0, 360)是角度的色相角,而 sv∈ [0,1] 是饱和度和亮度,计算为:

max=max(R,G,B) 
min=min(R,G,B) 
if R = max, H = (G-B)/(max-min) 
if G = max, H = 2 + (B-R)/(max-min) 
if B = max, H = 4 + (R-G)/(max-min) 

H = H * 60 
if H < 0, H = H + 360 

V=max(R,G,B) 
S=(max-min)/max

h的值通常规范化到位于 0 到 360°之间。而 h = 0 用于 max = min的(就是灰色)时候而不是留下 h未定义。

以下为相应的VC代码:

void Rgb2Hsv(float R, float G, float B, float& H, float& S, float&V)
{
      // r,g,b values are from 0 to 1
     // h = [0,360], s = [0,1], v = [0,1]
     // if s == 0, then h = -1 (undefined)

    float min, max, delta,tmp;
     tmp = min(R, G);
     min = min( tmp, B );
     tmp = max( R, G);
     max = max(tmp, B );
     V = max; // v

    delta = max - min;

    if( max != 0 )
       S = delta / max; // s
     else
     {
        // r = g = b = 0 // s = 0, v is undefined
       S = 0;
       H = UNDEFINEDCOLOR;
       return;
     }
     if( R == max )
         H = ( G - B ) / delta; // between yellow & magenta
    else if( G == max )
         H = 2 + ( B - R ) / delta; // between cyan & yellow
    else
         H = 4 + ( R - G ) / delta; // between magenta & cyan

    H *= 60; // degrees
     if( H < 0 )
        H += 360;
}

2.2 HSV-->RGB

类似的,给定在HSV中 (hsv)值定义的一个颜色,带有如上的h,和分别表示饱和度和明度的sv变化于0到1之间,在RGB空间中对应的 (rgb)三原色可以计算为(R,G,B变化于0到1之间):

h_i \equiv \left\lfloor \frac{h}{60} \right\rfloor \pmod{6}
f = \frac{h}{60} - h_i
p = v \times (1 - s) \,
q = v \times (1 - f \times s) \,
t = v \times (1 - (1 - f) \times s) \,

对于每个颜色向量 (rgb),

(r, g, b) =\begin{cases}(v, t, p), & \mbox{if } h_i = 0  \\(q, v, p), & \mbox{if } h_i = 1  \\(p, v, t), & \mbox{if } h_i = 2  \\(p, q, v), & \mbox{if } h_i = 3  \\(t, p, v), & \mbox{if } h_i = 4  \\(v, p, q), & \mbox{if } h_i = 5  \\\end{cases}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值