RGB空间与HSV空间的相互转换(C++实现,修正网上大多数的代码错误)

来源:互联网 发布:hptv手机电视软件 编辑:程序博客网 时间:2024/06/14 05:09

首先RGB空间与HSV空间都是图像的颜色空间模型。RGB色彩模式使用RGB模型为图像中每一个像素的RGB分量分配一个0~255范围内的强度值。RGB图像只使用三种颜色,就可以使它们按照不同的比例混合,在屏幕上重现16777216种颜色。在 RGB 模式下,每种RGB 成分都可使用从 0(黑色)到 255(白色)的值。 例如,亮红色使用 R 值 255、G 值 0 和 B 值 0。 当所有三种成分值相等时,产生灰色阴影。 当所有成分的值均为 255 时,结果是纯白色;当该值为 0 时,结果是纯黑色。HSV 模型通常用于计算机图形应用中。在用户必须选择一个颜色应用于特定图形元素各种应用环境中,经常使用 HSV 色轮。在其中,色相表示为圆环;可以使用一个独立的三角形来表示饱和度和明度。典型的,这个三角形的垂直轴指示饱和度,而水平轴表示明度。在这种方式下,选择颜色可以首先在圆环中选择色相,在从三角形中选择想要的饱和度和明度。

 

HSV 模型的另一种可视方法是圆锥体。在这种表示中,色相被表示为绕圆锥中心轴的角度,饱和度被表示为从圆锥的横截面的圆心到这个点的距离,明度被表示为从圆锥的横截面的圆心到顶点的距离。某些表示使用了六棱锥体。这种方法更适合在一个单一物体中展示这个 HSV 色彩空间;但是由于它的三维本质,它不适合在二维计算机界面中选择颜色。
HSV 色彩空还可以表示为类似于上述圆锥体的圆柱体,色相沿着圆柱体的外圆周变化,饱和度沿着从横截面的圆心的距离变化,明度沿着横截面到底面和顶面的距离而变化。这种表示可能被认为是 HSV 色彩空间的更精确的数学模型;但是在实际中可区分出的饱和度和色相的级别数目随着明度接近黑色而减少。此外计算机典型的用有限精度范围来存储 RGB 值;这约束了精度,再加上人类颜色感知的限制,使圆锥体表示在多数情况下更实用。
两类空间的转换
从 RGB 到 HSL 或 HSV 的转换
设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数。设 max 等价于 r, g 和 b 中的最大者。设 min 等于这些值中的最小者。要找到在 HSL 空间中的 (h, s, l) 值,这里的 h ∈ [0, 360)是角度的色相角,而 s, l ∈ [0,1] 是饱和度和亮度,计算为:

 

[cpp] view plaincopy
  1. void Rgb2Hsv(float R, float G, float B, float& H, float& S, float&V)  
  2. {  
  3.      // r,g,b values are from 0 to 1  
  4.     // h = [0,360], s = [0,1], v = [0,1]  
  5.     // if s == 0, then h = -1 (undefined)  
  6.     float min, max, delta,tmp;  
  7.     tmp = R>G?G:R;  
  8.     min = tmp>B?B:tmp;  
  9.     tmp = R>G?R:G;  
  10.     max = tmp>B?tmp:B;  
  11.     V = max; // v  
  12.     delta = max - min;  
  13.     if( max != 0 )  
  14.         S = delta / max; // s  
  15.     else  
  16.     {  
  17.         // r = g = b = 0 // s = 0, v is undefined  
  18.         S = 0;  
  19.         H = 0;  
  20.         return;  
  21.     }  
  22.     if (delta == 0){  
  23.         H = 0;  
  24.         return;  
  25.     }  
  26.     else if(R == max){  
  27.         if (G >= B)  
  28.             H = (G - B) / delta; // between yellow & magenta  
  29.         else  
  30.             H = (G - B) / delta + 6.0;  
  31.     }  
  32.     else if( G == max )  
  33.         H = 2.0 + ( B - R ) / delta; // between cyan & yellow  
  34.     else if (B == max)  
  35.         H = 4.0 + ( R - G ) / delta; // between magenta & cyan  
  36.     H *= 60.0; // degrees  
  37. }  
 

从 HSV 到 RGB 的转换
类似的,给定在 HSV 中 (h, s, v) 值定义的一个颜色,带有如上的 h,和分别表示饱和度和明度的 s 和 v 变化于 0 到 1 之间,在 RGB 空间中对应的 (r, g, b) 三原色可以计算为:

对于每个颜色向量 (r, g, b),

 

0 0
原创粉丝点击