(一)、线性混合操作:使用addWeighted()
1、代码
#include<opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char *argv[]) {
Mat image, imagesrc1, imagesrc2;
imagesrc1 = cv::imread("../data/test1.jpg");//读取图像1
imagesrc2 = cv::imread("../data/test2.jpg");//读取图像2
//判断读入是否成功
if (!imagesrc1.data | !imagesrc2.data) {
std::cout << "打开图片失败,请检查路径!" << std::endl;
return 0;
}
//调整image2的大小与image1的大小一致,融合函数addWeighted()要求输入的两个图形尺寸相同
resize(imagesrc2, imagesrc2, Size(imagesrc1.cols, imagesrc1.rows));
addWeighted(imagesrc1, 0.3, imagesrc2, 0.7, 0, image);//0.5+0.5=1,0.3+0.7=1
imshow("效果图", image);
//建立显示窗口
namedWindow("效果图");
imwrite("../save/fuse.png", image);
waitKey();
return 0;
}
2、说明
1、先读取两张图;
2、调整image2的大小与image1的大小一致,融合函数addWeighted()要求输入的两个图形尺寸相同;
3、addWeighted(imagesrc1, 0.3, imagesrc2, 0.7, 0, image);这一行是给两张图片分别赋予权重,只要给的两个权重加起来等于1即可;
4、显示效果图;
5、写入处理之后的图片。
3、图片效果
(二)、使用roi和mask方式
1、代码
void GenerateRendering(Mat &srcImage, Mat &IC, Mat &IP, Mat &rending) {
Mat mask1, mask2, tmp;
IP.copyTo(mask1);
IC.copyTo(mask2);
//绿色通道分离出来
vector<Mat> channels;
Mat imageGreenChannel;//1
Mat imageRedChannel;//2
Mat greenmerge;
split(IP, channels);//分离色图像色彩通道,则三通道图像成为三个单通道图像
imageGreenChannel = channels.at(1);
channels[0] = Mat::zeros(Size(IP.rows, IP.cols), CV_8UC1);
channels[2] = Mat::zeros(Size(IP.rows, IP.cols), CV_8UC1);
merge(channels, greenmerge);
//再抠掉
greenmerge.copyTo(srcImage, mask1);
srcImage.copyTo(tmp);
//红色通道分离出来
vector<Mat> channels1;
Mat redmerge;
split(IC, channels1);//分离色图像色彩通道,则三通道图像成为三个单通道图像
imageRedChannel = channels1.at(2);
channels1[0] = Mat::zeros(Size(IP.rows, IP.cols), CV_8UC1);
channels1[1] = Mat::zeros(Size(IP.rows, IP.cols), CV_8UC1);
merge(channels1, redmerge);
//再抠掉IC将红色粘上去
redmerge.copyTo(tmp, mask2);
tmp.copyTo(rending);
}
2、说明
1、先读取3张图;
2、类似于抠图那种将图片加上去
重要的是这个函数: greenmerge.copyTo(srcImage, mask1);