一. 使用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.开始编写代码
开始编写代码之前需要准备一张用于实验的图像:
如有需要自行保存,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
运行结果:
完整代码:
//加载图像到内存
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使用的算法公式如下:
相关链接: 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
运行结果:
完整代码:
//加载图像到内存
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