RGB和HSV颜色空间转换

typedef struct {
    double r;       // a fraction between 0 and 1
    double g;       // a fraction between 0 and 1
    double b;       // a fraction between 0 and 1
} rgb;

typedef struct {
    double h;       // angle in degrees
    double s;       // a fraction between 0 and 1
    double v;       // a fraction between 0 and 1
} hsv;

static hsv   rgb2hsv(rgb in);
static rgb   hsv2rgb(hsv in);

hsv rgb2hsv(rgb in)
{
    hsv         out;
    double      min, max, delta;

    min = in.r < in.g ? in.r : in.g;
    min = min  < in.b ? min  : in.b;

    max = in.r > in.g ? in.r : in.g;
    max = max  > in.b ? max  : in.b;

    out.v = max;                                // v
    delta = max - min;
    if (delta < 0.00001)
    {
        out.s = 0;
        out.h = 0; // undefined, maybe nan?
        return out;
    }
    if( max > 0.0 ) { // NOTE: if Max is == 0, this divide would cause a crash
        out.s = (delta / max);                  // s
    } else {
        // if max is 0, then r = g = b = 0              
        // s = 0, h is undefined
        out.s = 0.0;
        out.h = NAN;                            // its now undefined
        return out;
    }
    if( in.r >= max )                           // > is bogus, just keeps compilor happy
        out.h = ( in.g - in.b ) / delta;        // between yellow & magenta
    else
    if( in.g >= max )
        out.h = 2.0 + ( in.b - in.r ) / delta;  // between cyan & yellow
    else
        out.h = 4.0 + ( in.r - in.g ) / delta;  // between magenta & cyan

    out.h *= 60.0;                              // degrees

    if( out.h < 0.0 )
        out.h += 360.0;

    return out;
}


rgb hsv2rgb(hsv in)
{
    double      hh, p, q, t, ff;
    long        i;
    rgb         out;

    if(in.s <= 0.0) {       // < is bogus, just shuts up warnings
        out.r = in.v;
        out.g = in.v;
        out.b = in.v;
        return out;
    }
    hh = in.h;
    if(hh >= 360.0) hh = 0.0;
    hh /= 60.0;
    i = (long)hh;
    ff = hh - i;
    p = in.v * (1.0 - in.s);
    q = in.v * (1.0 - (in.s * ff));
    t = in.v * (1.0 - (in.s * (1.0 - ff)));

    switch(i) {
    case 0:
        out.r = in.v;
        out.g = t;
        out.b = p;
        break;
    case 1:
        out.r = q;
        out.g = in.v;
        out.b = p;
        break;
    case 2:
        out.r = p;
        out.g = in.v;
        out.b = t;
        break;

    case 3:
        out.r = p;
        out.g = q;
        out.b = in.v;
        break;
    case 4:
        out.r = t;
        out.g = p;
        out.b = in.v;
        break;
    case 5:
    default:
        out.r = in.v;
        out.g = p;
        out.b = q;
        break;
    }
    return out;     
}

参考链接:c++ - Algorithm to convert RGB to HSV and HSV to RGB in range 0-255 for both - Stack Overflow

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MATLAB中RGBHSV空间的转换可以使用rgb2hsv函数实现。该函数将RGB颜色空间中的颜色转换HSV颜色空间中的颜色,并返回HSV颜色空间中的值。HSV颜色空间中的值包括色相(H),饱和度(S)和亮度(V)。 具体使用方法如下: 1. 定义RGB颜色空间中的颜色值: R = .5; G = .2; B = .8; 2. 调用rgb2hsv函数将RGB颜色空间中的颜色转换HSV颜色空间中的颜色: HSV = rgb2hsv([R,G,B]); 3. 获取HSV颜色空间中的色相、饱和度和亮度值: H = HSV(1); S = HSV(2); V = HSV(3); 其中,H的取值范围为到1,S和V的取值范围为到100。 希望能对您有所帮助! ### 回答2: MATLAB是一种强大的数值计算软件,其中有多种图像处理函数可供使用。图像处理中常用的一项技术是颜色处理,其中常用的颜色空间之一是RGB颜色空间。而在处理颜色的过程中,有时也需要将RGB空间转换HSV空间,以便更容易的处理颜色。 首先需要了解H、S、V这三个参数分别代表什么含义: H:色相,其值为0到360度的角度值。在HSV空间中,色相指的是颜色在圆锥体上的位置,0度指的是红色,120度指的是绿色,240度指的是蓝色。 S:饱和度,其值为0到1之间的比例值,代表颜色的纯度。0表示灰色,1表示纯颜色。 V:明度,值为0到1之间的比例值,代表颜色的亮度。0为黑色,1为白色。 接下来我们来看一下如何从RGB空间转换HSV空间。对于每个RGB值,需要先将其按以下公式进行归一化: R' = R/255 G' = G/255 B' = B/255 接下来,通过以下公式计算H、S、V的值: V = max(R', G', B') delta = max(R', G', B') - min(R', G', B') if delta == 0 H = 0 S = 0 else S = delta / V; if R' == V H = (G' - B') / delta elseif G' == V H = 2 + (B' - R') / delta else H = 4 + (R' - G') / delta end H = H * 60; if H < 0 H = H + 360; end end 从上述公式中可以看出,如果delta为0,则表示RGB空间中所有颜色均为灰色,此时HSV空间中的S为0,H值可以取任何值。 在进行颜色处理时,有时也需要将HSV空间转换RGB空间,其转换公式如下: C = V x S X = C x [1 - abs((H/60) mod 2 - 1)] m = V - C if H < 60 R' = C G' = X B' = 0 elseif H < 120 R' = X G' = C B' = 0 elseif H < 180 R' = 0 G' = C B' = X elseif H < 240 R' = 0 G' = X B' = C elseif H < 300 R' = X G' = 0 B' = C else R' = C G' = 0 B' = X end R = (R' + m) x 255 G = (G' + m) x 255 B = (B' + m) x 255 从上述公式中可以看出,将HSV空间转换RGB空间的过程是一个比较复杂的计算过程,需要先计算C、X、m等值,然后才能算出RGB的值。因此,在实际使用中,要注意计算的精度和计算速度。同时,还需要注意将RGB值进行归一化,以便输出到图像中。 ### 回答3: HSV是一种常见的颜色空间,它由色相(Hue)、饱和度(Saturation)和亮度(Value)三个通道组成,适用于表示彩色图像的颜色特征。 在MATLAB中,RGB色彩空间和HSV色彩空间之间的转换由函数rgb2hsv()和hsv2rgb()实现。其中rgb2hsv()函数将RGB颜色向量转换HSV颜色向量,它的语法格式为: hsv = rgb2hsv(rgb) 其中,rgb是一个n*3的矩阵或n*1的单列向量,代表n个RGB颜色向量,hsv为同样大小的返回矩阵或向量,代表n个对应的HSV颜色向量。该函数按下列步骤执行转换: 1. 分离R、G和B通道的像素值。以矩阵形式计算为h, s和v,值在[0,1]之间。 2. 计算V = max(R、G、B)和S =(V-min(R、G、B))/ V。 3. 计算H如下: - 如果V = R,则H = 60(G-B)/(V-min(R,G,B)) - 如果V = G,则H = 120+60(B-R)/(V-min(R,G,B)) - 如果V = B,则H = 240+60(R-G)/(V-min(R,G,B)) 4. 如果H < 0,则H = H + 360。 5. 将H、S、V按通道顺序合并为HSV颜色向量。 同样地,hsv2rgb()函数将HSV颜色向量转换RGB颜色向量,它的语法格式为: rgb = hsv2rgb(hsv) 其中,hsvrgb均为n*3的矩阵或n*1的单列向量,代表n个HSV颜色向量和对应的RGB颜色向量。该函数按以下步骤执行转换: 1. 分离H、S和V通道的像素值。以矩阵形式计算为h、s和v。 2. 根据H和S计算C = V*s。 3. 根据H计算X = C(1-abs(mod(H’/60,2)-1))。 4. 计算m = V-C。 5. 根据区间[0,60]、[60,120]、[120,180]、[180,240]、[240,300]和[300,360],计算R、G和B: - 如果H在[0,60],则R = C,G = X和B = 0。 - 如果H在[60,120],则R = X,G = C和B = 0。 - 如果H在[120,180],则R = 0,G = C和B = X。 - 如果H在[180,240],则R = 0,G = X和B = C。 - 如果H在[240,300],则R = X,G = 0和B = C。 - 如果H在[300,360],则R = C,G = 0和B = X。 6. 将每个像素的RGB颜色向量按通道顺序合并为RGB颜色向量。 综上所述,MATLAB中的rgb2hsv()函数和hsv2rgb()函数可以方便地转换RGBHSV颜色空间,对于计算颜色特征相似度、图像分析和处理等领域有着广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值