1 Opencv读取图像
(1)通常我都用cvLoadimage()函数进行读图像,参数选择上建议大家选择CV_LOAD_IMAGE_ANYDEPTH| CV_LOAD_IMAGE_ANYCOLOR,这样的参数组合读出的图像信息保持了原是图像的信息(包括通道信息和位深信息)。其中像素深度指每个通道用多少位来表示,通道就是指每个像素的颜色数了。而我们一般在图像处理书上看到的图像的像素的bit数,在这里应该是:通道*像素深度。可以看出像素的bit数和像素深度不是同一个概念。
(2)同时应该注意的是opencv在读遥感图像上所产生的问题:
通常的遥感图像有两种:
1)全色影像,只有1个波段,这种影像通常空间分辨率都很高;
2)多光谱图像,这种图像通常同时拥有超过3个以上的波段数。而在opencv中cvLoadimage()函数好像只能同时读取三个波段,当读取一景四个波段的遥感影像时(读取参数为CV_LOAD_IMAGE_ANYDEPTH|CV_LOAD_IMAGE_ANYCOLOR),事实上只读取了第一个波段的数据,这一点可以从读得的结果图像IplImage的nChannels和imageSize两个参数看出来,一个参数为1,一个参数的数据大约为整景图像大小的四分之一。而cvLoadimage函数读取参数为1时,此时又读取了四个波段中的前三个波段,大小显示大约为整景图像大小的四分之三。
(3)从以上分析来看,通道数和波段书本质上说的是一回事。只是所用的地方不一样。nChannel=1表示图像只有一个通道,表示灰度图像;对遥感影像来说就是一副单波段影像,通常也是灰度图像。
(4)总得来讲,多波段遥感图像仍然可以用opencv来进行处理分析,虽然他只可以同时读三个波段。因为遥感图像处理中我们通常只对一个波段进行处理,所以我们可以其他的软件进行波段分离后再拿到opencv进行编程处理,当然这不是最好的方法。
(5)上面所说的opencv只能读取最多三个波段的影像只限于利用cvLoadimage函数读取影像,其他方法可以实现读取多波段影像不考虑在本范围之内。
2 访问图像像素
(坐标是从0开始的,并且是相对图像原点的位置。图像原点或者是左上角(img->origin=IPL_ORIGIN_TL) 或者是左下角(img->origin=IPL_ORIGIN_BL) )
假设有8-bit1-通道的图像I (IplImage* img):
I(x,y)~ ((uchar*)(img->imageData + img->widthStep*y))[x]
假设有8-bit3-通道的图像I (IplImage* img):
I(x,y)blue~ ((uchar*)(img->imageData + img->widthStep*y))[x*3]
I(x,y)green ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3+1]
I(x,y)red ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3+2]
例如,给点(100,100) 的亮度增加30 ,那么可以这样做:
CvPointpt = {100,100};
((uchar*)(img->imageData + img->widthStep*pt.y))[pt.x*3] += 30;
((uchar*)(img->imageData + img->widthStep*pt.y))[pt.x*3+1] += 30;
((uchar*)(img->imageData + img->widthStep*pt.y))[pt.x*3+2] += 30;
或者更高效地:
CvPointpt = {100,100};
uchar* temp_ptr = &((uchar*)(img->imageData +img->widthStep*pt.y))[pt.x*3];
temp_ptr[0] += 30;
temp_ptr[1] += 30;
temp_ptr[2] += 30;
假设有32-bit 浮点数,1-通道 图像I(IplImage* img):
I(x,y)~ ((float*)(img->imageData + img->widthStep*y))[x]
现在,一般的情况下,假设有N-通道,类型为T 的图像:
I(x,y)c~ ((T*)(img->imageData + img->widthStep*y))[x*N + c]
你可以使用宏CV_IMAGE_ELEM(image_header, elemtype, y, x_Nc )
I(x,y)c~ CV_IMAGE_ELEM( img, T, y, x*N + c )
也有针对各种图像(包括4 通道图像)和矩阵的函数(cvGet2D,cvSet2D), 但是它们非常慢。
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通道,表示透明度。