OpenCV中RGB转HSV和HSV转RGB问题

通常理论上HSV模型的各分量的取值范围为:H分量0到360,S分量0到255,V分量0到255。但是在OpenCV中需要注意一些问题。

OpenCV中进行RGB和HSV颜色模型转换的函数是cvCvtColor(src,dst,xxx),下面给出OpenCV中的各种注意点。

(1)IplImage* src = cvLoadImage("lena.jpg",1);   

  IplImage* imghsv = cvCreateImage(cvGetSize(src),8,3);
  cvCvtColor(src ,imghsv,CV_BGR2HSV);//BGR转换成HSV模型

  默认以8位无符号形式载入,那么转换后的HSV各分量范围是H为0到180,S为0到1,V为0到255。(因为8位无符号型变量无法放下360的数据,这里opencv直接除以2)

(2)IplImage* src = cvLoadImage("lena.jpg",1);   

  IplImage* src_float = cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,3);

  IplImage* imghsv = cvCreateImage(cvGetSize(src),8,3);

  cvConvertScale(src,src_float,1.0,0);//将src图像从8位转换成32位float型变量

  cvCvtColor(src_float,imghsv,CV_BGR2HSV);//BGR转换成HSV模型
  都先转换成32为float型图像,然后在进行HSV模型转换,这样转换后的各分量范围是H为0到360,S为0到1,V为0到255。

(3)当进行HSV各分量显示的时候,可以通过cvSplit函数将各通道分离,然后通过cvConvertScale函数将各分量的范围都转化成0到255,在通过8位无符号型图像显示即可。因为cvShowImage函数只能显示8位无符号型图像,不能显示32位Float型图像。

(4)当进行HSV模型还原到RGB模型时,这里使用cvCvtColor函数就要注意,输入的HSV模型的图像必须将HSV各分量还原到默认的范围。这样cvCvtColor转换后的RGB图像才是正确的。


你可能感兴趣的:(OpenCV)