OpenCV 图像分离颜色通道 split函数和mege函数的运用

本文通过解决图像处理中颜色通道分离的问题,详细介绍了如何使用OpenCV进行图像的颜色通道分离与融合,包括解决过程中遇到的难点及修改代码的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学了好几天了,突然在图像分离颜色通道这里遇到了个大门槛,这里总结一下自己的经验。

首先推荐一下浅墨大神的博客http://blog.youkuaiyun.com/poem_qianmo/article/details/21176257

关键代码我是从他这里考出来的,没有知道,只能读它的源代码,但当我运行的时候就蒙了,乱七八糟的报错,最后跟踪是在split函数这里出错了,代码完全一样,但是就是过不去

  1.        Mat srcImage;  
  2.        Mat logoImage;  
  3.        vector<Mat>channels;  
  4.        Mat  imageBlueChannel;  
  5.        logoImage=imread("dota_logo.jpg",0);  
  6.        srcImage=imread("dota_jugg.jpg");  
  7.    
  8.        if(!logoImage.data ) { printf("Oh,no,读取logoImage错误~!\n"); return false; }  
  9.        if(!srcImage.data ) { printf("Oh,no,读取srcImage错误~!\n"); return false; }  
  10.        split(srcImage,channels);//就是这里,怎么都过不去
  11.        imageBlueChannel=channels.at(0);  
  12.        addWeighted(imageBlueChannel(Rect(500,250,logoImage.cols,logoImage.rows)),1.0,  
  13.               logoImage,0.5,0,imageBlueChannel(Rect(500,250,logoImage.cols,logoImage.rows)));  
  14.        merge(channels,srcImage);  
  15.        namedWindow("<1>游戏原画+logo蓝色通道 by浅墨");  
  16.        imshow("<1>游戏原画+logo蓝色通道 by浅墨",srcImage);  

后来发现我的vector 这个向量在这里不能用,于是我就将vector换成了May channels[4],成功了,(修改过程经过反复捉摸啊)

	//【0】定义相关变量  
	Mat srcImage;
	Mat logoImage;
	Mat channels[4];
	Mat  imageBlueChannel;

	//=================【蓝色通道部分】=================  
	//     描述:多通道混合-蓝色分量部分  
	//============================================  

	//【1】读入图片  
	logoImage = imread("dota_logo.jpg", 0);
	srcImage = imread("dota.jpg");

	if (!logoImage.data) { printf("Oh,no,读取logoImage错误~!\n"); return; }
	if (!srcImage.data) { printf("Oh,no,读取srcImage错误~!\n"); return; }

	//【2】把一个3通道图像转换成3个单通道图像  
	split(srcImage, channels);//分离色彩通道  

	//【3】将原图的蓝色通道引用返回给imageBlueChannel,注意是引用,相当于两者等价,修改其中一个另一个跟着变  
	imageBlueChannel = channels[1];
	//【4】将原图的蓝色通道的(500,250)坐标处右下方的一块区域和logo图进行加权操作,将得到的混合结果存到imageBlueChannel中  
	addWeighted(imageBlueChannel(Rect(500, 250, logoImage.cols, logoImage.rows)), 1.0,
		logoImage, 0.5, 0, imageBlueChannel(Rect(500, 250, logoImage.cols, logoImage.rows)));

	//【5】将三个单通道重新合并成一个三通道
	merge(channels, 3, srcImage);

	//【6】显示效果图  
	namedWindow("<1>游戏原画+logo蓝色通道 by浅墨");
	imshow("<1>游戏原画+logo蓝色通道 by浅墨", srcImage);
	waitKey(10000);

修改完代码,最这些代码的理解也深入了许多,开始不明白,既然要分logo的通道,那为什么要split函数里面要写srcImage这个图像矩阵那,后来发现图像一旦分解为三个通道,那三个图像就都变成了灰色,并不能看出测彩的变化,浅墨这么做分解了背景图片的三个通道,然后用单通道的方式,读取了logo图片,最后将logo图片合成到srcImage图片上,有余srcImage的某个通道色彩改变了,图像三个通道合成后就呈现了除了我们想要的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值