主要讲解addWeighted函数,以及它对于相同和不同尺寸想的叠加,最后介绍了imwrite之图像的保存
addWeighted(InputArray src1,doublealpha,InputArray src2,double beta,
double gamma,OutputArray dst,int dtype=-1)
参数说明:
第一个参数:src1,表示进行加权操作的第一个图像对象,即输入图片1;
第二个参数:double型的alpha,表示第一个图像的加权系数,即图片1的融合比例;
第三个参数:src2,表示进行加权操作的第二个图像对象,即输入图片2;
第四个参数:double型的beta,表示第二个图像的加权系数,
即图片2的融合比例。很多情况下,有关系 alpha + beta = 1.0;
第五个参数:double型的gamma,表示一个作用到加权和后的图像上的标量,
可以理解为加权和后的图像的偏移量;
第六个参数:dst,表示两个图像加权和后的图像,
尺寸和图像类型与src1和src2相同,即输出图像;
第七个参数:输出阵列的可选深度,有默认值 - 1。当两个输入数组具有相同的深度时,
这个参数设置为 - 1(默认值),即等同于src1.depth()。
//计算两个数组的加权和 (dst =alpha*src1 + beta*src2 + gamma)
网上说addWeighted一般要求两个图片的尺寸相同,但是不同尺寸时也有解决办法
1.先读取三张图片
/********************图像混合*********************/
//载入,src1 src2尺寸相同,src3尺寸小
Mat src1 = imread("./image/girl.jpg");
Mat src2 = imread("./image/view3.jpg");
Mat src3 = imread("./image/logo.png");
//显示
namedWindow("src1");
imshow("src1", src1);
namedWindow("src2");
imshow("src2", src2);
namedWindow("src3");
imshow("src3", src3);
如下:
2. /*----------------------图片尺寸相同时-------------------*/
Mat dstImage;
//加载src1上
//要求两个图片尺寸一样
addWeighted(src1,0.5, src2, 0.5, 0, dstImage);
//显示
namedWindow("合成图1");
imshow("合成图1", dstImage);
效果:
3. /*----------------------图片尺寸不同时-------------------*/
//*********************解决办法1
Mat imageROI,newImage;
//在src1左上角20,20处,获取和src3尺寸一致的区域
imageROI= src1(Rect(20, 20, src3.cols, src3.rows));
addWeighted(src3,0.6, imageROI, 0.4, 0, imageROI);
//显示
namedWindow("合成图2");
imshow("合成图2", src1);
效果:
4. //********************解决办法2
//调整src3的大小与src2的大小一致,融合函数addWeighted()要求输入的两个图形尺寸必须相同
resize(src3,src3, Size(src2.cols,src2.rows));
//最后融合效果显示在newImage图像上
addWeighted(src2,0.5, src3, 0.5, 0., newImage);
//显示
namedWindow("合成图3");
imshow("合成图3", newImage);
效果:
5.最后还可以保存:
/********************图像的输出****************/
//输出一张图到工程目录下
imwrite("./image/合成图.jpg", src1);
cout << "保存完成" << endl;
cout << "按键退出" << endl;
waitKey(0);