1 split
函数功能:
split()将多通道图像划分成B、G、R三通道。
参数解释:
void split(InputArray _m, OutputArrayOfArrays _mv)
_m: 多通道图像
_mv: 输出向量, 包含多通道的Mat
2 merge
函数功能:
merge()将多个单通道图像合成一个多通道图像。
参数解释:
void merge(InputArrayOfArrays _mv, OutputArray _dst)
_mv: 输入向量, 包含多通道的Mat
_dst: 输出的多通道图像
3 mixChannels
函数功能:
mixChannels()是opencv处理图像通道的一个函数,能够实现复杂的通道组合。
参数解释:
void cv::mixChannels( const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts, const int* fromTo, size_t npairs )
src: 输入矩阵或向量
nsrcs: 输入矩阵数量
dst: 输出矩阵或向量
ndsts: 输出矩阵数量
fromTo: 列表, 由被复制的通道位置与要复制到的通道位置组成的索引对
npairs: 索引对的数量(要处理的通道数)
4 代码示例
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
class QuickDemo
{
public:
void channels_demo(Mat &image);
};
void QuickDemo::channels_demo(Mat &image)
{
imshow("input image", image);
vector<Mat>mv;
// 通道分离
split(image, mv);
// 0、1、2三个通道分别代表BGR
imshow("blue", mv[0]);
imshow("green", mv[1]);
imshow("red", mv[2]);
Mat dst;
// 通道0、2的像素置零
mv[0] = 0;
mv[2] = 0;
// 通道混合
merge(mv, dst);
imshow("channel mix", dst);
// 通道交换,0->2,1->1,2->0
int from_to[] = {0, 2, 1, 1, 2, 0};
// param1: 输入矩阵或向量; param2: 输入矩阵数量; param3: 输出矩阵或向量; param4: 输出矩阵数量;
// param5: 由被复制的通道位置与要复制到的通道位置组成的索引对; param6: 索引对的数量(要处理的通道数)
mixChannels(&image, 1, &dst, 1, from_to, 3);
imshow("channel switch", dst);
}
int main()
{
Mat image = imread("D:\\c++_opencv\\images\\0--Parade_0_Parade_marchingband_1_20.jpg", IMREAD_ANYCOLOR);
if (image.empty())
{
printf("could not load image");
return -1;
}
QuickDemo qd;
qd.channels_demo(image);
waitKey(0);
destroyAllWindows();
return 0;
}
5 结果展示
![](https://img-blog.csdnimg.cn/img_convert/0869576d7ccc41368465940a89f362b7.png)
![](https://img-blog.csdnimg.cn/img_convert/506d0a1032a7400db31306a6cd2cbe5a.png)
![](https://img-blog.csdnimg.cn/img_convert/fbee6146cfa84378a03e026bb62d90ab.png)