OpenCV中用于颜色空间转换的函数是cvtColor(),而convertTo()函数也经常会动到,这两个函数看起来有点像,所以这里顺便介绍一下二者的区别。 1、cvtColor() 它是OpenCV库中的函数,包含OpenCV头文件和命名空间后可直接引用,字面意思是颜色转换,功能是颜色类型转换。 函数原型如下:
C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 );. InputArray src: 输入图像,可以是Mat类; . OutputArray dst: 输出图像,可以是Mat类; . int code: 转换的代码或标识,即在此确定将什么制式的图片转换成什么制式的图片; . int dstCn = 0: 目标图像通道数,如果取值为0,表示目标图像取源图像的通道数。 code标识符列举如下图所示: 将相应的标识符赋值给code就可进行相应的转换了。例如将RGB图像转换成灰度图像,用法如下:
cvtColor(srcimg, dstimg, CV_BGR2GRAY,1);特别说明其转换公式为: RGB to Gray:Y=0.299R+0.587G+0.114*B;
需要注意的是:对于非线性转换,输入的RGB图像必须归一化到其对应的取值范围来或得最终正确的转换结果,例如从RGB->Luv转换。如果从一个8-bit类型图像不经过任何缩放直接转换为32-bit浮点型图像,函数将会以0-255的取值范围来取代0-1的取值范围,所以在使用cvtColor函数之前需要对图像进行缩放如下:
srcimg *= 1./255;cvtColor(srcimg, dstimg, CV_BGR2Luv);2、convertTo() 它是OpenCV中Mat类的成员函数,需要实例化出Mat对象才能调用,字面意思是“转换到”,功能是将Mat进行类型转换。 convertTo()有很多重载版本,一个常用函数原型如下:
void cv:Mat:convertTo(cvr:OutputArray m, int rtype, double alpha = (1.0), double beta = (0.0)) const第一个参数是输出Mat类对象,尺寸与调用改函数的Mat类对象一直; 第二个参数是输出Mat类对象的类型; 第三个参数表示缩放因子; 第四个参数表示偏移量。 输出Mat类对象的值将按如下公式计算: m(i,j)=src(i,j)*scale+shift;scale=1,shift=0表示无缩放,输出将等于输入。 所以前面将8位3通道RGB归一化也可使用如下代码实现:
srcimg.convertTo(dst,CV_32FC3,1.0/255,0);