1.线性混合概念
全新的像素值为一个常数系数(0~1)乘以第一个图像的像素值,加上另一个常数系数(与第一个常数相加为1)乘以第二个图像像素值。
2.相关API介绍
addWeighted():
参数1:输入图像Mat – src1
参数2:输入图像src1的alpha值
参数3:输入图像Mat – src2
参数4:输入图像src2的alpha值
参数5:gamma值
参数6:输出混合图像
注意点:两张图像的大小和类型必须一致才可以
3.代码实现
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
Mat src1, src2,dst,dest, src1F, src2F;
double a = 0.5;
int main()
{
src1 = imread("D:/VS project/Image/Windows.jpg");
src2 = imread("D:/VS project/Image/Linux.jpg");
dst.create(src1.size(), src1.type());
if (src1.empty()) {
cout << "文件打开失败" << endl;
return -1;
}
if (src2.empty()) {
cout << "文件打开失败" << endl;
return -1;
}
if (src1.rows == src2.rows&&src1.cols == src2.cols&&src1.type() == src2.type())
{
addWeighted(src1,a,src2,(1.0-a),0.0,dst);
imshow("API实现合成图", dst);
}
else
{
cout << "图像大小不一致!" << endl;
}
//个人实现图像混合
dest.create(src1.size(), src1.type());
src1.convertTo(src1F, CV_32F);
src2.convertTo(src2F, CV_32F);
int height = src1.rows;
int width = src1.cols;
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
Vec3f intensity1 = src1F.at<Vec3f>(row, col);
Vec3f intensity2 = src2F.at<Vec3f>(row, col);
float blue1 = intensity1.val[0];//B通道
float green1 = intensity1.val[1];//G通道
float red1 = intensity1.val[2];//R通道
float blue2 = intensity2.val[0];//B通道
float green2 = intensity2.val[1];//G通道
float red2 = intensity2.val[2];//R通道
dest.at<Vec3b>(row, col)[0] = a*blue1 + (1 - a)*blue2;
dest.at<Vec3b>(row, col)[1] = a*green1 + (1 - a)*green2;
dest.at<Vec3b>(row, col)[2] = a*red1 + (1 - a)*red2;
}
}
namedWindow("个人合成图", CV_WINDOW_AUTOSIZE);
imshow("个人合成图", dest);
waitKey(0);
return 0;
}
结果: