HSV

转载:http://blog.csdn.net/futurewu/article/details/9767545

后期对视频亮度的处理需转化成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分割成三张图片,便于理解。
程序代码如下:
[cpp]  view plain copy
  1. <span style="font-size:14px;">#include<iostream>  
  2. #include "cv.h"  
  3. #include "highgui.h"  
  4. #include <ctype.h>  
  5. using namespace std;  
  6.   
  7. void main()  
  8. {  
  9.     IplImage *image,*hsv,*hue,*saturation,*value;//图像空间  
  10.     image=cvLoadImage("C:\\Users\\lufee\\Pictures\\cat.jpg");//打开图像源图像  
  11.   
  12.     hsv=cvCreateImage(cvGetSize(image),8,3);//给hsv色系的图像申请空间  
  13.     hue=cvCreateImage(cvGetSize(image),8,1);  //色调  
  14.     saturation=cvCreateImage(cvGetSize(image),8,1);//饱和度  
  15.     value=cvCreateImage(cvGetSize(image),8,1);//亮度  
  16.   
  17.     cvNamedWindow("image",CV_WINDOW_AUTOSIZE);//用于显示图像的窗口  
  18.     cvNamedWindow("hsv",CV_WINDOW_AUTOSIZE);  
  19.     cvNamedWindow("hue",CV_WINDOW_AUTOSIZE);  
  20.     cvNamedWindow("saturation",CV_WINDOW_AUTOSIZE);  
  21.     cvNamedWindow("value",CV_WINDOW_AUTOSIZE);  
  22.       
  23.     cvCvtColor(image,hsv,CV_BGR2HSV);//将RGB色系转为HSV色系  
  24.   
  25.     cvShowImage("image",image);  
  26.     cvShowImage("hsv",hsv);  
  27.   
  28.     cvSplit(hsv, hue, 0, 0, 0 );//分离三个通道  
  29.     cvSplit(hsv, 0, saturation, 0, 0 );  
  30.     cvSplit(hsv, 0, 0, value, 0 );  
  31.   
  32.     cvShowImage("hue",hue);  
  33.     cvShowImage("saturation",saturation);  
  34.     cvShowImage("value",value);  
  35.     cvWaitKey(0);  
  36.     cvDestroyWindow("image");  
  37.     cvDestroyWindow("hsv");  
  38.     cvDestroyWindow("hue");  
  39.     cvDestroyWindow("saturation");  
  40.     cvDestroyWindow("value");  
  41.     return;  
  42. }</span>  

结果如下
原图与转为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 )可以从多通道数组中分离提取一个通道。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值