图像的depth与nChannels

无论是读入还是读出图像时,都要对图像的类型,位数,以及通道数进行相关的设置

灰度图的通道数为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中为什么图像局矩阵是以BGR而不是RGB显示像素的大小?

这就跟计算机的大小端起源一样,最先定义色彩空间的几个牛人互相不服,所以不同的软件习惯用不同的空间。比如,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)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值