学了好几天了,突然在图像分离颜色通道这里遇到了个大门槛,这里总结一下自己的经验。
首先推荐一下浅墨大神的博客http://blog.youkuaiyun.com/poem_qianmo/article/details/21176257
关键代码我是从他这里考出来的,没有知道,只能读它的源代码,但当我运行的时候就蒙了,乱七八糟的报错,最后跟踪是在split函数这里出错了,代码完全一样,但是就是过不去
- Mat srcImage;
- Mat logoImage;
- vector<Mat>channels;
- Mat imageBlueChannel;
- logoImage=imread("dota_logo.jpg",0);
- srcImage=imread("dota_jugg.jpg");
- if(!logoImage.data ) { printf("Oh,no,读取logoImage错误~!\n"); return false; }
- if(!srcImage.data ) { printf("Oh,no,读取srcImage错误~!\n"); return false; }
- split(srcImage,channels);//就是这里,怎么都过不去
- imageBlueChannel=channels.at(0);
- addWeighted(imageBlueChannel(Rect(500,250,logoImage.cols,logoImage.rows)),1.0,
- logoImage,0.5,0,imageBlueChannel(Rect(500,250,logoImage.cols,logoImage.rows)));
- merge(channels,srcImage);
- namedWindow("<1>游戏原画+logo蓝色通道 by浅墨");
- 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的某个通道色彩改变了,图像三个通道合成后就呈现了除了我们想要的效果。