多通道分离函数split()
功能:把一个多通道队列分离成几个单通道的队列。
如果你需要提取一个单通道或者做一些其他的复杂的通道排列组合,使用mixChannels。
函数原型1:
CV_EXPORTS void split(const Mat& src, Mat* mvbegin);
参数说明:
-
参数1 src 输入多通道数组
-
参数2 mvbegin 输出数组,数组的大小必须与src.channels()匹配,如果需要的话,数组自身重新分配。
参考: merge, mixChannels, cvtColor
函数原型2:
CV_EXPORTS_W void split(InputArray m, OutputArrayOfArrays mv);
参数说明:
-
参数1 m 输入多通道数组
-
参数2 mv 输出数组,如果需要的话,数组自身重新分配。
代码示例:
#include "pch.h"
#include <iostream>
#include <opencv2\opencv.hpp>
int main()
{
cv::Mat img;
img = cv::imread("F:/openCV/images/juice.jpg"); // 读取图像
if (img.empty()) // 判断是否读取成功
{
std::cout << "导入图像失败!";
std::cin.get(); // 读取错误时,为了能在控制台dos窗口看到输出的信息,而不是一闪而过
return -1;
}
else
{
std::cout << "导入图像成功!";
}
cv::Mat imgSplit[3];
cv::split(img, imgSplit);
cv::imshow("RGB-B通道像素值", imgSplit[0]); // B通道像素值
cv::imshow("RGB-G通道像素值", imgSplit[1]); // G通道像素值
cv::imshow("RGB-R通道像素值", imgSplit[2]); // R通道像素值
cv::waitKey(0); // 一直显示图像直到摁下任意键
}
运行结果如下图:
多通道合并函数merge()
功能:从几个单通道数组里合并成一个多通道的数组
函数 cv::merge合并几个数组到一个包含多通道的数组. 也就是说,每个输出数组的元素将会是输入数组元素的结合,其中的第i个输入数组的元素被当做mv[i].channels()元素的向量,合并后生成的新矩阵行数和列数与输入矩阵的相同。
函数cv::split 是做的相反的操作. 如果你需要使用其他先进的方式打乱通道,使用cv::mixChannels.
函数原型1
CV_EXPORTS void merge(const Mat* mv, size_t count, OutputArray dst);
参数说明
-
参数1 mv 将要合并的输入矩阵数组,mv里的所有矩阵必须大小和深度一致。
-
参数2 count ,当mv是一个空白的C数组时代表的是输入矩阵的个数;他的值必须大于零。
-
参数3 dst 和mv[0]一样大小和深度的输出数组;通道个数和参数个数相等。
@参考 mixChannels, split, Mat::reshape
函数原型2
CV_EXPORTS_W void merge(InputArrayOfArrays mv, OutputArray dst);
参数说明
-
参数1 mv 将要合并的输入矩阵数组,mv里的所有矩阵必须大小和深度一致。
-
参数12 dst 和mv[0]一样大小和深度的输出数组; 通道个数是矩阵数组里的通道数的总和.
代码示例
以下代码实现了把RGB图像分离后又合并,把HSV分离后又合并,把HSV中的H和RGB中的G、R合并。
#include "pch.h"
#include <iostream>
#include <opencv2\opencv.hpp>
int main()
{
cv::Mat img;
img = cv::imread("F:/openCV/images/juice.jpg"); // 读取图像
if (img.empty()) // 判断是否读取成功
{
std::cout << "导入图像失败!";
std::cin.get(); // 读取错误时,为了能在控制台dos窗口看到输出的信息,而不是一闪而过
return -1;
}
else
{
std::cout << "导入图像成功!";
}
cv::Mat imgSplit[3];
cv::Mat imgMerge;
cv::Mat imgMergeHsv;
cv::Mat hsv;
cv::Mat hsvSplit[3];
cv::Mat mergeHsvRgb[3];
cv::Mat mergeResult;;
cv::cvtColor(img, hsv, cv::COLOR_BGR2HSV);
cv::split(img, imgSplit);
cv::split(hsv, hsvSplit);
mergeHsvRgb[0] = hsvSplit[0];
mergeHsvRgb[1] = imgSplit[1];
mergeHsvRgb[2] = imgSplit[2];
cv::merge(imgSplit, 3, imgMerge);
cv::merge(hsvSplit, 3, imgMergeHsv);
cv::merge(mergeHsvRgb, 3, mergeResult);
cv::imshow("HSV", hsv); // hsv像素值
cv::imshow("Merge RGB", imgMerge); // RGB合并像素值
cv::imshow("Merge HSV", imgMergeHsv); // HSV合并像素值
cv::imshow("Merge HSV RGB", mergeResult); // HSV中的H和RGB中的G、R合并
cv::waitKey(0); // 一直显示图像直到摁下任意键
}
运行结果如下图: