OpenCV_Tutorials——CORE MODULE.THE CORE FUNCTIONALITY——Adding (blending) two images using OpenCV

目标

在教程中你会学到:

      1、什么事线性混合,它有什么用。

      2、如何使用addWeighted将两个图像相加

理论


注意:下面的解释来自Richard Szeliski写的《Computer Vision:Algorithms and Application》。


 

 

在前面的教程中,我们已经学习了一些像素的运算。一个有意思的二元(两个输入)运算符就是线性混合运算符:

                  

通过α从0到1变化这个运算符可以被用做两个图像或者录像之间的时间交融(cross-dissolve,这里tutorial里面用的是cross-disolve 可能错误),就像是幻灯片中或者电影制作中的效果。

代码

      一般来说,在不算长的理论解释之后,让我们来看一下代码。

 

#include<cv.h>
#include<highgui.h>
#include<iostream>
using namespace cv;

int main(int argc.char**argv)
{
double alpha=0.5;
double beta;
double input;
Mat src1,src2,dst;

std::cout<<"Simple Linear Blender"<<std::endl;
std::cout<<"--------------------------"<<std::endl;
std::cout<<"*Enter alpha [0-1]:";
std::cin>>input;
if(input>=0.0&&input<=1.0)
{
alpha=input;
}
src1=imread("../../images/LinuxLogo.jpg");
src2=imread("../../images/WindowsLogo.jpg");
if(!src1.data)
{
printf("Error loading src1\n");
return -1;
}
if(!src2.data)
{
printf("Error loading src2\n");
return -1;
}
nameWindow("Linear Blend",1);
beta=(1.0-alpha);
addWeighted(src1,alpha,src2,beta,0.0,dst);
imshwo("Linear Blend",dst);
waitKey(0);
return 0;
}

 

解释

    1、因为我们要执行:

 

     我们需要两个源图像(f0(x)和f1(x)),因此我们使用一般的方法进行载入:

     

src1=imread("../../images/LinuxLogo.jpg");
src2=imread("../../images/WindowsLogo.jpg");

 


警告:因为我们要将src1和src2相结合,他们必须是同样的大小(宽和高)和类型


 

 

 

      2、现在我们需要产生g(x)的图像。这样addWeighted就用起来很方便了。

      

beta =(1.0-alpha);
addWeighted(src1,alpha,src2,beta,0.0,dst);

 

       因为addWeighted产生:

                                dst=α*src1+β*src2+γ

       在这个例子中,γ在上面的代码中是0.0。

    3、创建一个窗口,显示图像并且等待用户结束程序

结果

 

posted @ 2015-05-15 17:14  你猜你猜啊  阅读(196)  评论(0编辑  收藏  举报