OPenCV3.2 图像的线性混合

最近一直在学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;
}
运行结果:



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值