C++ opencv 通道分离与合并

编程入门 行业动态 更新时间:2024-10-03 17:10:40

C++ opencv <a href=https://www.elefans.com/category/jswz/34/1769997.html style=通道分离与合并"/>

C++ opencv 通道分离与合并

1.RGB三通道的解释


彩色图像,是由RGB三个通道合并起来得到的。

如果R,G,B分离,它们就分别对应一个单通道图像(因为都是单通道,所以为灰度图像)
当然,这三个单通道图像再经过合并,就会恢复成原本的彩色图像了

下图中间的R,G,B图,并不是分离,而是3通道中其他两个通道置0了 。
这时,如果再通过BGR2GRAY转换色彩空间,就可以得到对应的单通道图像。

2.通道分离实现

API
分离通道要用到split
根据文档,我们有两种分离方式

split函数用于将一个多通道数组分离成几个单通道数组。

split函数的C++版本有两个原型,分别是:

void split(const Mat& src, Mat*mvbegin);
void split(InputArray m, OutputArrayOfArrays mv);
参数含义如下:

第一个参数:InputArray m(const Mat& src),填我们需要进行分离的多通道数组。

第二个参数:OutputArrayOfArrays mv,填函数的输出数组或者输出的vector容器。

 split函数分割多通道数组转换成独立的单通道数组,公式如下:

                                                                      

第一种方式

//函数定义
void channels_demo(Mat& image);//函数实现—
void QuickDemo::channels_demo(Mat& image) {Mat mvt[3];/*第一种方式通过创建图像数组,存储每个单通道图像*/split(image, mvt);imshow("蓝色单通道", mvt[0]);imshow("绿色单通道", mvt[1]);imshow("蓝色单通道", mvt[2]);
}

第二种方式

void QuickDemo::channels_demo(Mat& image) {std::vector<Mat> mvt;/*第二种方式通过创建动态数组,存储每个单通道图像*/split(image, mvt);imshow("蓝色单通道", mvt[0]);imshow("绿色单通道", mvt[1]);imshow("红色单通道", mvt[2]);
}


3.通道合并

合并通道要用到merge
根据文档,我们有两种合并方式

API

merge()函数是将多个数组合并成一个多通道的数组。将一些孤立的单通道数组合并成一个多通道数组,创建一个由多个单通道阵列组成的多通道阵列。

merge()函数的C++有两个版本:

void merge(const Mat& mv, size_tcount, OutputArray dst);
void merge(InputArrayOfArray mv, OutputArray dst);
参数说明:

第一个参数:const Mat& mv,填需要被合并的输入矩阵或vector容器的阵列,这个mv参数中所有的矩阵必须有着一样的尺寸和深度。

第二个参数:size_tcount,当mv为一个空白的C数组时,代表输入矩阵的个数,必须大于1。

第三个参数:dst,输出矩阵,和mv[0]拥有一样的尺寸和深度,并且通道的数量是矩阵阵列中的通道的总数。
 

第一种方式

void QuickDemo::channels_demo(Mat& image) {Mat mvt[3];split(image, mvt);imshow("蓝色单通道", mvt[0]);imshow("绿色单通道", mvt[1]);imshow("红色单通道", mvt[2]);Mat dst;merge(mvt,3,dst);/*这里的3指,共有3个单通道图像*/imshow("分离再合并",dst);}



第二种方式

void QuickDemo::channels_demo(Mat& image) {std::vector<Mat> mvt;split(image, mvt);imshow("蓝色单通道", mvt[0]);imshow("绿色单通道", mvt[1]);imshow("红色单通道", mvt[2]);Mat dst;merge(mvt, dst);imshow("分离再合并",dst);}

  也可以单独把一个通道关闭

  std::vector<Mat> mvt;Mat dst = Mat::zeros(srcImage.size(), srcImage.type());//养成习惯//imshow("windows", srcImage);split(srcImage, mvt);mvt[0]=0;merge(mvt,dst);imshow("com",dst);

4.通道混合

API

mixChannels

混合通道共6个参数第1个参数 输入第2个参数 输入的矩阵数第3个参数 输出第4个参数 输出的矩阵数第5个参数 从哪个通道 变成 哪个通道第6个参数 要变的对数



这里我们进行一个演示,实现如下通道的混合

0通道→2通道
1通道不变
2通道→1通道
这个混合的意思是,彩色图像本来是bgr的顺序,经过通道混合就变成了rgb。

0通道的单通道图像,变成了2通道的单通道图像
1通道不变
2通道的单通道图像,变成了0通道的单通道图像
 

实例代码

void QuickDemo::channels_demo(Mat& image) {Mat dst = Mat::zeros(image.size(), image.type());int from_to[] = { 0,2,1,1,2,0 };mixChannels(&image, 1, &dst, 1, from_to, 3);imshow("通道混合",dst);
}

更多推荐

C++ opencv 通道分离与合并

本文发布于:2024-02-28 13:58:56,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1769967.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:通道   opencv

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!