HSV空间各通道分离实验——直观了解各通道数值的意义

来源:互联网 发布:淘宝如何查看消费总额 编辑:程序博客网 时间:2024/05/30 22:43

HSV(Hue,Saturation,Value)是根据颜色的直观特性由A.R.Smith在1978年创建的一种颜色空间,也称六角锥体模型(Hexcone Model)。HSV色彩空间如下所示:


HSV代表的参数分别为:色调(H),饱和度(S),亮度(V)。
色调H:用角度度量,取值范围为0°~360,红、绿、蓝分别相隔120度。互补色分别相差180度,对应上图的角度。人类对色彩的感知中,最显著的、最重要的一方面确实可以说是色相;
饱和度S:表示颜色纯净的程度,取值范围为0.0~1.0,S=0时,只有灰度,对应上图的半径大小;
亮度V:表示颜色的明暗程度,取值范围为0.0(黑色)~1.0(白色)。对应上图的纵轴。

RGB和CMY颜色模型都是面向硬件的,而HSV(Hue Saturation Value)颜色模型是面向用户的。

为了便于理解,我们将下图进行HSV空间各通道分离,并分别作图显示。


HSV空间各通道分离与现实的实现代码如下

int main(int argc, char** argv) {////////////显示图像Mat image;    image = imread("4.jpg");//导入图像Mat hsvimage,hue;imshow("image", image);cvtColor(image, hsvimage, CV_BGR2HSV); //RGB到HSV颜色空间的转换imshow("HSV", hsvimage); //直接把HSV规格的图像以RGB格式显示。显示出来的图像会与原图不同  vector<Mat> hsv;      split(hsvimage,hsv);//将HSV三个通道分离        Mat tmp(image.size(),CV_8U,Scalar(0));//生成与原图一样尺寸的全0的Mat。其中CV_8U表示每个点8bit,无符号。即范围[0~255]        vector<Mat> h,s,v;          for(int i=0;i<3;i++)        {                if(i==0)//把H值赋给h的B,涂上蓝色                        h.push_back(hsv[0]);                else                        h.push_back(tmp);                if(i==1)//把S值赋给s的G,涂上绿色                        s.push_back(hsv[1]);                else                        s.push_back(tmp);                if(i==2)//把V值赋给v的R,涂上红色                        v.push_back(hsv[2]);                else                        v.push_back(tmp);        }//分别显示:        merge(h,hue);imshow("H", hue);merge(s,hue);imshow("S", hue); merge(v,hue);imshow("V", hue); while(1)  {      char c=cvWaitKey(33);      if(c==27)break;//等待按键ESC  }}

分解结果如下:

可以发现,直接把HSV规格的图像以RGB格式显示。显示出来的图像会与原图不同;H从最左到右递减,对应着不同的色调;S值在下半平面为最大值,在上半平面渐变;V值上半平面为最大值,下半平面渐变。反观原图可以观查到其中的对应关系。观查上半平面可以发现,S值越小颜色越淡,为0的时候变成白色。观查下半平面可以发现V值越小,颜色越暗,最后趋向于黑色。

1 0