目录
[1.1 函数原型](#1.1 函数原型)
[1.2 参数说明](#1.2 参数说明)
[2.1. 函数原型](#2.1. 函数原型)
[2.2 参数说明](#2.2 参数说明)
一、多通道分离
1.1 函数原型
void cv::split(InputArray m, OutputArrayOfArrays mv);
1.2 参数说明
m:待分离的多通道图像(如 3 通道 BGR 彩色图)。mv:分离后的输出,是一个std::vector<cv::Mat>,其中每个元素是单通道图像,顺序与原图像通道顺序一致(例如 BGR 图像分离后,mv[0]是 B 通道,mv[1]是 G 通道,mv[2]是 R 通道)。
二、多通道合并
2.1. 函数原型
void cv::merge(InputArrayOfArrays mv, OutputArray dst);
2.2 参数说明
mv:需要合并的图像向量vector<Mat>,所有输入图像必须尺寸相同、数据类型相同,通道数可以是 1 或多通道。dst:合并后的输出图像,通道数等于所有输入图像通道数的总和(例如 3 个单通道图像合并后得到 3 通道图像)。
三、通道分离合并代码举例
以下是将lean图进行通道分离后单独将蓝色通道与全0的GR通道合并,仅仅保留蓝色通道图片,借助ImageShow进行调试。
cpp
void testImageSplitAndMerge()
{
Mat image = imread(R"(D:\Study\OpenCvStudy\lean.jpg)", ImreadModes::IMREAD_COLOR);
Mat Images[3];
split(image, Images);
Mat imageB = Images[0];
Mat imageG = Images[1];
Mat imageR = Images[2];
Mat imageM;
merge(Images, 3,imageM);//第二个参数向量维度
//只显示蓝色通道
Mat zeros = Mat::zeros(Size(image.cols, image.rows),CV_8U);
//Size(w,h); w = col h = row
vector<Mat>imageV;
imageV.push_back(imageB);
imageV.push_back(zeros);
imageV.push_back(zeros);
Mat imageBm;
merge(imageV, imageBm);//第二个参数向量维度
waitKey();
}

四、通道增强应用代码举例
以下以lean图的为例进行红色通道单独增强使得lean图更红更鲜艳。
cpp
void testChannelEnforce()
{
// 1. 读取彩色图像(OpenCV默认BGR顺序)
Mat img = imread(R"(D:\Study\OpenCvStudy\lean.jpg)");
if (img.empty()) {
cout << "图像读取失败,请检查路径!" << endl;
return;
}
// 2. 分离BGR通道:split(多通道图像, 单通道向量)
vector<Mat> channels;
split(img, channels); // channels[0]=B, channels[1]=G, channels[2]=R
// 3. 增强红色通道(R):像素值乘以1.5(提亮),超过255则截断为255
// 注意:需用convertTo避免溢出,直接乘法可能导致数据溢出
Mat r_channel = channels[2].clone(); // 复制红色通道(避免修改原数据)
r_channel.convertTo(r_channel, CV_8U, 1.5, 0); // 1.5倍亮度,0偏移
// 4. 替换原红色通道
channels[2] = r_channel;
// 5. 合并通道:merge(单通道向量, 输出多通道图像)
Mat img_enhanced;
merge(channels, img_enhanced);
// 6. 显示结果
imshow("原始图像", img);
imshow("红色通道增强后", img_enhanced);
waitKey(0);
}

五、基于HSV色彩空间举例
BGR 是 "硬件导向" 的颜色空间(对应显示器三原色),三个通道高度耦合(调整一个通道会影响整体颜色);而 HSV 是 "视觉导向" 的空间,三个通道独立,调整更符合人类的视觉感受。基于 HSV 的通道融合,能实现 "只改饱和度不影响亮度""只替换色调不影响纯度" 等精细化操作,BGR调整单一 通道会影响亮度和色调等不符合人眼感受。
5.1增强饱和度颜色更鲜艳
cpp
int testHSVsplitMerage() {
// 1. 读取图像并转为HSV空间
Mat img_bgr = imread(R"(D:\Study\OpenCvStudy\lean.jpg)");
if (img_bgr.empty()) {
cout << "图像读取失败!" << endl;
return -1;
}
Mat img_hsv;
cvtColor(img_bgr, img_hsv, COLOR_BGR2HSV); // BGR转HSV是前提
// 2. 分离HSV通道:h_channels[0]=H, [1]=S, [2]=V
vector<Mat> hsv_channels;
split(img_hsv, hsv_channels);
// 3. 增强S通道(饱和度):乘以1.8倍,超过255则截断
Mat s_channel = hsv_channels[1].clone();
s_channel.convertTo(s_channel, CV_8U, 1.8, 0); // 线性增强,避免溢出
hsv_channels[1] = s_channel; // 替换原S通道
// 4. 合并HSV通道,转回BGR显示
Mat img_hsv_enhanced;
merge(hsv_channels, img_hsv_enhanced);
Mat img_result;
cvtColor(img_hsv_enhanced, img_result, COLOR_HSV2BGR); // HSV转回BGR
// 5. 显示对比
imshow("原始图像", img_bgr);
imshow("饱和度增强后", img_result);
waitKey(0);
destroyAllWindows();
return 0;
}

5.2更改H通道替换色调
将lean图中的 "红色" 替换为 "绿色"(只改 H 通道,保留 S/V)达到绿巨人的效果。
cpp
int testHSVsplitMerage2() {
Mat img_bgr = imread(R"(D:\Study\OpenCvStudy\lean.jpg)");
if (img_bgr.empty()) return -1;
// 1. BGR转HSV
Mat img_hsv;
cvtColor(img_bgr, img_hsv, COLOR_BGR2HSV);
// 2. 分离HSV通道
vector<Mat> hsv_channels;
split(img_hsv, hsv_channels);
Mat h_channel = hsv_channels[0].clone(); // H通道(0~179)
// 3. 替换H通道:红色(H≈0~10)→ 绿色(H≈60)
// 遍历每个像素,将红色调的H值改为60
for (int y = 0; y < h_channel.rows; y++) {
uchar* row = h_channel.ptr<uchar>(y);
for (int x = 0; x < h_channel.cols; x++) {
uchar h_val = row[x];
// 红色的H范围:0~10 或 170~179(OpenCV中H=0~179对应0°~360°)
if ((h_val >= 0 && h_val <= 10) || (h_val >= 170 && h_val <= 179)) {
row[x] = 60; // 改为绿色的H值
}
}
}
// 4. 替换并合并通道
hsv_channels[0] = h_channel;
Mat img_hsv_new;
merge(hsv_channels, img_hsv_new);
// 5. HSV转回BGR
Mat img_result;
cvtColor(img_hsv_new, img_result, COLOR_HSV2BGR);
// 6. 显示
imshow("原始红苹果", img_bgr);
imshow("替换为绿苹果", img_result);
waitKey(0);
destroyAllWindows();
return 0;
}
