OpenCV--008:通道分离与合并

通道讲解

一个图像的通道数是N,就表明每个像素点处有N个数,一个a×b的N通道图像,其图像矩阵是b行(a×N)列的数字矩阵。

OpenCV中图像的通道可以是1,2,3,4。其中常见的是1通道和3通道。

  • 1通道是灰度图。

  • 2通道是RGB555和RGB565。2通道图在程序处理中会用到,如傅里叶变化。

    RGB555是16位的,2个字节:第一字节的前5位是R,后三位+第二字节前三位是G,第二字节后5位是B,可见对原图像进行压缩了。在这里插入图片描述

  • 3通道是彩色图像,比如RGB图像。

  • 4通道的图像是RGBA,是RGB加上一个A通道(也叫alpha通道),表示透明度。PNG图像是一种典型的4通道图像。alpha通道可以赋值0-1,或者0-255,表示透明–>不透明。


通道分离与合并

OpenCV中默认采用imread函数加载图像文件,加载进来的文件为三通道彩色图像,色彩空间是RGB色彩空间。通道顺序是BGR

  • imshow( )显示单通道图像时一定是灰度图,如果我们想显示红色的R分量,还是应该按三通道图像显示,只不过G和B通道要赋值成0或255。
  • OpenCV中用imshow( )来显示图像,只要Mat的数据矩阵符合图像的要求,就可以用imshow来显示。二通道不行,超过了4通道,就不是图像了,imshow( )也显示不了。
        Mat src1;
        src1=imread("D:/test/src1.jpg");
        Mat gray, rgba, rgb2bgr555, rgb2bgr565;
        int srcn = src1.channels();
    
    	cvtColor(src1, gray, COLOR_RGB2BGRA);
    	cvtColor(src1, rgba, COLOR_RGB2RGBA);
    	/*
    	==RGB转GRAY是根据一个心理学公式来的:Gray = R*0.299 +   G*0.587 + B*0.114
    	RGB转GRBA,默认A通道的数值是255,也就是不透明的
        */
        cvtColor(src1, rgb2bgr555, COLOR_RGB2BGR555);
    	cvtColor(src1, rgb2bgr565, COLOR_RGB2BGR565);
    
    	int grayn = gray.channels();
    	int rgban = rgba.channels();
    	int  rgb555n = rgb2bgr555.channels();
    	int rgb565n = rgb2bgr565.channels();
    	
    
    	cout << "src:" << srcn << endl;  //3
    	cout << "gray:" << grayn << "  rgba:" << rgban << endl;//   4  4
    	cout << " rgb2bgr555:" << rgb555n<< "  rgb2bgr565:" << rgb565n << endl;//   2  2
    
    	imshow("src1", src1);
    	imshow("gray", gray);
    	imshow("rgba", rgba);
    	//imshow("rgb2bgr555", rgb2bgr555);无法显示
    	//imshow("rgb2bgr666", rgb2bgr565);无法显示
    
    OpenCV--008:通道分离与合并_第1张图片

OpenCV为三通道的分离和合并提供了两个函数:

  1. 通道分离函数
    void split(const Mat& src, Mat* mvbegin);
    void split(InputArray m, OutputArrayOfArrays mv);
    第一个参数:原图像
    第二个参数:mvbegin,是一个Mat类型的一个数组,
               通常这个数组都是[3]的大小,这个数组大小表示的是通道个数,
               mvbegin就是指的将原图像按照(BGR)通道顺序逐一进行存储的单通道数组。
               通常可以用vector mvbegin的方式进行定义。
    
  2. 通道合并函数
    void merge(const Mat* mv, size_t count, OutputArray dst);
    void merge(InputArrayOfArrays mv, OutputArray dst)
    第一个参数:mv,单通道图像数组。
    第二个参数:size_tcoutn,当mv为一个空白的C数组时,代表输入矩阵的个数,参数要大于1;
    第三个参数:合并后的图像。
    
    

输出三个通道分别为0的图像:

    vector<Mat> mv;
	Mat dst1, dst2, dst3, dst4;
	
	//通道分离
	split(src1, mv);  //0:B    1:G     2:R
	//设置蓝色通道为0;---输出蓝色通道为0的图像
	mv[0] = Scalar(0);
	merge(mv, dst1);

	//通道分离
	split(src1, mv);  //0:B    1:G     2:R
	//设置绿通道为0;---输出绿色通道为0的图像
	mv[1] = Scalar(0);
	merge(mv, dst2);

	//通道分离
	split(src1, mv);  //0:B    1:G     2:R
	//设置红色通道为0;---输出红色通道为0的图像
	mv[2] = Scalar(0);
	merge(mv, dst3);

	imshow("dst1", dst1);
	imshow("dst2", dst2);
	imshow("dst3", dst3);

OpenCV--008:通道分离与合并_第2张图片

你可能感兴趣的:(#,OpenCV图像处理,OpenCV)