关于opencv 图像融合addWeighted的使用方法

关于图像融合的线性方法即使用addweighted函数进行图像融合,其核心是ROI感兴趣区域的定义,ROI区域在opencv中就是矩形区域(RECT)

先创建Rect区域,再给予ROI一些基本性质,形成图像掩膜。

ROI即为目标图像中的你想要叠加图像的区域,其基本性质即该区域的位置和范围。

一丶创建ROI:

Mat roi;
roi = image(RECT(500, 250, logo.clos, logo.rows));//在这里相当于用指针的知识将roi区域指向为image图像相应区域
//500和250代表了ROI区域的左上角的坐标,后面为ROI区域范围

其实roi区域就相当于一个mat 对象的信息头储存的地址是roi区域的地址,详见后面的博客。


二丶构建ROI区域掩膜(图像叠加的基础)
Mat ROI = image(Rect(200, 250, logo.cols, logo.rows));
Mat mask = imread("logo.jpg", 0);//掩膜必须为叠加图片的灰度图
logo.copyTo(ROI, mask);


三丶两图片的线性混合

线性混合就是指两个图片或两段视频以某种函数关系叠加呈现。

                                                          

addWeighted原函数:

void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype = -1);

第一个参数:要叠加的第一个图像Mat

第二个参数:标识第一个参数叠加的权重

第三个参数:表示第二个叠加的图像,他需要和第一个数组拥有同样的尺寸和通道数

第四个参数:表示第二个叠加图像的权重

第五个参数:输出参数,需要和前两个图像拥有同样的通道数和尺寸

第六个参数:一个加到权重总和上的标量值(填0就好)

第七个参数:输出阵列的深度有默认值-1, 当两张叠加图片深度相同时,参数为-1

对应表达式为:dst = src1[i] * alpha + src2[i] * beta + gamma;//两张图片每个通道对应数值之和。

读取图像  
       Mat srcImage4= imread("dota_pa.jpg",1);  
       Mat logoImage= imread("dota_logo.jpg");  
   
       if(!srcImage4.data ) { printf("你妹,读取srcImage4错误~! \n"); return false; }  
       if(!logoImage.data ) { printf("你妹,读取logoImage错误~! \n"); return false; }  
   
       //【2】定义一个Mat类型并给其设定ROI区域  
       Mat imageROI;  
              //方法一  
       imageROI=srcImage4(Rect(200,250,logoImage.cols,logoImage.rows));  
       
       //【3】将logo加到原图上  ,利用线性混合构建掩膜,其中logo权重是0.3,原图中的ROI区域图像是0.5
       addWeighted(imageROI,0.5,logoImage,0.3,0.,imageROI);  
   
       //【4】显示结果  
       namedWindow("<4>区域线性图像混合示例窗口 by浅墨");  
       imshow("<4>区域线性图像混合示例窗口 by浅墨",srcImage4);  


你可能感兴趣的:(关于opencv 图像融合addWeighted的使用方法)