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 分钟前
Dify学习笔记 00 · 总览:56集四模块学习地图(从低代码平台到检索底座)
人工智能·计算机视觉·langchain
镜象科技3 分钟前
中小学AI心理健康解决方案服务商怎么选?2026年选型参考
android·java·人工智能
枫叶丹44 分钟前
语音 AI 怎样边听边答:实时对话系统的工作原理
开发语言·人工智能·chatgpt·开源·php·agent·codex
楚楚2519 分钟前
播客单声道怎么变立体声:先明确需求再选择处理方案
人工智能
田里的水稻13 分钟前
IL_部署推理---工具和语言
人工智能·神经网络·机器学习
俊男无期14 分钟前
【AI 和未来】工作(1)
人工智能
IT大白鼠15 分钟前
彭大帅的AI运维助手实战案例 5 · 新接手的服务器,先让 AI 摸底
运维·服务器·人工智能
江屿风19 分钟前
【Plain Language Large Model】【理清常见国内外大模型的定位和特长】流食般投喂
人工智能·gpt·claude·glm·gemini·千问·deepseek
MicrosoftReactor20 分钟前
技术速递|从 Jev 到你的笔记本电脑:使用 Mobius 在 ONNX 中构建“System One”决策模型
人工智能·ai·大模型·onnx
Duang007_22 分钟前
Claude Managed Agents 动态工作流:让 Lead Agent 自己写编排程序
人工智能·语言模型·自然语言处理