本系列代码托管于:https://github.com/chintsan-code/opencv4-tutorials
本篇使用的项目为:channels_split_merge
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, const char** argv) {
Mat src = imread("../sample/lena512color.bmp");
if (src.empty()) {
cout << "could not load image..." << endl;
return -1;
}
imshow("src", src);
// split
vector<Mat> channels;
split(src, channels);
imshow("B", channels[0]); //单通道图像
imshow("G", channels[1]);
imshow("R", channels[2]);
// merge
Mat dst;
channels[0] = 0;
channels[1] = 0;
merge(channels, dst);
imshow("dst", dst); // 三通道,但是B、G通道都为0
//mixChannels
int from_to[] = { 0,2,1,1,2,0 }; // 第1个通道交换至第3个通道,第2个通道不交换,第3个通道交换至第1个通道
mixChannels(&src, 1, &dst, 1, from_to, 3);
imshow("mixchannels", dst);
waitKey(0);
destroyAllWindows();
return 0;
}
split:分离图像通道
void split(InputArray m, OutputArrayOfArrays mv);
- m:输入的多通道图像
- mv:输出的通道集合,可以使用
vector<Mat>
接住
merge:合并多个单通道图像为一个多通道图像
void merge(InputArrayOfArrays mv, OutputArray dst);
- mv:输入的通道集合,所有的通道必须具有相同的尺寸和深度(depth)
- dst:输出结果
split和merge不止可以用于拆分、合并多通道图像,也可以处理多通道Mat对象。
mixChannels:将输入图像的通道按指定规则复制到输出
void mixChannels(const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts, const int* fromTo, size_t npairs);
- src:输入图像集合,可以为多张图像,但必须有相同的尺寸和深度(depth)
- nsrcs:src的数量
- dst:输出图像集合,尺寸和深度和输入一致
- ndsts:dst的数量
- fromTo:复制的规则
- npairs:fromTo中有多少对规则
评论 (0)