【OpenCV】OpenCV实战从入门到精通之十六 -- 教你如何对ROI图像通过线性混合进行操作

本文是《OpenCV实战从入门到精通》系列之第16篇

【OpenCV】OpenCV实战从入门到精通之一 -- OpenCV宏的讲解

【OpenCV】OpenCV实战从入门到精通之二 -- OpenCV如何进行图像腐蚀操作

【OpenCV】OpenCV实战从入门到精通之三 -- canny边缘检测

【OpenCV】OpenCV实战从入门到精通之四 -- 常用的函数讲解(mat、imread、imshow、imwrite、nameWindow)

【OpenCV】OpenCV实战从入门到精通之五 -- 教你使用Rect()函数

【OpenCV】OpenCV实战从入门到精通之六 -- 教你如何使用滑动条-createTrackbar()函数

【OpenCV】OpenCV实战从入门到精通之七 -- 教你如何使用鼠标操作SetMouseCallback

【OpenCV】OpenCV实战从入门到精通之八 -- 带你深入理解Mat容器

【OpenCV】OpenCV实战从入门到精通之九 -- OpenCV有哪些常用的数据结构和函数 

【OpenCV】OpenCV实战从入门到精通之十 -- 教你如何使用OpenCV绘制基本图形

【OpenCV】OpenCV实战从入门到精通之十一 -- LUT函数讲解及像素在矩阵中如何存储

【OpenCV】OpenCV实战从入门到精通之十二 -- 教你如何使用指针访问像素

【OpenCV】OpenCV实战从入门到精通之十三 -- 教你如何使用迭代器访问像素

OpenCV】OpenCV实战从入门到精通之十四 -- 教你如何使用动态地址运算配合at访问元素

【OpenCV】OpenCV实战从入门到精通之十五 -- 教你如何对ROI区域进行叠加

目录

本文是《OpenCV实战从入门到精通》系列之第16篇

准备两张一样大小的图片:

混合结果图: 

本文工程代码下载:


       公式:dst = src1[I]*alpha+ src2[I]*beta + gamma;

void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);

第一个参数,InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat。
第二个参数,alpha,表示第一个数组的权重
第三个参数,src2,表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数。
第四个参数,beta,表示第二个数组的权重值。

第五个参数,gamma,一个加到权重总和上的标量值。看上面的式子自然会理解。
第六个参数,dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数。
第七个参数,dtype,输出阵列的可选深度,有默认值-1。;当两个输入数组具有相同的深度时,这个参数设置为-1(默认值),即等同于src1.depth()。

 注意:其中的I,是多维数组元素的索引值。

        在遇到多通道数组的时候,每个通道都需要独立地进行处理。

        另外需要注意的是,当输出数组的深度为CV_32S时,这个函数就不适用了,这时候就会内存溢出或者算出的结果压根不对。

准备两张一样大小的图片:

 

//-------------------------------【头文件、命名空间】--------------------------------------
//
//--------------------------------------------------------------------------
#include <opencv2\opencv.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;

//-------------------------------【全局函数声明】--------------------------------------
//
//--------------------------------------------------------------------------
bool LinearBlending();

int main()
{
	system("color 5E");

	if (LinearBlending())
	{
		cout << " LinearBlending " << "运行成功!" << endl;
	}

	waitKey(0);
	return 0;
}


//---------------------------------【LinearBlending()函数】-------------------------------------
// 函数名:LinearBlending()
// 描述:利用cv::addWeighted()函数实现图像线性混合
//--------------------------------------------------------------------------------------------
bool LinearBlending()
{
	//【0】定义一些局部变量
	double alphaValue = 0.5;
	double betaValue;
	Mat srcImage1, srcImage2, dstImage;

	//【1】读取图像 ( 两幅图片需为同样的类型和尺寸 )
	srcImage1 = imread("q.jpg");
	srcImage2 = imread("p.jpg");

	if (!srcImage1.data) { printf("检查,读取srcImage1错误~! \n"); return false; }
	if (!srcImage2.data) { printf("检查,读取srcImage2错误~! \n"); return false; }

	cout << srcImage1.rows << "  srcImage1 row" << endl;
	cout << srcImage1.cols << "  srcImage1 col" << endl;
	cout << srcImage2.rows << "  logoImage row" << endl;
	cout << srcImage2.cols << "  logoImage col" << endl;

	//【2】做图像混合加权操作
	betaValue = (1.0 - alphaValue);
	addWeighted(srcImage1, alphaValue, srcImage2, betaValue, 0.0, dstImage);

	//【3】创建并显示原图窗口
	namedWindow("<1>线性混合示例窗口【原图】", 1);
	imshow("<1>线性混合示例窗口【原图】", srcImage1);

	namedWindow("<2>线性混合示例窗口【原图】", 1);
	imshow("<2>线性混合示例窗口【原图】", srcImage2);

	namedWindow("<3>线性混合示例窗口【效果图】", 1);
	imshow("<3>线性混合示例窗口【效果图】", dstImage);

	return true;

}

 结果:

混合结果图: 

本文工程代码下载:

OpenCV3-初级图像混合-线性混合操作 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值