Opencv中的addweighted函数
一.addweighted函数作用
addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值(如亮度调整)。它常用于实现图像混合、特效叠加、亮度调节等视觉效果,在计算机视觉应用中广泛用于创建透明效果、淡入淡出过渡或图像增强等场景。
1.函数定义
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst);
参数:
src1: 第一个输入图像(数组),必须是相同尺寸和类型(如8位无符号整型)的图像
alpha: 第一个图像的权重系数(double类型),决定 src1 在融合中的贡献程度。例如,α=0.5 表示 src1 占据50%权重
src2: 第二个输入图像(数组),尺寸和通道数必须与 src1 完全匹配
beta: 第二个图像的权重系数(double类型),决定 src2 在融合中的贡献程度。例如,
β=0.5表示 src2 占据50%权重
gamma: 标量值(double类型),添加到每个像素上,常用于调整输出图像的全局亮度。例如,γ=0 不改变亮度,γ>0 增加亮度。
dst: 输出图像(数组),尺寸和类型与输入相同,存储融合结果。
函数执行的运算是基于每个像素点的线性加权和。数学公式如下:
dst(i,j)=α×src1(i,j)+β×src2(i,j)+γ 简化公式就是:dst=α∗src1+β∗src2+γ
src1(i,j) 和 src2(i,j)src2(i,j) 分别表示两个输入图像在位置 (i,j)(i,j) 的像素值。
α 是第一个图像的权重(浮点数)。
β 是第二个图像的权重(浮点数)。
γ是添加到每个像素的标量值(通常用于调整整体亮度)。
dst(i,j)dst(i,j) 是输出图像在位置 (i,j)(i,j) 的像素值。 公式确保结果通过 saturate_cast<uchar>
处理(防止像素值溢出255),避免无效的像素值
权重和与 γγ的作用:α 和 β 之和通常为1以实现平滑融合(如 α+β=1),但并非绝对要求。γ 可独立调整亮度,这类似于在融合后加一个常数偏移
2.例子
c++中
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
// 读取图像
Mat img1 = imread("image1.jpg", IMREAD_COLOR);
Mat img2 = imread("image2.jpg", IMREAD_COLOR);
Mat dst; // 输出图像
// 调用addWeighted:alpha=0.1, beta=0.9, gamma=10(增加少量亮度)
addWeighted(img1, 0.1, img2, 0.9, 10, dst);
// 保存输出
imwrite("output.jpg", dst);
return 0;
}
二.实战
在实战中,我们两个图片的融合分为两个情况,一种是两张照片大小不一样,一种是大小一样
大小一样的我们就可以只用使用addweighted函数融合,不需要建立感兴趣区,大小不一样的则需要。
int main(int argc, char * argv[])
{//命令行中选入照片Mat src1=imread(argv[1]);//src1原图像的数据Mat src2=imread(argv[2]); //src2是LOGO图像的数据//判断src1长度和src2是否相同,若不同则进行以下操作if(src1.size!=src2.size)//不相同就需要建立感兴趣区{Mat image_roi=src1(Rect(30,30,src2.cols,src2.rows));//在原图像中截取一个可感兴趣区域,感兴趣区域double alpha =0.4;//alpha第一个图像的权重值,这里是0.4double beta = 1-alpha;//beta是第二个图像权重值,1- alpha = 0.6,第二个图像的清晰度较高int gama =0;//gamma默认为0,>0就是增强光感addWeighted(image_roi,alpha,src2,beta,gama,image_roi);//调用addWeighted对src1和src2进行图像融合imwrite("addweighted_norsamesize.jpg",src1);}else//大小一样,是融合之后生成一张新的照片{double alpha = 0.4;//alpha第一个图像的权重值,这里是0.4double beta = 1 - alpha;//beta是第二个图像权重值,1- alpha = 0.6,第二个图像的清晰度较高int gamma = 0; Mat dst;addWeighted(src1, alpha , src2, beta, gamma, dst); //调用addWeighted对src1和src2进行图像融合imwrite("addweighted_samesize.jpg", dst);}