同样学习自浅墨大神博客,代码与注释经自己习惯和编程风格做了些许修改,如希望亲自一睹大神风采,请猛搓下面链接:点击打开链接
本篇对应的大神博客篇目为:【OpenCV入门教程之五】 分离颜色通道&多通道图像混合
由于代码较为简单,可自行建立工程配置 OpenCV后加入下面的代码自行运行尝试,图片需要自己准备,如果希望得到完整工程,浅墨大神的博客教程中有放出对应工程的下载链接
包含头文件
#include <cv.h> #include <highgui.h> using namespace cv;
主体代码
//定义相关变量 Mat srcImage; Mat logoImage; vector<Mat> channels; Mat imageBlueChannel; //Mat imageGreenChannel; //Mat imageRedChannel; logoImage = imread("dota_logo.jpg", 0);//读入图片转为灰度图 srcImage = imread("dota_jugg.jpg"); if (!logoImage.data) { printf("Oh,no,读取logoImage错误~! "); return false; }//读取检测 if (!srcImage.data) { printf("Oh,no,读取srcImage错误~! "); return false; } split(srcImage, channels);//分离色图像色彩通道,则三通道图像成为三个单通道图像 imageBlueChannel = channels.at(0);//将原图的蓝色通道引用返回给imageBlueChannel。注意是引用,相当于两者等价,修改其中一个另一个跟着变 //imageGreenChannel = channels.at(1);//以此类推亦可得到其他两个通道 //imageRedChannel = channels.at(2); //将原图的蓝色通道的(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)));//其他两个通道亦是此理 merge(channels, srcImage);//将三个单通道重新合并成一个三通道 namedWindow("游戏原画+logo蓝色通道 by浅墨");//显示效果图 imshow("游戏原画+logo蓝色通道 by浅墨", srcImage); imwrite("游戏原画+logo蓝色通道 by浅墨.jpg", srcImage);//输出一张jpg图片到工程目录下 waitKey();//无限制的等待按键事件