RGB与HSI的互转

1,明度仅与图像的最多颜色成分和最少的颜色成分的总量有关。明度越高,图像越趋于明亮的白色。
2,饱和度与图像的最多颜色成分和最少的颜色成分的差量有关。饱和度越小,图像越趋于灰度图像。饱和度越大,图像越鲜艳,给人的感觉是彩色的。
3,色调决定了人对图像的不同的颜色感受。
4,H分成0~6区域。RGB颜色空间是一个立方体而HSL颜色空间是两个六角形锥体,其中的L是RGB立方体的主对角线。因此,RGB立方体的顶点:红、黄、绿、青、蓝和品红就成为HSL六角形的顶点,而数值0~6就告诉我们H在哪个部分

一、RGB转HSL算法

步骤1:把RGB值转成【0,1】中数值
步骤2:找出R,G和B中的最大值
步骤3:计算明度:L=(maxcolor + mincolor)/2
步骤4:如果最大和最小的颜色值相同,即表示灰色,那么S定义为0,而H未定义并在程序中通常写成0
步骤5:否则,根据明度L计算饱和度S
步骤6:计算色调H

示例代码


#define min3v(v1, v2, v3)   ((v1)>(v2)? ((v2)>(v3)?(v3):(v2)):((v1)>(v3)?(v3):(v1)))
#define max3v(v1, v2, v3)   ((v1)<(v2)? ((v2)<(v3)?(v3):(v2)):((v1)<(v3)?(v3):(v1)))

static void RGBtoHSL(const COLOR_RGB *Rgb, COLOR_HSL *Hsl)
{
    int h,s,l,maxVal,minVal,difVal;
        int r  = Rgb->red;
        int g  = Rgb->green;
    int b  = Rgb->blue;

        maxVal = max3v(r, g, b);//找出最大值
        minVal = min3v(r, g, b);//找出最小值

        difVal = maxVal-minVal;//差值

        //计算亮度  l=(255+1)/255/2*240  平均色度
    l = (maxVal+minVal)*240/255/2;

        if(maxVal == minVal)//若r=g=b
        {
                h = 0; 
                s = 0;
        }
        else
        {
                //计算色调 -- 0(或360)表示红色,120表示绿色,240表示蓝色
                if(maxVal==r) //红 |g-b|*40/r-min
                {
                        if(g>=b)
                                h = 40*(g-b)/(difVal);
                        else
                                h = 40*(g-b)/(difVal) + 240;
                }
                else if(maxVal==g)  //绿 (b-r)*40/g-min +80
                        h = 40*(b-r)/(difVal) + 80;
                else if(maxVal==b) //蓝  (r-g)*40/b-min +160
                        h = 40*(r-g)/(difVal) + 160;
                //计算饱和度
                if(l == 0)
                        s = 0; 
                else if(l<=120) 
                        s = (difVal)*240/(maxVal+minVal);
                else  
                        s = (difVal)*240/(511 - (maxVal+minVal));
        }
    Hsl->hue =        (unsigned char)(((h>240)? 240 : ((h<0)?0:h)));
    Hsl->saturation = (unsigned char)(((s>240)? 240 : ((s<0)?0:s)));
    Hsl->luminance =  (unsigned char)(((l>240)? 240 : ((l<0)?0:l)));
}

二、HSL转RGB

步骤1:If S=0,表示灰色,定义R,G和B都为L.
步骤2:否则,测试L:
If L<0.5,temp2=L*(1.0+S)
If L>=0.5,temp2=L+S-L*S
步骤3:temp1=2.0*L-temp2
步骤4:把H转换到0~1。
步骤5:对于R,G,B,计算另外的临时值temp3。方法如下:
for R, temp3=H+1.0/3.0
for G, temp3=H
for B, temp3=H-1.0/3.0
if temp3<0, temp3=temp3+1.0
if temp3>1, temp3=temp3-1.0
步骤6:对于R,G,B做如下测试:
If 6.0*temp3<1,color=temp1+(temp2-temp1)*6.0*temp3
Else if 2.0*temp3<1,color=temp2
Else if 3.0*temp3<2,
color=temp1+(temp2-temp1)*((2.0/3.0)-temp3)*6.0
Else color=temp1

代码略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值