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;
}
相关推荐
Slow菜鸟2 小时前
AI学习篇(三) | AI效率工具指南(2026年)
人工智能·学习
北京软秦科技有限公司3 小时前
AI审核如何助力合规取证?IACheck打造环境检测报告电子存证与法律风险防控新路径
大数据·人工智能
qq_359716233 小时前
openpi使用过程中相关问题
人工智能·深度学习·机器学习
minhuan3 小时前
医疗AI智能体:从数据到关怀人文设计:告别冰冷精准,构建有温度的诊疗交互.131
人工智能·ai智能体·智能体的人文设计·医疗ai人文设计·构建医疗ai智能体
Promise微笑4 小时前
驾驭AI引用:Geo优化中的内容评分机制与实战策略深度解析
人工智能
ai生成式引擎优化技术5 小时前
全球唯一四元结构底层架构问世:TSPR-WEB-LLM-HIC v2.0 终结大模型投毒与幻觉的终极技术范式
人工智能
听你说325 小时前
伊萨推出 ROBBI 360 协作机器人焊接工作站 简化自动化焊接部署流程
人工智能·机器人·自动化
weixin_408099675 小时前
【实战对比】在线 OCR 识别 vs OCR API 接口:从个人工具到系统集成该怎么选?
图像处理·人工智能·后端·ocr·api·图片文字识别·文字识别ocr
罗西的思考5 小时前
【OpenClaw】通过Nanobot源码学习架构---(2)外层控制逻辑
人工智能·机器学习