补充:
上一个博客:我们主要介绍了如何使用addWeighted函数进行图像混合操作,以及如何将ROI和addWeighted函数结合起来,对指定区域进行图像混合操作。为了更好地观察一些图像材料的特征,需要对RGB三个颜色通道的分量进行分别显示和调整。
1、通道分离:split()函数
说明:split函数用于将一个多通道数组分离 成几个单通道数组。
split函数的C++版本有两个原型。分别是:
void split(const Mat& src,Mat*mvbegin); void split(InputArray m,OutArrayOfArrays mv); split(srcImage4, channels);
- 3
- 第一个参数:InputArray类型的m或者const Mat&类型的src,填写我们需要进行分离的多通道数组
- 第二个参数:OutArrayOfArrays 类型mv,填函数的输出数组或者输出的vector容器
split函数分割多通道数组转换成独立的单通道数组,公式如下:
mv[c](I)=src(I)c
示例展示:
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> using namespace cv; using namespace std; void main() { vector<Mat> channels; Mat imageBlueChannel; Mat imageGreenChannel; Mat imageRedChannel; Mat srcImage4 = imread("D:\\mogu.jpg"); imshow("【原始图】", srcImage4); //把一个3通道图像转换成3个单通道图像 split(srcImage4, channels); imageBlueChannel = channels.at(0); imageGreenChannel = channels.at(1); imageRedChannel = channels.at(2); //显示单通道图像 imshow("【BlueChannel】", imageBlueChannel); imshow("【GreenChannel】", imageGreenChannel); imshow("【RedChannel】", imageRedChannel); waitKey(0); }
原图
通道分离
2、通道合并:merge()函数
说明:merge()函数是split()函数的逆向操作—将多个数组合并成一个多通道的数组。它通过组合一些给定的单通道数组,将这些孤立的单通道数组合并成一个多通道的数组,从而创建出一个由多个单通道阵列组成的多通道阵列。
void merge(const Mat* mv,size_tcount,OutputArray dst); void merge(InputArrayOfArrays mv,OutputArray dst) merge(channels, mergeImage);
- 第一个参数:mv,需要合并的输入矩阵或vector容器的阵列,这个mv参数中所有的矩阵必须有着一样的尺寸和深度。
- 第二个参数:count。当mv为一个空白的C数组时,代表输入矩阵的个数,这个参数显然必须大于1.
- 第三个参数:dst,即输出矩阵,和mv[0]拥有一样的尺寸和深度,并且通道的数量是矩阵阵列中的通道的总数。
说明:下面的代码,先做相关的类型声明,然后把载入的3通道图像转换成3个单通道图像,放到vector类型的channels中,节奏进行引用赋值。其中,channels.at(0)表示引用取出chanels中的蓝色分量,channels.at(1)表示引用取出channels中的绿色分量,channels.at(2)表示引用取出channels中的红色分量。
vector<Mat> channels; Mat imageBlueChannel; Mat imageGreenChannel; srcImage4=imread("dota.jpg"); //把一个3通道图像转换成3个单通道图像 split(srcImage4,channels);//分离色彩通道 imageBlueChannel=channels.at(0); imageBlueChannel=channels.at(1); imageBlueChannel=channels.at(2); //对拆分的通道数据合并 Mat mergeImage; //定义合并的输出矩阵 merge(channels, mergeImage);