http://lib.csdn.net/article/opencv/33264
- 图像通道
1.一个图像的通道数是N,就表明每个像素点处有N个数,一个a×b的N通道图像,本质上是三维数组,N表示第三个维度的个数,其图像矩阵实际上是N行a*b的数字矩阵。
OpenCV中图像的通道可以是1、2、3和4。其中常见的是1通道和3通道,2通道和4通道不常见。
1通道的是灰度图。
3通道的是彩色图像,比如RGB图像。
4通道的图像是RGBA,是RGB加上一个A通道,也叫alpha通道,表示透明度。PNG图像(便携式网络图形(Portable Network Graphics))是一种典型的4通道图像。alpha通道可以赋值0到1,或者0到255,表示透明到不透明,但是一般直接imshow()是看不出什么效果来的
2通道的图像是RGB555和RGB565。2通道图在程序处理中会用到,如傅里叶变换,可能会用到,一个通道为实数,一个通道为虚数,主要是编程方便。RGB555是16位的,2个字节,5+6+5,第一字节的前5位是R,后三位+第二字节是G,第二字节后5位是B,可见对原图像进行压缩了。
2.OpenCV中用imshow( )来显示图像,只要Mat的数据矩阵符合图像的要求,就可以用imshow来显示,超过了4通道,就不是图像了,imshow( )也显示不了。
3.imshow( )显示单通道图像时一定是灰度图,如果我们想显示红色的R分量,还是应该按三通道图像显示,只不过G和B通道要赋值成0或255.
4.通道分解用split( ),通道合成用merg( ),这俩函数都是mixchannel( )的特例。
注意:其实任何一张彩图都是4通道图像,只是读不读的问题。
- Scalar
在C++和opencv编程的时候,自建一个图片矩阵的时候,会用到Scalar函数和CV_8UC1等数据类型,用法如下:
Scalar表示为图像的通道赋值,CV_8UC1表示8位无符号数1通道,CV_8UC3表示8位无符号数3通道,CV_8UC4表示8位无符号数4通道。通道数也就是声明数组‘大小’,是1维还是3维,CV_8UC2不常用
Scalar(x),一般用于灰度图像,数据格式为:CV_8UC1或者是CV_8U,但是如果将数据格式变成CV_8UC3,则一个参数的情况下默认为B分量,后面的GR默认为0
Scalar(x,y),数据格式为CV_8UC1时,忽略后面的y,数据格式变成CV_8UC3,默认为BG分量,后面的R默认为0
Scalar(x,y,z),一般用于彩色图像的显示
Scalar(x,y,z,m),一般用于带透明通道的图像显示
结论:CV_8UCn和Scalar中的参数个数m的关系,如果n>m,那么后面的通道值默认为0,如果n<m,那么只取calar中的参数中的前n个。
Mat Img_tmp(600, 500, CV_8UC4, Scalar(255,255,255,0));
表示自建一个大小为600*500的四通道白色不透明的图片
- split( )
C++: void split(const Mat& mtx, Mat* mv)
C++: void split(const Mat& mtx, vector<Mat>& mv)
参数:mtx 输入矩阵
mv 输出矩阵或矩阵数组
-
merge( )
C++: void merge(const Mat* mv, size_t count, OutputArray dst)
C++: void merge(const vector<Mat>& mv, OutputArray dst)
参数:mv 输入矩阵
count 当mv是C形式的array时,count表示输入矩阵个数
dst 输出矩阵