【学习OpenCV4】图像通道的分离、合并与混合方法(C++)
一、图像通道的分离
1 | void split( |
输出的多通道序列一般使用 std::vector<Mat> mv;
来存储,mv[0]
、mv[1]
、mv[2]
、分别对应BGR三个通道。
示例代码:
1 | void MyDemo::channels_Demo(Mat& image) { |
二、通道的合并
但是现在显示的相当于是三张单通道的图像,也就相当于三张灰度图像。要想让三张图像恢复直观意义上的色彩,就需要使用下面通道合并的方法了。
通道的合并需要用到 merge()
函数。1
2
3
4void merge(
const vector<cv::Mat>& mv, // 输入的多通道序列(n个单通道序列)
cv::OutputArray dst // 输出图像,包含mv
);
根据 merge()
函数的定义,我们只需要控制输入的多通道数组 mv[]
中的三个值,就可以实现通道的合并。
示例代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22void MyDemo::channels_Demo(Mat& image) {
std::vector<Mat> mv;
split(image, mv);
Mat m1,m2,m3;
mv[1] = 0;
mv[2] = 0;
merge(mv, m1);
imshow("Blue Channel", m1);
split(image, mv);
mv[0] = 0;
mv[2] = 0;
merge(mv, m2);
imshow("Green Channel", m2);
split(image, mv);
mv[0] = 0;
mv[1] = 0;
merge(mv, m3);
imshow("Red Channel", m3);
}
我们已经知道如何将图像的三个通道提取出来了,因此我们可以将三个通道进行任意组合,合并出我们想要的图片。
三、通道的混合
通道的混合也是将三个通道进行任意排列1
C++: void mixChannels(const Mat*src, size_t nsrcs, Mat* dst, size_t ndsts, const int* fromTo, size_t npairs)
| 参数 | 作用 |
| ——— | ——————— |
| src | 输入矩阵 |
| nsrcs | 输入矩阵的个数 |
| dst | 输出矩阵 |
| ndsts | 输出矩阵的个数 |
| fromTo | 序号对向量 |
1 | void MyDemo::channels_Demo(Mat& image) { |