一. 使用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);//RGBcvNamedWindow("HSV", 0);//HSVcvShowImage("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);//RGBcvNamedWindow("HSV", 0);//HSVcvShowImage("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,通道数为1cvZero(image1);//清空image_data数据//颜色空间转换cvCvtColor(image, image1, CV_BGR2GRAY);//CV_BGR2GRAY//显示图像cvNamedWindow("RGB", 0);//RGBcvNamedWindow("灰度图", 0);//HSVcvShowImage("RGB", image);cvShowImage("灰度图", image1);cvWaitKey(0);//message