前言
本文使用的环境为:Qt5.11 + OpenCV3.4.6
环境安装参考文档:https://blog.csdn.net/z634863434/article/details/89950961
理论
线性混合的理论公式如下:
从数学层面来解释,可以理解为:g(x)由f0(x)和f1(x)两个函数组成,α为f(x)的权重系数,取值范围应当0 ≤ α ≤ 1。
从图像层面来解释,可以理解为:f0(x)为图像0,f1(x)为图像1,g(x)为图像0和图像1混合后生成的混合图像,α代表着图像0和图像1在混合时的权重关系。
图像线性混合函数
void cv::addWeighted ( InputArray src1,
double alpha,
InputArray src2,
double beta,
double gamma,
OutputArray dst,
int dtype = -1
)
执行公式:
dst(I)=saturate(src1(I)∗alpha+src2(I)∗beta+gamma)
作用:图像线性混合,注意两张图像的大小和类型必须一致
输入参数 | 参数定义 |
---|---|
src1 | 第一个图像 |
alpha | 第一个图像的权重 |
src2 | 第二个图像 |
beta | 第二个图像的权重 |
gamma | 增量 |
dst | 输出图像 |
dtype | 深度 |
示例:
图像1
图像2
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv2/opencv.hpp>
#include <QtDebug>
using namespace cv;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//设定α参数
double alpha = 0.2;
//创建混合图像句柄
Mat dst;
//创建图像1句柄
Mat src1 = imread("E:/OpenCV/OpenCVPicture/umbrella.jpg");;
if(src1.empty()){
qDebug()<<"can not load image1...\n";
return ;
}
//创建图像2句柄
Mat src2 = imread("E:/OpenCV/OpenCVPicture/threepig.jpg");
if(src2.empty()){
qDebug()<<"can not load image2...\n";
return ;
}
//显示图像1
namedWindow("input1",WINDOW_AUTOSIZE);
imshow("input1",src1);
//显示图像2
namedWindow("input2",WINDOW_AUTOSIZE);
imshow("input2",src2);
//判断图像1和图像2大小和类型是否相同
if(src1.size() == src2.size() && src1.type() == src2.type()){
//图像混合
addWeighted(src1,alpha,src2,1-alpha,0,dst);
//显示混合后的图像
namedWindow("output",WINDOW_AUTOSIZE);
imshow("output",dst);
}else{
qDebug()<<"image1 and image2 are not same...\n";
return ;
}
waitKey(0);
}
得到结果: