线性混合操作是一种典型的二元(两个输入)的像素操作;
计算数组加权和:addWeighted()函数
//函数原型
void addWeighted(InputArray src1,double alpha,InputArray src2,double beta,double gamma,OutputArray dst,int dtype=-1);
第一个参数:InputArray类型的src1表示需要加权的第一个数组,常常填一个Mat
第二个参数:double类型的alpha,表示第一个数组的权重
第三个参数:InputArray类型的src2表示需要加权的第二个数组,他需要和第一个数组拥有相同的尺寸和通道数
第四个参数:double类型的beta,表示第二个数组的权重
第五个参数:double类型的gamma,一个加到权重总和上的标量值
第六个参数:OutputArray类型的dst,输出的数组,他和输入的两个数组拥有相同的尺寸和通道数
第七个参数:int类型的dtype,默认值为-1,当两个输入的数组拥有相同的深度时,这个参数设置为-1
dst = src1[i] * alpha + src2[i] * beta + gamma;
其中i为多维数组的索引值,当遇到多通道数组时,每个通道都需要独立的进行处理
注意:当输出的数组深度为CV_32S时,这个函数不再适用
图像线性组合实例:
#include <opencv2/opencv.hpp>
using namespace cv;
//-------------LinearBlending()函数,实现图像线性混合----
bool LinearBlending() {
//定义一些局部变量
double alphaValue = 0.5;
double betaValue;
Mat srcImage2, srcImage3, dstImage;
//读取图像(两幅图像需为同样的类型和尺寸)
srcImage2 = imread("mogu.jpg");
srcImage3 = imread("rain.jpg");
if (!srcImage2.data) {
std::cout << "读取srcImage2错误!" << std::endl;
return false;
}
if (!srcImage3.data) {
std::cout << "读取srcImage3错误!" << std::endl;
return false;
}
//做图像混合加权操作
betaValue = (1.0 - alphaValue);
addWeighted(srcImage2, alphaValue, srcImage3, betaValue, 0.0, dstImage);//加权线性混合
//创建并显示原图窗口
namedWindow("<2>线性混合示例【原图】",1);
imshow("<2>线性混合示例【原图】", srcImage2);
namedWindow("<3>线性混合示例【效果图】");
imshow("<3>线性混合示例【效果图】", dstImage);
return true;
}
int main() {
if (LinearBlending())
std::cout << "线性混合实例演示成功!" << std::endl;
else
std::cout << "线性混合实例演示失败!" << std::endl;
waitKey(0);
return 0;
}
【原图】
【两个图像线性组合效果图】