使用Opencv将RGB颜色空间转换到HSV颜色空间/灰度图

一. 使用cvCvtColor函数将RGB颜色空间转换到HSV颜色空间

所需函数:

1.cvCvtColor

函数功能:颜色空间转换

函数原型:

void  cvCvtColor( const CvArr* src, CvArr* dst, int code );

参数介绍:

const CvArr* src:    输入图像
CvArr* dst:    输出图像(输出图像必须和输入图像的size,颜色位深度,通道一致)
        int code:    要转换的颜色空间,可取自宏:CV_BGR2GRAY表示转换为灰度图,CV_BGR2HSV将图片从RGB空间转换为HSV空间,其中当code选用CV_BGR2GRAY时,dst需要是单通道图片。当code选用CV_BGR2HSV时,对于8位图,需要将RGB值(RGB三色叠加)归一化到0-1之间。这样得到HSV图中的H范围才是0-360,S和V的范围是0-1。  

2.开始编写代码

开始编写代码之前需要准备一张用于实验的图像:

使用Opencv将RGB颜色空间转换到HSV颜色空间/灰度图_第1张图片

如有需要自行保存,JPG格式!

首先完成RGB到HSV颜色空间的转换功能,代码如下:

2.1 打开图像

//加载图像到内存
	IplImage *image = cvLoadImage("D:\\1.jpg");	//将图像加载到内存
	if (image == NULL){		//判断是否加载成功
		printf("图像文件打开失败");
	}

2.2 创建一张空白图像用于存储图像转换成HSV颜色空间后的图像

//创建一张空白图像用于存储转换成HSV颜色空间后的图像
	IplImage *image1 = cvCreateImage(cvSize(image->width, image->height), image->depth, image->nChannels);	//注意图像必须和输入图像的size,颜色位深度,通道一致
	cvZero(image1);	//清空image_data数据

2.3 颜色空间转换

//颜色空间转换
cvCvtColor(image, image1, CV_BGR2HSV);//CV_BGR2HSV

2.4 显示图像

//显示图像
cvNamedWindow("RGB", 0);	//RGB
cvNamedWindow("HSV", 0);	//HSV
cvShowImage("RGB", image);
cvShowImage("HSV", image1);
cvWaitKey(0);	//message

运行结果:

使用Opencv将RGB颜色空间转换到HSV颜色空间/灰度图_第2张图片

完整代码:

//加载图像到内存
	IplImage *image = cvLoadImage("D:\\1.jpg");	//将图像加载到内存
	if (image == NULL){		//判断是否加载成功
		printf("图像文件打开失败");
	}
	//创建一张空白图像用于存储转换成HSV颜色空间后的图像
	IplImage *image1 = cvCreateImage(cvSize(image->width, image->height), image->depth, image->nChannels);	//注意图像必须和输入图像的size,颜色位深度,通道一致
	cvZero(image1);	//清空image_data数据
	//颜色空间转换
	cvCvtColor(image, image1, CV_BGR2HSV);//CV_BGR2HSV
	//显示图像
	cvNamedWindow("RGB", 0);	//RGB
	cvNamedWindow("HSV", 0);	//HSV
	cvShowImage("RGB", image);
	cvShowImage("HSV", image1);
	cvWaitKey(0);	//message

cvCvtColor转换RGB到HSV使用的算法公式如下:

使用Opencv将RGB颜色空间转换到HSV颜色空间/灰度图_第3张图片

相关链接: RGB颜色空间、色调、饱和度、亮度、HSV颜色空间详解

二. 使用cvCvtColor函数将RGB颜色空间转换到灰度颜色空间

上面已经介绍过cvCvtColor函数所以直接开始编写代码

其实代码非常简单,我们可以复用上面的代码只需要简单的修改一下 cvCreateImage的最后两个参数cvCvtColor最后一个code参数

IplImage *image1 = cvCreateImage(cvSize(image->width, image->height), 8, 1);	//注意图像必须和输入图像的size,灰度图属于单通道所以颜色深度为8,通道数为1
cvCvtColor(image, image1, CV_BGR2GRAY);//CV_BGR2GRAY

运行结果:

使用Opencv将RGB颜色空间转换到HSV颜色空间/灰度图_第4张图片

完整代码:

	//加载图像到内存
	IplImage *image = cvLoadImage("D:\\1.jpg");	//将图像加载到内存
	if (image == NULL){		//判断是否加载成功
		printf("图像文件打开失败");
	}
	//创建一张空白图像用于存储转换成灰度颜色空间后的图像
	IplImage *image1 = cvCreateImage(cvSize(image->width, image->height), 8, 1);	//注意图像必须和输入图像的size,灰度图属于单通道所以颜色深度为8,通道数为1
	cvZero(image1);	//清空image_data数据
	//颜色空间转换
	cvCvtColor(image, image1, CV_BGR2GRAY);//CV_BGR2GRAY
	//显示图像
	cvNamedWindow("RGB", 0);	//RGB
	cvNamedWindow("灰度图", 0);	//HSV
	cvShowImage("RGB", image);
	cvShowImage("灰度图", image1);
	cvWaitKey(0);	//message

你可能感兴趣的:(Opencv图像处理)