智能照明之HSV与RGB

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/flyingcys/article/details/79888629

智能照明之HSV与RGB

一、RGB色彩模型

RGBRedGreenBlue)色彩模式是一种面向硬件的色彩模型,显示系统都采用RGB颜色模型来进行图像显示。RGB色彩模型属于加法混色原理,每种原色的数值越高,色彩就越亮,RGB都是0时是黑色,都是255时是白色。

RGB色彩模型表示直接,但是RGB数值和色彩的三属性没有直接的联系,不能揭示色彩之间的关系。

二、HSV色彩模型

HSV色彩模式应用最广泛的是一个倒圆锥模型,是一种面向用户感官的色彩模型,侧重与色彩表示。这是根据人的视觉系统对亮度的敏感度要强于色彩值这个生理特性而提出的颜色模型。

HSV(HueSaturationValue)分别对应色相、饱和度、明度。

  • 色相H:用角度度量,取值范围为0°~360°,从红色开始按照逆时针方向计算,红色为0°,绿色为120°,蓝色为240°,黄色为60°,青色为180°,品红为300°,对应于绕圆柱的中心轴的角度。
  • 饱和度S:表示色彩的纯度,对应于离圆柱的中心轴的距离。数值越高颜色则深而艳,数值越低则颜色逐渐变灰,取值范围为0.0~1.0,白色的S=0
  • 明度V:表示颜色的明亮程度。取值范围为0.0(黑色)~1.0(白色)。对应于绕圆柱的中心轴的高度,轴取值为自底部的黑色V=0到顶部的白色V=1

        

三、HSV的应用

HSV模型在计算机图形应用中,常使用HSV色轮,其中色相表示为圆环,用一个独立的三角形来表示饱和度(S)和明度(V)。这个三角形的垂直轴表示饱和度,水平轴表示明度。在这种方式下,选择颜色可以首先在圆环中选择色相,在三角形中选择需要的饱和度和明度。

      

    

 

 

HSV模型还可以通过圆柱体来表示。色相沿着圆柱体的外圆周变化,饱和度沿着横截面的圆心的距离变化,明度沿着横截面底面到顶面的距离变化。

 

四、HSVRGB互转

由于HSV是面向用户的色彩模型,而显示系统都采用面向硬件的RGB色彩模型,所以在控制硬件的时候,需要进行HSBRGB的转换。

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

由于HSVRGB在计算中都涉及到小数运算,转换会有精度损失。

/*
h:0~360
s:0~1
v:0~1
*/
void hsv2rgb(float h, float s, float v)
{
	float h60;
	float f;
	unsigned int h60f;
	unsigned int hi;

    float p, q, t;
    float r, g, b;
    unsigned int color_r, color_g, color_b;

    printf("h:%.2f s:%.2f v:%.2f\r\n", h, s, v);

	h60 = h / 60.0;
	h60f = h / 60;

	hi = (int)h60f % 6;
	f = h60 - h60f;

    p = v * (1 - s);
    q = v * (1 - f * s);
    t = v * (1 - (1 - f) * s);

    r = g = b = 0;
    switch(hi)
    {
        case 0:
            r = v;  g = t;  b = p;
        break;

        case 1:
            r = q;  g = v;  b = p;
        break;

        case 2:
           r = p;   g = v;  b = t;
        break;

        case 3:
            r = p;  g = q;  b = v;
        break;

        case 4:
            r = t;  g = p;  b = v;
        break;

        case 5:
            r = v;  g = p;  b = q;
        break;
    }

    r = (r * 255.0) * 100;
    g = (g * 255.0) * 100;
    b = (b * 255.0) * 100;

    color_r = (r + 50) / 100;
    color_g = (g + 50) / 100;
    color_b = (b + 50) / 100;

    printf("color_r:%u color_g:%u color_b:%u\n\n", color_r, color_g, color_b);
 }

猜你喜欢

转载自blog.csdn.net/flyingcys/article/details/79888629