RGB颜色空间和HSV颜色空间以及RGB与Hsv间的相互转换

来源:互联网 发布:熊猫望远镜怎么样知乎 编辑:程序博客网 时间:2024/05/01 07:14
RGB颜色空间
RGB颜色空间使用RGB3个颜色通道可以表示任何的颜色、灰度级。
考虑到效率,RGB颜色空间表示中颜色是用24位来表示的,RGB每一个通道占8位,即每一个通道的值的取值范围是[0,255],例如:白色在RGB空间的表示是:R通道的值是255B通道的值是255G通道的值也是255。我们可以计算一下RGB颜色空间能表示的颜色种类有255*255*255=16581375种。
这种颜色表示的方法已经使用了很多年(例如电脑屏幕),所以在计算软件中,这个是标准的颜色格式。
然而在计算机视觉中,RGB并不是那么的稳定,因为这个颜色表示容易受到强光,弱光,阴影等因素的影响。相比之下,HSV空间面对这些光照的变化更稳定一些,能很好的反应颜色的本质。
RGB颜色空间 


HSV颜色空间
HSV3个字母分别代表Hue---Saturation---ValueHue表示的是颜色也称为色度,由于颜色很难被分离,Hue通常使用一个带有角度的圆形表示(存储时,是0.01.0的浮点数),如图所示。在圆上的不同角度,表示不同的颜色。

HSV空间的示意图:
HSV颜色空间 

由于是圆形的,所以也意味着1.00.0是表示同一种颜色。
Hue通道表示的是色度,即表示是什么颜色。在圆上的不同角度,表示不同的颜色。Hue取值0.0时表示的是红色,Hue120度时是表示绿色,在240度时是表示蓝色。Hue的取值是用其在角度除以360.
例如在120度时,Hue=120.0/36.0=0.3333
Saturation表示的是灰度,如图2所示Saturation在圆心处的取值是0,表示颜色很淡,沿着圆的半径方向,Saturation的值不断增大,表示颜色越来越浓。
Value通道表示的是颜色的亮度,如图2所示,在圆锥的低端Value表示的 是黑色,在顶端是白色。
Opencv中的HSV格式
在计算机视觉领域,Opencv是一个非常重要的开源工具,它能够在windowslinuxmaciPhone等多种平台上运行。
Opencv中,主要的颜色格式是RGB颜色,(实际上是BGRX格式,X是保留位,通常,为简单起见,就称为RGB颜色)。也包含了很多其他的颜色格式,例如HSVYUVLABXYZ等。但是,亲们,在OpencvHSV颜色格式,也许跟你想象的有点不一样哦。
OpencvRGB转换到HSV时,对Hue通道的存储是用一个字节(8位)来表示,其取值是0179。这就意味着,如果你用OpencvcvCvtColor函数进行颜色格式的转换,会损失颜色分辨率,因为实际上Opencv只用了7位来存储Hue通道的值(取值范围是0179)。由于这个原因,你使用的其他软件或者库,如果是基于HSV颜色值来进行图像处理的,那么,你就会碰到一些问题,因为,其他的软件或者库大多是用[0,255]来表示Hue通道。
例如:你正在写一个基于HSV颜色空间的皮肤检测程序,这是你需要找一个HSV颜色空间的阈值,如果你使用AdobePhotoshop等工具来读取肤色颜色,来决定你设定阈值,这时就会有点麻烦,这个HSV颜色就会与你Opencv程序中的颜色值不一样。
RGB颜色可以通过多种方式转换到HSV颜色,这就会导致同一种RGB颜色转到HSV颜色时会产生不同的结果。
观察OpencvHSV颜色空间
这里有一个互动程序,可以让你进一步的观察Opencv中使用cvCvtColor函数转换后的HSV颜色格式。它是与其他的一些图像编辑软件中的颜色空间不一样。
运行程序后,你在2D彩图上随便点击一个地方,就可以看到相应的HSV的颜色值,或者也可以通过滑动条来设定。
通过实验,可以发现,OpenCv中的H通道的值是0178,而不是0255,这样就降低了彩色分辨率,在此,提供了颜色转换程序,其H通道的值是0255的。

RGBHSV的转换程序
这个RGBHSV相互转换的程序比OpencvcvCvtColor的效果要好,因为H通道的取值范围是[0,255],这就提高了精度。这个函数会在内部内存空间,所以,在使用的时候,要记得释放相应的内存空间。


怎么使用这个程序呢?
(1)    正确的使用方法:
  1. IplImage *imHSV;
  2. imHSV = convertRGBtoHSV(imRGB);        // RGB转换到HSV颜色空间
  3. ......
  4. ......
  5. cvReleaseImage(&imHSV);                // 释放空间
  6. cvReleaseImage(&imRGB);                // 释放空间
复制代码
(2)    错误的使用方法:这会导致内存泄露
  1. IplImage *imHSV;
  2. imHSV = cvCreateImage(...);        // 创建HSV存放的空间 (错误的做法,因为在convertRGBtoHSV会给HSV分配空间).
复制代码
YIQRGB的转换
这里还提供了YIQ转到RGBRGB转换到YIQ的程序,YIQ格式在电视广播等领域中的应用非常的普遍。因为它的转换使用过一个一个线性矩阵相乘实现的。看起来比HSV更平滑(HSV是一个非线性的转换
原创粉丝点击