您的位置:首页 > 运维架构

OPenCV3.2 图像的线性混合

2017-10-06 17:50 381 查看
最近一直在学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;
}运行结果:





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息