addWeighted()计算数组的加权和(融合)

addWeighted()定义如下

The function addWeighted calculates the weighted sum of two arrays as follows:
\f[\texttt{dst} (I)= \texttt{saturate} ( \texttt{src1} (I)* \texttt{alpha} +  \texttt{src2} (I)* \texttt{beta} +  \texttt{gamma} )\f]
where I is a multi-dimensional index of array elements. In case of multi-channel arrays, each
channel is processed independently.
The function can be replaced with a matrix expression:
@code{.cpp}
    dst = src1*alpha + src2*beta + gamma;
@endcode
@note Saturation is not applied when the output array has the depth CV_32S. You may even get
result of an incorrect sign in the case of overflow.
@param src1 first input array.
@param alpha weight of the first array elements.
@param src2 second input array of the same size and channel number as src1.
@param beta weight of the second array elements.
@param gamma scalar added to each sum.
@param dst output array that has the same size and number of channels as the input arrays.
@param dtype optional depth of the output array; when both input arrays have the same depth, dtype
can be set to -1, which will be equivalent to src1.depth().
@sa  add, subtract, scaleAdd, Mat::convertTo
*/
CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2,
                              double beta, double gamma, OutputArray dst, int dtype = -1);

dst = src1*alpha + src2*beta + gamma;

注意:

addWeighted()函数的三个Mat对象的大小需要一样,否则容易出错;

#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main(int argc, char *agrv[])
{
	Mat imag_person = imread("C:\\Users\\Desktop\\picture.jpg");
	Mat imag_lion = imread("C:\\Users\\Desktop\\lion.jpg");
	if (!imag_person.data&&!imag_lion.data)
	{
		cout << "Open error!" << endl;
		return -1;
	}
	Rect rec(800, 0, imag_lion.cols, imag_lion.rows);//确定融合图片的位置与大小;
//Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height);
//_Tp x; //!< x coordinate of the top-left corner
//_Tp y; //!< y coordinate of the top-left corner
//_Tp width; //!< width of the rectangle
//_Tp height; //!< height of the rectangle
	Mat imag_RIO = imag_person(rec);//将imag_person中rec区域的图片保存在imag_RIO中;
	addWeighted(imag_RIO, 0.8, imag_lion, 0.2, 0, imag_RIO);//进行图片融合,将(imag_RIO与imag_lion)进行融合后,保存在image_RIO中;
	imshow("image_RIO",imag_RIO);
	imshow("【创建矩形框】", imag_person);/*为什么输出img_person中也有融合?难道是由于在创建imag_RIO是imag_person指定位置的图形?
	相当于image_person是一个大数组M,N(imag_RIO)是M中指定位置指定大小的子集合,imag_RIO与imag_lion进行融合后(即进行加权和),
	最后将加权后的结果保存在imag_RIO中,而Imag_RIO又是imag_person的子集,所以imag_person相应部分也进行融合;**有人知道原因吗?可以
	交流一下;***/
	/*找到答案了:首先需要从Mat类的结构说起,Mat类是由两个数据部分组成:矩阵头(包含矩阵尺寸、存储方法、存储地址等信息)和一个指向存储所有像素的矩阵
	(根据所选存储方法的不同,矩阵可以是不同的维数)的指针。由于图像产生的矩阵是非常巨大的,所以在万不得已时,不应该进行大图像的复制,这样会降低程序的运行效率;那如何解决这个问题呢?
	OpenCV使用了引用计数机制。其思路是让每一个Mat对象有自己的信息头,但是共享同一矩阵。
	这通过让矩阵指针指向同一个地址而实现,而拷贝构造函数则只复制头信息和矩阵指针,而不复制矩阵。但是若想复制这个图像矩阵,而不是简单复制其头信息和矩阵指针,可以通过clone()或者copyTo()
	实现。所以在图像融合时,原图像为什么也会发生改变的原因就解释的同了*/
	waitKey(0);
	return 0;
}

在这里插入图片描述
在这里插入图片描述如果将融合的结果保存在imag_lion中?

addWeighted(imag_RIO, 0.8, imag_lion, 0.2, 0, imag_lion);
	imshow("imag_RIO", imag_RIO);
	imshow("【创建矩形框】", imag_person);
	imshow("imag_lion", imag_lion);

在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很好的问题!首先来回答第一部分:如何用数组表示一个图? 在数组表示中,我们使用二维数组来表示一个无向图。对于一个有 $n$ 个节点的无向图,我们可以定义一个 $n\times n$ 的二维数组 $graph$,其中 $graph[i][j]$ 表示节点 $i$ 和 $j$ 之间的边的权重。 如果节点 $i$ 和节点 $j$ 之间没有边相连,则 $graph[i][j]=graph[j][i]=\infty$。如果节点 $i$ 和节点 $j$ 之间有一条权重为 $w$ 的边,则 $graph[i][j]=graph[j][i]=w$。 下面来回答第二部分:普里姆算法是如何计算最小生成树的? 普里姆算法是一种基于贪心策略的算法,用于寻找加权无向图的最小生成树。算法的基本思想是从一个节点开始,逐步将和该节点相连的权重最小的边加入到生成树中,直到生成树包含了所有的节点。 具体来说,算法从任意一个节点开始,将该节点加入到生成树中,然后将该节点的所有邻居节点加入到一个优先队列中。优先队列按照边的权重从小到大排序,每次取出权重最小的边所连接的节点,将其加入到生成树中,并将该节点的所有邻居节点加入到优先队列中。重复以上步骤,直到生成树包含了所有的节点。 在实现中,我们可以使用一个 $n$ 个元素的数组 $key$ 来记录每个节点到生成树的距离,初始时 $key[i]=\infty$。每次从优先队列中取出一个节点 $u$,将其加入到生成树中,并遍历节点 $u$ 的所有邻居节点 $v$。如果节点 $v$ 的距离 $key[v]$ 大于边 $(u,v)$ 的权重,则更新 $key[v]$ 的值为 $(u,v)$ 的权重,并将节点 $v$ 加入到优先队列中。 最终,生成树中包含的边就是算法执行过程中加入的所有边。该生成树具有最小的总权重,即为原图的最小生成树。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值