今天准备做一下图形图像两张图片的叠加处理,发现所有文章都是在使用addWeighted()函数直接叠加,并没有去进行精细此操作(主要是因为老师说不能用第三方接口,不能调函数,实现代码需自己写),所以我对此进行了探究,笔者水平不高,如有错误还请提醒!
原理这是一种线性混合操作,只不过其中的混合值是带有权值的,使其比重占的不一样
函数:
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype = -1);
其中
- src1,src2均为输入的mat图像
- alpha,beta为上图像在混合中的权重
- gamma,一个加到权重总和上的标量值,可以理解为加权和后的图像的偏移量
- dst,为输出参数,和输入的两个Mat拥有相同的尺寸和通道数。
dst = src1[I] * alpha + src2[I] * beta + gamma - dtype,可选,输出阵列的深度,有默认值-1。当两个输入数组具有相同深度时,这个参数设置为-1(默认值),即等同于src1.depth()。
方法一:
void addweighted(Mat & src1,double alpha,Mat &src2,double beta,double gama,Mat &src3,int dtype=-1)
{
int row=src1.rows; //行数
int col=src1.cols*src1.channels();//列数*通道数=每一行元素个数
//行循环列循环
for(int i=0;i(i);//获取第i行首地址
uchar* data2=src2.ptr(i);
uchar* data3=src3.ptr(i);
for(int j=0;j
方法二
void addweighted(Mat & src1,double alpha,Mat &src2,double beta,double gama,Mat &src3,int dtype=-1)
{
int row=src1.rows; //行数
int col=src1.cols; //列数
//行循环列循环
for(int i=0;i(i,j)[0]=alpha*src1.at(i,j)[0]+beta*src2.at(i,j)[0]+gama;//蓝色通道
src3.at(i,j)[1]=alpha*src1.at(i,j)[1]+beta*src2.at(i,j)[1]+gama;//绿色通道
src3.at(i,j)[2]=alpha*src1.at(i,j)[2]+beta*src2.at(i,j)[2]+gama;//红色通道
}
}
}
记录完毕,了解了Mat类,也了解了addweighted方法,记录一下,以防下次忘记



