学习Opencv笔记(二)————hsv色系

        这篇博客简单探究一下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沿立方体对角线的白色顶点向黑色顶点观察,就可以看到立方体的六边形外形。六边形边界表示色彩,水平轴表示纯度,明度沿垂直轴测量。


为了能够直观的了解HSV色系中H、S、V,下面的程序将几张jpg图像的色调H、饱和度S、亮度V分割成三张图片,便于理解。
程序代码如下:
#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;
}

结果如下
原图与转为HSV色系后的图片(不知道为什么转为HSV色系后图像会变。。。)


分离HSV色系的三通道图片:



下面是是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文档


你可能感兴趣的:(OpenCV)