目标:
在这个教程中你将会学到:
什么是线性混合以及为什么它有用;
怎么去使用addWeighted组合两张图片;
理论:
前面我们的教程中,我们已经了解了很多像素操作,一个有趣的二元操作就是线性柔合操作:
通过让阿尔法的值从0-1之间变化,这个操作可以被用来实现两张图像或视频之间的一种暂时的重叠效果。
代码:
和之前一样,先上代码:
// Adding two images using OpenCV
// Author:York.
// Email:y_zhou1991@163.com
// Date:2016/3/1
////////////////////////////////////////////
#include<cv.h>
#include<highgui.h>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
double alpha = 0.5;
double beta;
double input;
Mat src1, src2, dst;
cout << "Simple Linear Blender " << endl;
cout << "---------------------" << endl;
cout << "*Enter alpha [0-1]: ";
cin >> input;
//根据自己设定的权重来柔和图像
if (input >= 0.0&&input <= 1.0)
alpha = input;
//读入源图像
src1 = imread("F:/Photo/OpenCV_Photo/baboon.jpg");
src2 = imread("F:/Photo/OpenCV_Photo/lena.jpg");
//判断源图像载入是否成功
if (!src1.data){ cout << "Error loading src1\n"; return -1; }
if (!src2.data){ cout << "Error loading src2\n"; return -1; }
namedWindow("Linear Blend", 1);
//进行图像柔和操作
beta = (1.0 - alpha);
addWeighted(src1, alpha, src2, beta, 0.0, dst);
imshow("Linear Blend", dst);
waitKey(0);
return 0;
}
解释:
1、 因为我们要实现下面这个公式:
所以我们需要两张原始图像,因此我们把他们分别载入;
注意:我们载入的两张原始图像,他们必须是同样的尺寸和类型(但似乎不是必须的,我自己载入的就是两张不一样的图片,照样可以)。
2、 现在我们需要产生输出图像,为了达到这个,addWeighted函数就可以排上用场了:
beta = ( 1.0- alpha );
addWeighted(src1, alpha, src2, beta, 0.0, dst);
addWeighted是根据下面这个公式工作的:
在这个程序中,伽马是0.
3、然后就是把柔和后的图像显示在窗口中了。最后效果如图: