RGB 和 HSV 互相转换算法

一、简介

        RGB 是我们接触最多的颜色空间,分别为红色(R),绿色(G)和蓝色(B)。HSV 是用色调H,饱和度S,明亮度V来描述颜色的变化,H取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。饱和度S越高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。H表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。

二、从RGB转换到HSV

  • 设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数
  • 设 max 等于 r, g, b 中的最大者
  • 设 min 等于 r, g, b 中的最小者

                                   

转换代码如下:


   
   
  1. float retmax( float a, float b, float c)//求最大值
  2. {
  3. float max = 0;
  4. max = a;
  5. if( max<b)
  6. max = b;
  7. if( max<c)
  8. max = c;
  9. return max;
  10. }
  11. float retmin( float a, float b, float c)//求最小值
  12. {
  13. float min = 0;
  14. min = a;
  15. if( min>b)
  16. min = b;
  17. if( min>c)
  18. min = c;
  19. return min;
  20. }
  21. //R,G,B参数传入范围( 0~ 100
  22. //转换结果h( 0~ 360),s( 0~ 100),v( 0~ 100)
  23. void rgb_to_hsv( float *h, float *s, float *v, float R, float G, float B)
  24. {
  25. float max = 0, min = 0;
  26. R = R/ 100;
  27. G = G/ 100;
  28. B = B/ 100;
  29. max = retmax(R,G,B);
  30. min = retmin(R,G,B);
  31. *v = max;
  32. if( max == 0)
  33. *s = 0;
  34. else
  35. *s = 1 - ( min/ max);
  36. if( max == min)
  37. *h = 0;
  38. else if( max == R && G>=B)
  39. *h = 60*((G-B)/( max- min));
  40. else if( max == R && G<B)
  41. *h = 60*((G-B)/( max- min)) + 360;
  42. else if( max == G)
  43. *h = 60*((B-R)/( max- min)) + 120;
  44. else if( max == B)
  45. *h = 60*((R-G)/( max- min)) + 240;
  46. *v = *v * 100;
  47. *s = *s * 100;
  48. }

 

三、从HSV转换到RGB

1、转换公式如下:

                                 

2、转换代码如下:


   
   
  1. //参数入参范围h(0~360),s(0~100),v(0~100),这里要注意,要把s,v缩放到0~1之间
  2. //转换结果R(0~100),G(0~100),B(0~100),如需转换到0~255,只需把后面的乘100改成乘255
  3. void hsv_to_rgb (int h,int s,int v,float *R,float *G,float *B)
  4. {
  5. float C = 0,X = 0,Y = 0,Z = 0;
  6. int i= 0;
  7. float H=( float)(h);
  8. float S=( float)(s)/ 100.0;
  9. float V=( float)(v)/ 100.0;
  10. if(S == 0)
  11. *R = *G = *B = V;
  12. else
  13. {
  14. H = H/ 60;
  15. i = ( int)H;
  16. C = H - i;
  17. X = V * ( 1 - S);
  18. Y = V * ( 1 - S*C);
  19. Z = V * ( 1 - S*( 1-C));
  20. switch(i){
  21. case 0 : *R = V; *G = Z; *B = X; break;
  22. case 1 : *R = Y; *G = V; *B = X; break;
  23. case 2 : *R = X; *G = V; *B = Z; break;
  24. case 3 : *R = X; *G = Y; *B = V; break;
  25. case 4 : *R = Z; *G = X; *B = V; break;
  26. case 5 : *R = V; *G = X; *B = Y; break;
  27. }
  28. }
  29. *R = *R * 100;
  30. *G = *G * 100;
  31. *B = *B * 100;
  32. }

 

  • 3
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答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颜色空间,对于计算颜色特征相似度、图像分析和处理等领域有着广泛的应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值