您的位置:首页 > 其它

颜色空间及其之间的转换

2013-06-20 11:17 211 查看
对植物进行识别时,选用绿色做为特征,进行颜色过滤。

载入图像的颜色空间采用RGB模式,为了便于利用逻辑表达式进行过滤,将其转换为HSV模式后,再利用色相值。

  对一种颜色进行编码的方法统称为“颜色空间”或“色域”。用最简单的话说,世界上任何一种颜色的“颜色空间”都可定义成一个固定的数字或变量。

RGB格式

  RGB(红、绿、蓝)只是众多颜色空间的一种。采用这种编码方法,每种颜色都可用三个变量来表示红色、绿色以及蓝色的强度。记录及显示彩色图像时,RGB是最常见的一种方案。但是,它缺乏与早期黑白显示系统的良好兼容性。因此,许多电子电器厂商普遍采用的做法是,将RGB转换成YUV颜色空间,以维持兼容,再根据需要换回RGB格式,以便在电脑显示器上显示彩色图形。

  RGB色彩模式使用RGB模型为图像中每一个像素的RGB分量分配一个0~255范围内的强度值。RGB图像只使用三种颜色,就可以使它们按照不同的比例混合,在屏幕上重现16777216(256 * 256 * 256)种颜色。

RGB颜色模型映射到一个立方体上。水平的x轴代表红色,向左增加。y轴代表绿色,向右下方向增加。竖直的z轴代表蓝色,向上增加。原点代表黑色,遮挡在立方体背面。缺掉的最突出端点,也就是黑色的对角点为白色。



下图展示了24 bpp的RGB 立方体的三个“完全饱和”面,它们被展开到了平面上:



HSV 颜色模型

  这个模型中颜色的参数分别是:色调(H)、饱和度(S)、亮度(V)。

  色调——H:用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;

  饱和度——S:取值范围为0.0~1.0;

  亮度——V:取值范围为0.0(黑色)~1.0(白色)。

  HSV 对用户来说是一种直观的颜色模型。我们可以从一种纯色彩开始,即指定色彩角——H,并让 V=S=1,然后我们可以通过向其中加入黑色和白色来得到我们需要的颜色。增加黑色可以减小 V 而 S 不变,同样增加白色可以减小 S 而 V 不变。例如,要得到深蓝色,V=0.4、S=1、H=240度;要得到淡蓝色,V=1、S=0.4、H=240度。

  HSV 是对 RGB 色彩空间中点的两种有关系的表示,它们尝试描述比 RGB 更准确的感知颜色联系,并仍保持在计算上简单。其实,RGB 和 CMYK 颜色模型都是面向硬件的,而 HSV 颜色模型是面向用户的。

  艺术家有时偏好使用 HSV 而不选择 三原色光模式(即 RGB 模型——加法原色模型)或 印刷四分色模式(即 CMYK 模型——减法原色模型),因为它类似于人类感觉颜色的方式,具有较强的感知度,以人类更熟悉的方式封装了关于颜色的信息:“这是什么颜色?深浅如何?明暗如何?”。

  HSV 模型通常用于计算机图形应用中。在用户必须选择一个颜色应用于特定图形元素时,各种应用环境中经常使用 HSV 色轮。在其中,色相表示为圆环,可以使用一个独立的三角形来表示饱和度和明度。典型的,这个三角形的垂直轴指示饱和度,而水平轴表示明度。在这种方式下,选择颜色可以首先在圆环中选择色相,在从三角形中选择想要的饱和度和明度。



  HSV 模型的另一种可视方法是圆锥体。在这种表示中,色相被表示为绕圆锥中心轴的角度,饱和度被表示为从圆锥的横截面的圆心到这个点的距离,明度被表示为从圆锥的横截面的圆心到顶点的距离。某些表示使用了六棱锥体。这种方法更适合在一个单一物体中展示这个 HSV 色彩空间,但是由于它的三维本质,它不适合在二维计算机界面中选择颜色。



  HSV模型的三维表示从RGB立方体演化而来。设想从RGB沿立方体对角线的白色顶点向黑色顶点观察,就可以看到立方体的六边形外形。六边形边界表示色彩,水平轴表示纯度,明度沿垂直轴测量。



RGB转化到HSV的算法:

max = max(R, G, B);

min = min(R, G, B);

V = max(R, G, B);

S = (max - min)/max;

if R = max, H = (G-B)/(max-min)* 60;

if G = max, H = 120+(B-R)/(max-min)* 60;

if B = max, H = 240 +(R-G)/(max-min)* 60;

if H < 0, H = H + 360;

HSV转化到RGB的算法:

if s = 0

R=G=B=V;

else

H /= 60;

i = INTEGER(H);

f = H - i;

a = V * ( 1 - s );

b = V * ( 1 - s * f );

c = V * ( 1 - s * (1 - f ) );

switch(i)

case 0: R = V; G = c; B = a;

case 1: R = b; G = v; B = a;

case 2: R = a; G = v; B = c;

case 3: R = a; G = b; B = v;

case 4: R = c; G = a; B = v;

case 5: R = v; G = a; B = b;

YUV颜色空间

  YUV 是被欧洲电视系统所采用的一种颜色编码方法(属于PAL),是 PAL 和 SECAM 模拟彩色电视制式采用的颜色空间。YUV 主要用于优化彩色视频信号的传输,使其向后兼容老式黑白电视。与 RGB 视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB 要求三个独立的视频信号同时传输)。其中“Y”表示明亮度,也就是灰阶值,而“U”和“V” 表示的则是色度,作用是描述影像色彩及饱和度,用于指定像素的颜色。采用 YUV 色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用
YUV 空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。但在现今,YUV 通常已经在电脑系统上广泛使用。



图像中的Y、U和V的组成

OpenCV中与颜色模型相关的方法

函数 cvCvtColor 将输入图像从一个色彩空间转换为另外一个色彩空间。函数忽略 IplImage 头中定义的 colorModel 和 channelSeq 域,所以输入图像的色彩空间应该正确指定 (包括通道的顺序)。

void cvCvtColor(//色彩空间转换

  const CvArr* src,//输入的8-bit、16-bit或32-bit单倍精度浮点数影像

  CvArr* dst,//输出的8-bit、16-bit或32-bit单倍精度浮点数影像

  int code);//定义色彩空间转换模式

注意:

OpenCV 中的 HSV 模型各分量的范围

H : 0—180

S : 0—255

V : 0—255

向标准形式的转换:H*2、V/255、S/255
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: