OpenCv之多通道的分离与合并

目录

一、多通道分离

[1.1 函数原型](#1.1 函数原型)

[1.2 参数说明](#1.2 参数说明)

二、多通道合并

[2.1. 函数原型](#2.1. 函数原型)

[2.2 参数说明](#2.2 参数说明)

三、通道分离合并代码举例

四、通道增强应用代码举例

五、基于HSV色彩空间举例

5.1增强饱和度颜色更鲜艳

5.2更改H通道替换色调


一、多通道分离

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;
}
相关推荐
李建军2 小时前
OpenClaw 国内版快速安装指南 (2026 更新)
人工智能
菩提树下的凡夫2 小时前
千问VL2.5大模型+Pyside6目标检测-连载6
人工智能·目标检测·计算机视觉
星幻元宇VR2 小时前
VR生产安全学习机|开启智慧安全培训新时代
人工智能·科技·学习·安全·vr
程序媛小鱼2 小时前
神经网络基础
人工智能·深度学习·神经网络
每日学点SEO2 小时前
如何判断网站质量低 & 遭受机器人流量攻击
运维·人工智能·深度学习·机器学习·搜索引擎
一次旅行2 小时前
本地部署Openclaw龙虾接入飞书PPT展示问题
人工智能·powerpoint·飞书
袋鼠云数栈2 小时前
构建金融级数据防线:数栈 DataAPI 的全生命周期管理实践
java·大数据·数据库·人工智能·api
扬大平仔2 小时前
我用AI写了一个AI助手
人工智能·arcgis
咚咚王者2 小时前
人工智能之语言领域 自然语言处理 第八章 关系抽取
人工智能·自然语言处理·easyui