图形图像处理-Opencv-addWeighted()函数实现

引言

  今天准备做一下图形图像两张图片的叠加处理,发现所有文章都是在使用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<row;i++){
         uchar* data1=src1.ptr<uchar>(i);//获取第i行首地址
         uchar* data2=src2.ptr<uchar>(i);
         uchar* data3=src3.ptr<uchar>(i);
         for(int j=0;j<col;j++){
             data3[j]=data1[j]*0.4+data2[j]*0.6+gama;//g(x)=(1-a)f1(x)+af2(x)+gama,两个像素的加权和,产生时间上的画面叠加
         }
     }
 }

方法二

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<row;i++){        
         for(int j=0;j<col;j++){
             src3.at<Vec3b>(i,j)[0]=alpha*src1.at<Vec3b>(i,j)[0]+beta*src2.at<Vec3b>(i,j)[0]+gama;//蓝色通道
             src3.at<Vec3b>(i,j)[1]=alpha*src1.at<Vec3b>(i,j)[1]+beta*src2.at<Vec3b>(i,j)[1]+gama;//绿色通道
             src3.at<Vec3b>(i,j)[2]=alpha*src1.at<Vec3b>(i,j)[2]+beta*src2.at<Vec3b>(i,j)[2]+gama;//红色通道
         }
     }
}

记录完毕,了解了Mat类,也了解了addweighted方法,记录一下,以防下次忘记

你可能感兴趣的:(c++,c++,opencv,图形学)