HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。HSV色系对用户来说是一种直观的颜色模型,对于颜色,人们直观的会问”什么颜色?深浅如何?明暗如何?“,而HSV色系则直观的表示了这些信息。
每一种颜色都是由
色相
(Hue,简H),
饱和度
(Saturation,简S)和色明度(Value,简V)所表示的。这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。
色调H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,取值范围为0°~360°。若从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;
饱和度S:取值范围为0.0~1.0;
亮度V:取值范围为0.0(黑色)~1.0(白色)。
HSV模型对应于
圆柱坐标系
中的一个圆锥形子集,圆锥的顶面对应于V=1。它包含RGB模型中的R=1,G=1,B=1 三个面,所代表的颜色较亮。色彩H由绕V轴的
旋转角
给定。红色对应于角度0° ,绿色对应于角度120°,蓝色对应于角度240°。在HSV颜色模型中,每一种颜色和它的补
色相
差180°。
饱和度
S取值从0到1,所以圆锥顶面的半径为1。
HSV颜色模型所代表的颜色域是CIE色度图的一个子集,这个模型中饱和度为百分之百的颜色,其
纯度
一般小于百分之百。在圆锥的顶点(即原点)处,V=0,H和S无定义,代表黑色。圆锥的顶面中心处S=0,V=1,H无定义,代表白色。从该点到原点代表亮度渐暗的灰色,即具有不同 灰度的灰色。对于这些点,S=0,H的值无定义。
可以说,HSV模型中的V轴对应于RGB
颜色空间
中的
主对角线
。 在圆锥顶面的
圆周
上的颜色,V=1,S=1,这种颜色是纯色。HSV模型对应于画家配色的方法。画家用改变色浓和 色深的方法从某种纯色获得不同色调的颜色,在一种纯色中加入白色以改变色浓,加入黑色以改变色深,同时加入不同比例的白色,黑色即可获得各种不同的色调。
[1]
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 = 0R=G=B=VelseH /= 60;i = INTEGER(H)f = H - ia = 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;
分离通道的算法
#include<iostream>#include "cv.h"#include "highgui.h"#include <ctype.h>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);c
#include<iostream>#include "cv.h"#include "highgui.h"#include <ctype.h>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);c