创建图像包含三个元素:
1、图像的大小 2、图像的深度 3、图像的通道
例如:
cvCreateImage(cvSize(imgMono->width,imgMono->height), IPL_DEPTH_8U, 3)
1、图像的位深度及其取值范围:src.depth()
Mat类型:
矩阵数据类型:
– CV_<bit_depth>(S|U|F)C<number_of_channels>
S = 符号整型 U = 无符号整型 F = 浮点型
E.g.:
CV_8UC1 是指一个8位无符号整型单通道矩阵,
CV_32FC2是指一个32位浮点型双通道矩阵
CV_8UC1 CV_8SC1 CV_16U C1 CV_16SC1
CV_8UC2 CV_8SC2 CV_16UC2 CV_16SC2
CV_8UC3 CV_8SC3 CV_16UC3 CV_16SC3
CV_8UC4 CV_8SC4 CV_16UC4 CV_16SC4
CV_32SC1 CV_32FC1 CV_64FC1
CV_32SC2 CV_32FC2 CV_64FC2
CV_32SC3 CV_32FC3 CV_64FC3
CV_32SC4 CV_32FC4 CV_64FC4
depth 图像元素的位深度,可以是下面的其中之一:
IPLimage类型:
位深度 取值范围
IPL_DEPTH_8U - 无符号8位整型 0--255
IPL_DEPTH_8S - 有符号8位整型 -128--127
IPL_DEPTH_16U - 无符号16位整型 0--65535
IPL_DEPTH_16S - 有符号16位整型 -32768--32767
IPL_DEPTH_32S - 有符号32位整型 0--65535
IPL_DEPTH_32F - 单精度浮点数 0.0--1.0
IPL_DEPTH_64F - 双精度浮点数 0.0--1.0
位深度转换原理
如上,给出图像的位深度及其取值范围后,我们不难理解,要转换位深度本质上就是对原深度下的数据做线性变换,使原位深度下的最小值和最大值分别对应转换后位深度下的最小值和最大值。实现上述线性变换,我们可以用opencv库函数cvConvertScale。
cvConvertScale函数简介
查询百度百科后,可以的得到关于cvConvertScale函数的说明如下。
cvConvertScale( const CvArr* src, CvArr* dst,double scale CV_DEFAULT(1),double shift CV_DEFAULT(0) );
功能:使用线性变换转换数组
参数说明: src 输入数组,dst 输出数组,scale 比例因子,shift 偏移量。
对应的线性变换公式: dst(I)=src(I)*scale + (shift,shift,...)。
实例
比如将IPL_DEPTH_8U 转换成 IPL_DEPTH_32U,我们需要用线性变换将[0 255] 映射为 [0 1]。不难求出线性变换的参数scale=1/255, shift=0。即通过如下代码可实现位深度间转换(注,函数最后一个参数为0,等于默认参数,可以不用写)。
<span style="background-color: rgb(255, 255, 255);">cvConvertScale(pImg8, pImg32, 1.0/255, 0); </span>
类似的如果IPL_DEPTH_32U转换成IPL_DEPTH_8U,我们需要用线性变换将[0 255] 映射为 [0 1]。对应的参数为scale=255, shift=0。即可通过如下代码行实现两位深度间的转换。<span style="background-color: rgb(255, 255, 255);">cvConverScale(pImg32, pImg8, 255, 0);</span>
其余类型做法相似,不一一举例。
总结
要实现不同位深度间数据的转换,首先我们需要知道不同位深度对应数据的取值范围,然后计算出关于两取值范围上下限的线性变换,最后将图像数据和线性变换参数代入函数cvConvertScale()。、
2、图像的大小:Size()
size包含两个参数:就是图像的宽度和高
取图像的大小src.size()
Size (宽,高)
3、图像的通道:
1、比较通俗易懂的解释是:灰度图的通道数为1,彩色图的通道为3。基本上,描述一个像素点,如果是灰度,那么只需要一个数值来描述它,就是单通道。如果一个像素点,有RGB三种颜色来描述它,就是三通道。
2、4通道通常为RGBA,在某些处理中可能会用到。2通道图像不常见,通常在程序处理中会用到,如傅里叶变换,可能会用到,一个通道为实数,一个通道为虚数,主要是编程方便。还有一种情况就是16位图像,本来是3通道,但是为了减少数据量,压缩为16位,刚好两个通道,常见格式有RGB555或RGB565,也就是说R占5位,G占5或6位,B占5位,也有RGBA5551格式。古老的格式,不用也罢。
3、主要是有些摄像头常采用一些比较“古怪”的格式,没办法。补充一种情况,目前常见的一些摄像头喜欢采用YUV2等格式,格式如下YUYV,在处理的时候可以用4通道或者2通道来处理。如原格式为:Y1UY2V,插值成为Y1UV,Y2UV 就成两个彩色点了。YCrCb也有类似压缩情况。
描述一个像素点,如果是灰度,那么只需要一个数值来描述它,就是单通道。如果一个像素点,有RGB三种颜色来描述它,就是三通道
windows的bmp有时候是一个四通道图像,R、G、B加上一个A通道,表示透明度
经常用于设置矩阵方面
Mat image = Mat::zeros( window_height, window_width, CV_8UC3 );