目标
在本教程中,您将学习:
- 什么是线性混合,为什么它很有用
- 如何使用addWeighted()混合两个图像
理论
下面的解释属于Richard Szeliski的“ 《计算机视觉:算法与应用》 ”一书。
从以前的教程中,我们已经知道了一些像素运算符。一个常见的二元(双输入)算子线性混合运算符:
通过改变α从0→1,这个操作员可以用来执行两个图像或视频之间的时间交叉溶解,如幻灯片放映和电影制作效果所示。
code
//blend two imgs
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main(void)
{
double alpha = 0.5; //control alpha
double beta; double input;
Mat src1, src2, dst;
cout << " Simple Linear Blender " << endl;
cout << "-----------------------" << endl;
cout << "* Enter alpha [0.0-1.0]: ";
cin >> input;// We use the alpha provided by the user if it is between 0 and 1
if (input >= 0 && input <= 1)
{
alpha = input;
}
src1 = imread("Linux.jpg");
src2 = imread("Windows.jpg");
if (src1.empty()) { cout << "Error loading src1" << endl; return -1; }
if (src2.empty()) { cout << "Error loading src2" << endl; return -1; }
beta = (1.0 - alpha);
addWeighted(src1, alpha, src2, beta, 0.0, dst);
imshow("Linear Blend", dst);
waitKey(0);
return 0;
}
解释
需要两个原图 ( f0(x) and f1(x)):
src1 = imread("Linux.jpg");
src2 = imread("Windows.jpg");
注意:src1和src2必须有一样的size(weight, height)和type。
现在我们需要生成g(x)图像。为此,函数addWeighted()非常方便:
beta = (1.0 - alpha);
addWeighted(src1, alpha, src2, beta, 0.0, dst);
因为addWeighted()产生:
在这种情况下,在上面的代码中,gamma是参数0.0