这篇博客简单探究一下HSV色系,先简单介绍HSV色系,然后用程序分割HSV色系的三个特性并演示,最后给出RGB色系到HSV色系转换的公式,以及OpenCV中函数介绍。(如果有错误欢迎纠正,也希望有人和我一起学习交流)
HSV(Hue,Saturation,Value)是根据颜色的直观特性由A.R.Smith在1978年创建的一种颜色空间,也称六角锥体模型(Hexcone Model)。HSV色系对用户来说是一种直观的颜色模型,对于颜色,人们直观的会问”什么颜色?深浅如何?明暗如何?“,而HSV色系则直观的表示了这些信息。在许多图像编辑工具中HSV色系应用也比较广泛,如photoshop等工具。
这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。
色调H:用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°。一旦颜色从一种颜色进入另一种颜色,人眼将立即发现它。色调是人眼对光主波长的认知;
饱和度S:表示颜色纯净的程度,取值范围为0.0~1.0;
亮度V:表示颜色的明暗程度,对于单色光,亮度表示了光线的强弱,对于物体,明度表示物体的反射或透射光线的能力,取值范围为0.0(黑色)~1.0(白色)。
RGB和CMY颜色模型都是面向硬件的,而HSV(Hue Saturation Value)颜色模型是面向用户的。
HSV模型的三维表示从RGB立方体演化而来。设想从RGB沿立方体对角线的白色顶点向黑色顶点观察,就可以看到立方体的六边形外形。六边形边界表示色彩,水平轴表示纯度,明度沿垂直轴测量。
#include
#include "cv.h"
#include "highgui.h"
#include
using namespace std;
void main()
{
IplImage *image,*hsv,*hue,*saturation,*value;//图像空间
image=cvLoadImage("C:\\Users\\lufee\\Pictures\\cat.jpg");//打开图像源图像
hsv=cvCreateImage(cvGetSize(image),8,3);//给hsv色系的图像申请空间
hue=cvCreateImage(cvGetSize(image),8,1); //色调
saturation=cvCreateImage(cvGetSize(image),8,1);//饱和度
value=cvCreateImage(cvGetSize(image),8,1);//亮度
cvNamedWindow("image",CV_WINDOW_AUTOSIZE);//用于显示图像的窗口
cvNamedWindow("hsv",CV_WINDOW_AUTOSIZE);
cvNamedWindow("hue",CV_WINDOW_AUTOSIZE);
cvNamedWindow("saturation",CV_WINDOW_AUTOSIZE);
cvNamedWindow("value",CV_WINDOW_AUTOSIZE);
cvCvtColor(image,hsv,CV_BGR2HSV);//将RGB色系转为HSV色系
cvShowImage("image",image);
cvShowImage("hsv",hsv);
cvSplit(hsv, hue, 0, 0, 0 );//分离三个通道
cvSplit(hsv, 0, saturation, 0, 0 );
cvSplit(hsv, 0, 0, value, 0 );
cvShowImage("hue",hue);
cvShowImage("saturation",saturation);
cvShowImage("value",value);
cvWaitKey(0);
cvDestroyWindow("image");
cvDestroyWindow("hsv");
cvDestroyWindow("hue");
cvDestroyWindow("saturation");
cvDestroyWindow("value");
return;
}
下面是是RGB色系转换为HSV色系的算法(参考http://zhidao.baidu.com/question/6436440.html):
RGB转化到HSV的算法:
max=max(R,G,B)
min=min(R,G,B)
if R = max, H = (G-B)/(max-min)
if G = max, H = 2 + (B-R)/(max-min)
if B = max, H = 4 + (R-G)/(max-min)
H = H * 60
if H < 0, H = H + 360
V=max(R,G,B)
S=(max-min)/max
OpenCV中:
cvCvtColor( const CvArr* src, CvArr* dst, int code )函数即可将RGB色系转换为HSV色系(其中转化为HSV色系时code的值为 CV_BGR2HSV),src为要转化的原图像,dst为转化后存放的图像空间。
cvSplit( const CvArr* src, CvArr* dst0, CvArr* dst1,CvArr* dst2, CvArr* dst3 )可以从多通道数组中分离提取一个通道。
参考资料:http://baike.baidu.com/view/541362.htm
OpenCV中文chm文档