目标
在教程中你会学到:
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、创建一个窗口,显示图像并且等待用户结束程序
结果
时间: 2024-10-03 13:45:14