Opencv笔记3:分离颜色通道&多通道图像混合

字数 329阅读 431

一、分离颜色通道
这个split函数的C++版本有两个原型,他们分别是:

C++: void split(const Mat& src, Mat*mvbegin);  
C++: void split(InputArray m,OutputArrayOfArrays mv);

关于变量介绍:
第一个参数,InputArray类型的m或者const Mat&类型的src,填我们需要进行分离的多通道数组。
第二个参数,OutputArrayOfArrays类型的mv,填函数的输出数组或者输出的vector容器。
split函数分割多通道数组转换成独立的单通道数组,按公式来看就是这样:

Paste_Image.png

最后看一个示例吧:

Mat srcImage;  
Mat imageROI;  
vector<Mat> channels;  
srcImage= cv::imread("dota.jpg");  
// 把一个3通道图像转换成3个单通道图像  
split(srcImage,channels);//分离色彩通道  
imageROI=channels.at(0);  
addWeighted(imageROI(Rect(385,250,logoImage.cols,logoImage.rows)),1.0,  
   logoImage,0.5,0.,imageROI(Rect(385,250,logoImage.cols,logoImage.rows)));  
merge(channels,srcImage4);  
namedWindow("sample");  
imshow("sample",srcImage);  

merge函数详解
merge()函数的功能是split()函数的逆向操作,将多个数组组合合并成一个多通道的数组

C++: void merge(const Mat* mv, size_tcount, OutputArray dst)  
C++: void merge(InputArrayOfArrays mv,OutputArray dst)  

第一个参数,mv,填需要被合并的输入矩阵或vector容器的阵列,这个mv参数中所有的矩阵必须有着一样的尺寸和深度。
第二个参数,count,当mv为一个空白的C数组时,代表输入矩阵的个数,这个参数显然必须大于1.
第三个参数,dst,即输出矩阵,和mv[0]拥有一样的尺寸和深度,并且通道的数量是矩阵阵列中的通道的总数。

来一个示例吧:

vector<Mat> channels;  
Mat imageBlueChannel;  
Mat imageGreenChannel;  
Mat imageRedChannel;  
srcImage4= imread("dota.jpg");  
// 把一个3通道图像转换成3个单通道图像  
split(srcImage4,channels);//分离色彩通道  
imageBlueChannel = channels.at(0);  
imageGreenChannel = channels.at(1);  
imageRedChannel = channels.at(2);  

推荐阅读更多精彩内容