OpenCV中RGB和HSV转换的问题

时间:2024-02-01 08:02:16

1、一般情况下HSV模型各分量的取值范围为:H为0到360°,S为0到100%,V为0到255。但是在OpenCV中在由RGB转换到HSV的过程中,发现HSV中H为0到180°,S为0到255,V为0到255。代码如下:

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

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

cvCvtColor(src ,imghsv,CV_BGR2HSV);//BGR转换成HSV模型

2、上述图片保存的过程中,图像以8位3通道的形式保存,每个颜色分量占用8位,值的范围为0到255,所以OpenCV将H值的范围缩小了一半,变为0到180°。可以调用cvConverScale将图像从8位转换为32位float型。这样HSV的范围就是:H为0到360°,S为0到100%,V为0到255。测试代码如下:

Mat mat1 = cv::imread("1.png");
CvScalar s1;
CvScalar s2;
CvScalar s3;
IplImage image1 = mat1;
int width = mat1.rows;
int height = mat1.cols;

Mat mat2 = mat1.clone();
IplImage image2 = mat2;

cvCvtColor(&image1,&image2,CV_BGR2HSV); 

IplImage* image3 = cvCreateImage(cvGetSize(&image1),IPL_DEPTH_32F,3);
cvConvertScale(&image1,image3,1.0,0);	//将src图像从8位转换成32位float型变量

IplImage* imghsv = cvCreateImage(mat1.size(),IPL_DEPTH_32F,3);
cvCvtColor(image3,imghsv,CV_BGR2HSV);//BGR转换成HSV模型

for(int i=0; i<width; i++)
{
	for(int j=0; j<height; j++)
	{
		s1 = cvGet2D(&image1, i, j);
		s2 = cvGet2D(&image2, i, j);
	        s3 = cvGet2D(imghsv, i, j);
	}
}

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

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

参考:

http://blog.csdn.net/harryching/article/details/20486003