无论是读入还是读出图像时,都要对图像的类型,位数,以及通道数进行相关的设置灰度图的通道数为1,彩色图的通道为3 一个像素点,如果是灰度,那么只需要一个数值来描述它,就是单通道。 如果一个像素点,有RGB三种颜色来描述它,就是三通道。(ollydbg23)
typedef struct _IplImage { int nSize; /* IplImage大小 */ int ID; /* 版本 (=0)*/ int nChannels; /* 大多数OPENCV函数支持1,2,3 或 4 个通道 */ int alphaChannel; /* 被OpenCV忽略 */ int depth; /* 像素的位深度: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U, IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F 可支持 */ char colorModel[4]; /* 被OpenCV忽略 */ char channelSeq[4]; /* 同上 */ int dataOrder; /* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道. cvCreateImage只能创建交叉存取图像 */ int origin; /* 0 - 顶—左结构, 1 - 底—左结构 (Windows bitmaps 风格) */ int align; /* 图像行排列 (4 or 8). OpenCV 忽略它,使用 widthStep 代替 */ int width; /* 图像宽像素数 */ int height; /* 图像高像素数*/ struct _IplROI *roi;/* 图像感兴趣区域. 当该值非空只对该区域进行处理 */ struct _IplImage *maskROI; /* 在 OpenCV中必须置NULL */ void *imageId; /* 同上*/ struct _IplTileInfo *tileInfo; /*同上*/ int imageSize; /* 图像数据大小(在交叉存取格式下imageSize=image->height*image->widthStep),单位字节*/ char *imageData; /* 指向排列的图像数据 */ int widthStep; /* 排列的图像行大小,以字节为单位 */ int BorderMode[4]; /* 边际结束模式, 被OpenCV忽略 */ int BorderConst[4]; /* 同上 */ char *imageDataOrigin; /* 指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的 */ } IplImage; depth是每个像素数值(pixel value)的类型 nChannels是图像通道数 灰度图二值图是单通道,rgb就是3个通道;一幅完整的图像,红色绿色蓝色三个通道缺一不可。即使图像中看起来没有蓝色,只能说蓝色光的亮度均为0或者各像素值的红色和绿色通道不全为0,但不能说没有蓝色通道存在。“存在、亮度为零”和“不存在”是两个不同的概念。一幅图像,如果关闭了红色通道,那么图像就偏青色。如果关闭了绿色通道,那么图像就偏洋红色。如果关闭了蓝色通道,那么图像就偏黄色。这个现象再次印证了反转色模型:红色对青色、绿色对洋红色、蓝色对黄色。如果察看单个通道,发现每个通道都显示为一幅灰度图像(不能说是黑白图像)。某个通道的灰度图像中的明暗对应该通道色的明暗,从而表达出该色光在整体图像上的分布情况。由于通道共有3个,所以也就有了3幅灰度图像。通道中的纯白,代表了该色光在此处为最高亮度,亮度级别是255。通道中的纯黑,代表了该色光在此处完全不发光,亮度级别是0。介于纯黑纯白之间的 灰度,代表了不同的发光程度,亮度级别介于1至254之间。灰度中越偏白的部分,表示色光亮度值越高,越偏黑的部分则表示亮度值越低。现在可以明白为何通道用 灰度表示了吧?因为通道中色光亮度从最低到最高的特性,正符合灰度模式那种从黑到白过渡的表示。正是因为 灰度的这种特性,使得它在以后还被应用到其它地方。通道中的 灰度,与颜色调板的灰度滑块是对应的。通道有什么用?通道不是拿来“用”的,我们在图像上做的所有事情,都可以理解为是色彩的变动,比如你画了一条黑色直线,就等同于直线的区域被修改成了黑色。而所有色彩的变动,其实都是间接在对通道中的灰度图进行调整。 还有一句题外话:
这就跟计算机的大小端起源一样,最先定义色彩空间的几个牛人互相不服,所以不同的软件习惯用不同的空间。比如,openCV和Gamegear都习惯用BGR,而大多数软件都用RGB opencv 哪个函数可将jpg图片转换为单通道灰度图 ?
iplImage* img=cvLoadImage("img.jpg",0); cvSaveImage("img,bmp"); |
以下是cvLoadImage的参数对应:
enum
{
/* 8bit, color or not */
CV_LOAD_IMAGE_UNCHANGED =-1,
/* 8bit, gray */
CV_LOAD_IMAGE_GRAYSCALE =0,
/* ?, color */
CV_LOAD_IMAGE_COLOR =1,
/* any depth, ? */
CV_LOAD_IMAGE_ANYDEPTH =2,
/* ?, any color */
CV_LOAD_IMAGE_ANYCOLOR =4
};
之前做的时候一直设置的是“0”,结果彩色图的通道数都是1
后来才发现问题出在这,以下为参考:
cvLoadImage( filename, -1 ); 默认读取图像的原通道数。
cvLoadImage( filename, 0 ); 强制转化读取图像为灰度图
cvLoadImage( filename, 1 ); 读取彩色图,默认读取方式。
还有一种4通道,通常为RGBA,windows的bmp有时候是一个四通道图像,R、G、B加上一个A通道,表示透明度。(eralvc)
最后这个,一般叫做alpha通道,表示透明度的。(ollydbg23)