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;
}
相关推荐
mit6.8242 分钟前
微软如何交付企业级Agent
人工智能
Mininglamp_27183 分钟前
明略科技携手海康机器人亮相世界机器人大会,以“Agent+具身“联合进入商业机器人场景
人工智能·科技·机器人·开源·agent·ai agent
2401_894915538 分钟前
GEO 优化源码全解析:从搜索引擎到 AI 引擎的底层改写逻辑
java·服务器·前端·数据库·人工智能·分布式·搜索引擎
MobotStone2 小时前
从“听得懂”到“干得了”:工业大模型落地工厂的三层进化路线
人工智能
wangruofeng2 小时前
GLM-5.3-Flash 发布:追平 Opus 4.8 的智力,1/40 的价格,跑在国产芯片上
人工智能·aigc·chatglm (智谱)
皮皮虾❀4 小时前
钉钉AI服务商×教育行业:AI现代产业学院共建一体化实战——从“高校AI教学缺平台”到“校企共建AI产业学院培养数字化人才
人工智能·钉钉
火山引擎开发者社区5 小时前
【议程来了】火山引擎开发者社区技术日・NVIDIA 独家赞助-成都站
人工智能
三声三视5 小时前
从崩溃日志到 AI 技能:tri-god 蒸馏实战
人工智能·ai·aigc·agent
ZGIAI5 小时前
ZGI Workflow 并发控制:保护下游接口
人工智能·架构
richard_first5 小时前
Transformer 与大语言模型:第9章 LayerNorm 归一化层
人工智能·深度学习·机器学习·transformer