【opencv4.3.0教程】10之图像混合(addweight)

目录

前言

一、图像混合

1、什么是图像混合

2、图像混合的数学原理

3、API - addweight

二、代码实战

1、代码分析

2、全部代码

3、执行结果


前言

前一篇文章,我们讲到了图像的颜色空间转换和类型转换,那是以后我们可能经常会用到的操作。

今天这篇文章给大家带来的是图像的混合,我们将带领大家一起了解什么是图像混合?如何使用opencv进行图像混合,让我们一起走进今天的文章看一下吧!

一、图像混合

1、什么是图像混合

图像混合,怎么理解呢?假设我们有两个颜料板,每个颜料板都有m×n个格子,每个格子中有一个颜色,对应位置的,放到一起,搅拌均匀。那我们每个格子都会得到一个新的颜色。

对于图像来说,我们有两个大小相同的图像,我们将对应位置的像素相加,就可以得到一个新的像素,每个格子颜料不同,占比不同,得到的像素也不同,像素也可以设置比例,两个像素通过调整比例,可以得到很多的图像。

2、图像混合的数学原理

根据上面的理解,我们知道图像混合就是按照比例将来那个幅图像对应位置的像素点加起来。

这个很好理解,使用数学公式表达如下:g表示的是混合后的图像,α表示的是其中一幅图像所占比重,那另一幅图像所占比重就是1-α。f表示的是用于混合的图像。

上面这是很简单的混合,就是直接按比例混合,如果我们想在添点料呢?

这个很好理解,使用数学公式表达如下:g表示的是混合后的图像,α表示的是其中一幅图像所占比重,那另一幅图像所占比重就是1-α。f表示的是用于混合的图像。

3、API - addweight

接下来我们就来说一下这个对应的API,定义如下:

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

函数参数含义如下:

(1)InputArray类型的src1,输入图像。

(2)double类型的alpha,输入图像src1的alpha值(所占比重)

(3)InputArray类型的src2,输入图像。

(4)double类型的beta,输入图像src2的beta值(所占比重)

(5)double类型的gamma,gamma值,添加到每个和的标量。

(6)OutputArray类型的dst,输出图像,其大小和通道数与输入数组相同。

(7)int类型的dtype ,输出数组的可选深度;当两个输入数组具有相同的深度时,dtype可以设置为-1,这相当于src1.depth()。默认为-1。

在使用过程中,我们需要注意:

1.两个输入图像的尺寸和类型必须要一致,所以我们要先检测,才能做混合。

2.一般最后一个参数都是默认的,采用和输入图像相同的深度。

二、代码实战

1、代码分析

我们要获取两个图像,然后将这两个图像进行混合。

所以我们要先读取两个图像,保证读取成功并展示:

	Mat ZWJ = imread("./image/YT_ZWJ.png");
	Mat ZM = imread("./image/YT_ZM.png");
	if (!ZWJ.data && !ZM.data)
	{
		cout << "ERROR : could not load image.\n";
		return -1;
	}
	imshow("张无忌", ZWJ);
	imshow("赵敏", ZM);

然后我们就要考虑混合,混合的时候,我们需要定义几个参数,根据自己需要,也可以设置固定值,比如:

	double alpha = 0.5;
	Mat YT;

最后我们需要判断,两个输入图像类型是否一致,图像尺寸是否一致,如果一致,我们就进行图像混合并输入,如果不一致我们就进行提示。

	if (ZWJ.rows == ZM.rows && ZWJ.cols == ZM.cols && ZWJ.type() == ZM.type()) {
		addWeighted(ZWJ, alpha, ZM, (1.0 - alpha), 0.0, YT);
		imshow("倚天屠龙", YT);
	}
	else {
		cout<<"The size of images is not same.\n";
		return -1;
	}

2、全部代码

全部代码如下:

/*
	作者:水亦心
	内容:core-图像混合
	时间:2020年5月27日
*/

#include<iostream>
#include<opencv2\opencv.hpp>

using namespace std;
using namespace cv;


int main() {

	Mat ZWJ = imread("./image/YT_ZWJ.png");
	Mat ZM = imread("./image/YT_ZM.png");
	if (!ZWJ.data && !ZM.data)
	{
		cout << "ERROR : could not load image.\n";
		return -1;
	}
	imshow("张无忌", ZWJ);
	imshow("赵敏", ZM);
	
	double alpha = 0.5;
	Mat YT;
	if (ZWJ.rows == ZM.rows && ZWJ.cols == ZM.cols && ZWJ.type() == ZM.type()) {
		addWeighted(ZWJ, alpha, ZM, (1.0 - alpha), 0.0, YT);
		imshow("倚天屠龙", YT);
	}
	else {
		cout<<"The size of images is not same.\n";
		return -1;
	}



	waitKey(0);
	return 0;
}

3、执行结果

执行结果如下:

 

猜你喜欢

转载自blog.csdn.net/shuiyixin/article/details/106369775