opencv学习笔记:多通道分离与混合split()、merge()以及其他通道处理方法

一、作用

  在图像处理过程中需要对图像某一个通道进行单独处理时可以使用split()、merge()函数。

二、API介绍

2.1 split()函数
两种函数原型:

void split(const Mat& src, Mat* mvbegin);
void split(InputArray m, OutputArrayOfArrays mv);		(常用)
参数介绍:
参数1:填多通道数组
参数2:填函数的输出数组或者输出的vector容器。例如:  vector<Mat> mv;

功能说明:就是将载入的多通道图像,转换成多个单通道图像,存放到vector类型的mv中,接着进行引用赋值,其中对于彩色图 mv.at(0)就表示引用取出mv中的蓝色分量,mv.at(1)就表示引用取出mv中的绿色分量,mv.at(2)就表示引用取出mv中的红色分量,
或者也可以使用mv[0],mv[1],mv[2]的数组形式表示取出分量。

2.2 merge()函数
两种函数原型:

void merge(const Mat* mv, size_t count, OutputArray dst);
void merge(InputArrayOfArrays mv, OutputArray dst);		(常用)
参数介绍:
参数1:填需要被合并的输入矩阵或vector容器的数组,所以矩阵要有一样的大小和深度;
参数2:count 表示当输入矩阵有一个空白数组时,代表输入矩阵的个数,显然要大于1 ;
参数3:输出矩阵,和mv[0]有一样的大小和深度,通道数为总的通道数。

功能说明:将多个大小深度相同的单通道图像合并成一个多通道图像

2.3 mixChannels()函数
三种函数原型:

void mixChannels(const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts,
                            const int* fromTo, size_t npairs);	(常用)
void mixChannels(InputArrayOfArrays src, InputOutputArrayOfArrays dst,
                            const int* fromTo, size_t npairs);
void mixChannels(InputArrayOfArrays src, InputOutputArrayOfArrays dst,
                              const std::vector<int>& fromTo);

参数src: 输入矩阵,可以是一个或者多个,但所有矩阵必须有相同的大小和深度;
参数nsrcs: 输入矩阵的个数;
参数dst: 输出矩阵,可以为一个或者多个,但是所有的矩阵必须事先分配空间(如用create),大小、深度要和输入矩阵相同;
参数ndsts: 输出矩阵的个数;
参数formTo: 设置输入矩阵的通道对应输出矩阵的通道,规则如下:首先用数字标记输入矩阵的各个通道。输入矩阵个数可能多于一个并且每个矩阵的通道可能不一样,
第一个输入矩阵的 通道标记范围为:0 ~ src[0].channels()-1,
第二个输入矩阵的通道标记范围为:
src[0].channels() ~ src[0].channels()+src[1].channels()-1,以此类推;
其次输出矩阵也用同样的规则标记,
第一个输出矩阵的通道标记范围为:0 ~dst[0].channels()-1,
第二个输出矩阵的通道标记范围为:dst[0].channels()~dst[0].channels()+dst[1].channels()-1,以此类推;
最后,数组fromTo的第一个元素即fromTo[0]应该填入输入矩阵的某个通道标记,而fromTo的第二个元素即fromTo[1]应该填入输出矩阵的某个通道标记,这样函数就会把输入矩阵的fromTo[0]通道里面的数据复制给输出矩阵的fromTo[1]通道。fromTo后面的元素也是这个道理,总之就是一个输入矩阵的通道标记后面必须跟着个输出矩阵的通道标记
参数nparis: 表示参数fromTo中有几对通道关系。
功能说明: 就是把输入的矩阵(或数组)的某些通道拆分复制给对应的输出矩阵(或数组)的某些通道中,其中的对应关系就由fromTo参数制定。

程序:Mat bgra( 100, 100, CV_8UC4, Scalar(255,0,0,255) );
    Mat bgr( bgra.rows, bgra.cols, CV_8UC3 );
    Mat alpha( bgra.rows, bgra.cols, CV_8UC1 );
    Mat out[] = { bgr, alpha };
    // bgra[0] -> bgr[2], bgra[1] -> bgr[1],
    // bgra[2] -> bgr[0], bgra[3] -> alpha[0]
    int from_to[] = { 0,2, 1,1, 2,0, 3,3 };	//通道变换
    mixChannels( &bgra, 1, out, 2, from_to, 4 );

2.4 extractChannel()函数

void extractChannel(InputArray src, OutputArray dst, int coi);

参数src:输入数组
参数dst:输出数组
参数coi:提取通道索引位置   0 < = c o i < = s r c . c h a n n e l s ( ) − 1 0 <= coi <= src.channels()-1 0<=coi<=src.channels()1

功能说明: 在原图中提取某一个指定的单通道。

2.5 insertChannel()函数

void insertChannel(InputArray src, InputOutputArray dst, int coi);

参数src:输入数组
参数dst:输出数组
参数coi:插入通道索引位置   0 < = c o i < = s r c . c h a n n e l s ( ) − 1 0 <= coi <= src.channels()-1 0<=coi<=src.channels()1

功能说明: 将单通道原图插入dst中,覆盖了dst的当前通道。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值