最近一直在学OPenCV,正好学到图像的线性混合,我准备把其中的一些原理和注意点和大家分享下。
原理:
其中α的取值范围为0~1之间。
注意点:
输入的两幅图像一定要有相同的尺寸和类型
函数说明:
实现线性混合主要是利用OPenCV中的addWeighted函数。
void cv::addWeighted ( InputArray src1,
double alpha,
InputArray src2,
double beta,
double gamma,
OutputArray dst,
int dtype = -1
)
addWeighted计算两个数组的加权和。利用如下公式:
参数:
src1:第一个输入数组。
alpha: 第一个数组元素的权重。
src2 :第二个输入数组,和src1具有相同大小和通道数
beta :第二个数组元素的权重。
gamma :增加到每个和的标量。
dst :输出数组,和输入数组有相同的尺寸和通道数
dtype :输出数组的可选深度;当两个输入数组都具有相同的深度时,dtype可以设置为- 1,这将等同于src1.depth()。
实现代码如下:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src1Image = imread("mogu.jpg");
Mat src2Image = imread("rain.jpg");
Mat dstImage;
if (!src1Image.data)
{
cout << "could not load mogu.jpg..." << endl;
return -1;
}
if (!src2Image.data)
{
cout << "could not load rain.jpg..." << endl;
return -1;
}
namedWindow("mogu", CV_WINDOW_AUTOSIZE);
namedWindow("rain", CV_WINDOW_AUTOSIZE);
imshow("mogu", src1Image);
imshow("rain", src2Image);
if (src1Image.size() == src2Image.size() && src1Image.type() == src2Image.type())//保证两幅输入图像有相同的大小和类型
{
double alpha = 0.5;
double beta = 1 - alpha;
addWeighted(src1Image, alpha, src2Image, beta,0.0, dstImage);
}
else
{
cout << "could not blend ..." << endl;
return -1;
}
namedWindow("blend image", CV_WINDOW_AUTOSIZE);
imshow("blend image", dstImage);
waitKey(0);
return 0;
}
运行结果: