【OpenCV + VS】用addWeighted实现图像线性融合

在OpenCV图像处理中,图像融合是最基础且常用的技术之一,广泛应用于特效制作、图像拼接、水印添加等场景。本文将聚焦核心函数
addWeighted
,详细拆解其语法规则、实现原理。

一、图像线性融合的核心原理

图像线性融合本质是通过权重分配,将两张图像按比例叠加,生成新的混合图像。其数学公式如下:


dst = src1 × alpha + src2 × beta + gamma


dst
:融合后的目标图像
src1

src2
:待融合的两张源图像(需满足尺寸、类型一致)
alpha

src1
的权重(0~1之间,值越大
src1
越清晰)
beta

src2
的权重(0~1之间,值越大
src2
越清晰)
gamma
:亮度调节因子(通常设为0.0,可根据需求调整整体亮度)

关键原则:为保证融合后图像亮度正常,通常设置
alpha + beta = 1
,避免像素值溢出导致画面过亮或失真。

二、核心函数addWeighted语法详解


addWeighted
是OpenCV专门用于线性融合的API,语法格式和参数说明如下:

1. 函数原型


void cv::addWeighted(
    InputArray src1,        // 第一张源图像
    double alpha,           // 第一张图像的权重
    InputArray src2,        // 第二张源图像
    double beta,            // 第二张图像的权重
    double gamma,           // 亮度调节因子
    OutputArray dst,        // 融合后的目标图像
    int dtype = -1          // 目标图像数据类型(默认-1,与src1一致)
);

2. 参数详细说明

参数名 类型 说明

src1
InputArray 输入图像1,支持
Mat
等OpenCV图像格式,需与
src2
尺寸、通道数完全一致

alpha
double 图像1的权重系数,范围通常为[0,1],控制图像1在融合结果中的清晰度

src2
InputArray 输入图像2,要求与
src1
的宽、高、通道数(如单通道/三通道)完全匹配

beta
double 图像2的权重系数,范围通常为[0,1],与
alpha
互补(
alpha + beta = 1

gamma
double 叠加后的亮度偏移量,可正可负(正值提亮,负值变暗),默认0.0

dst
OutputArray 输出的融合图像,无需提前初始化,函数会自动分配内存

dtype
int 目标图像的数据类型(如CV_8UC3),默认-1表示与
src1
数据类型一致

3. 注意事项

图像匹配要求
src1

src2
必须满足「宽高相同 + 通道数相同」,否则函数会报错(如三通道彩色图不能与单通道灰度图融合)。权重合理分配:若
alpha + beta > 1
,可能导致像素值超过255(8位图像),出现画面过曝、失真;若总和小于1,画面会偏暗。gamma的作用:当融合后图像整体偏暗时,可设置
gamma=10~50
提亮;偏亮时设置
gamma=-10~-30
变暗。

三、完整实现代码(可直接运行)

以下代码基于Visual Studio + OpenCV环境编写,实现了「用户输入权重→读取两张图像→线性融合→显示结果」的完整流程:


#include <opencv2/opencv.hpp>
#include <iostream>

// 引入OpenCV和标准库命名空间,简化代码
using namespace cv;
using namespace std;

int main(void)
{
    double alpha, beta;     // 两张图像的权重
    double input;           // 存储用户输入的alpha值
    Mat src1, src2, dst;    // 源图像1、源图像2、目标融合图像

    // 交互:让用户输入alpha值(0~1之间)
    cout << "==================== 简易图像线性融合工具 ====================" << endl;
    cout << "融合公式:dst = src1 × alpha + src2 × (1 - alpha) + 0.0" << endl;
    cout << "------------------------------------------------------------" << endl;
    cout << "请输入src1的权重(0~1之间,如0.3表示src1占30%,src2占70%):";
    cin >> input;

    // 输入验证:确保alpha在有效范围
    if (input >= 0 && input <= 1)
    {
        alpha = input;
        beta = 1.0 - alpha;  // 自动计算src2的权重,保证总和为1
    }
    else
    {
        cout << "输入错误!alpha值必须在0~1之间,请重新运行程序。" << endl;
        return -1;
    }

    // 读取两张待融合的图像(注意路径格式:双反斜杠或单斜杠/)
    src1 = imread("C:imagesLinuxLogo.jpg");  // 替换为你的图像路径
    src2 = imread("C:imagesWindowsLogo.jpg");// 替换为你的图像路径

    // 检查图像1是否读取成功
    if (src1.empty())
    {
        cout << "错误:无法读取src1图像!请检查路径是否正确。" << endl;
        return -1;
    }
    // 检查图像2是否读取成功
    if (src2.empty())
    {
        cout << "错误:无法读取src2图像!请检查路径是否正确。" << endl;
        return -1;
    }

    // 关键检查:确保两张图像尺寸和类型一致
    if (src1.size() != src2.size() || src1.type() != src2.type())
    {
        cout << "错误:两张图像的尺寸(宽高)或像素类型不一致,无法融合!" << endl;
        return -1;
    }

    // 核心操作:调用addWeighted实现线性融合
    addWeighted(
        src1,    // 源图像1
        alpha,   // 图像1的权重
        src2,    // 源图像2
        beta,    // 图像2的权重
        0.0,     // gamma亮度因子(默认0.0)
        dst      // 输出的融合图像
    );

    // 创建显示窗口(WINDOW_AUTOSIZE:窗口大小自适应图像)
    namedWindow("图像线性融合结果", WINDOW_AUTOSIZE);
    imshow("图像线性融合结果", dst);  // 显示融合后的图像

    // 等待按键输入(0表示无限等待,按任意键关闭窗口)
    waitKey(0);
    destroyAllWindows();  // 释放窗口资源,避免内存泄漏

    return 0;
}

四、代码使用说明

1. 环境配置前提

已安装Visual Studio(2019/2022均可)已配置OpenCV环境(包含目录、库目录、附加依赖项)两张待融合的图像(建议尺寸相同,如500×500像素,格式为JPG/PNG)

2. 快速上手步骤

准备两张图像,放入
C:images
目录(或修改代码中的图像路径)确保两张图像的宽高、通道数一致(可通过画图工具调整尺寸)编译运行程序,按提示输入0~1之间的alpha值(如0.5表示两张图像各占50%)查看融合结果,按任意键关闭窗口

3. 常见问题排查

图像读取失败:检查路径是否正确(如
C:images
是否存在,文件名是否拼写错误)融合报错:确认两张图像尺寸一致(右键图像→属性→详细信息查看宽高)画面过曝/过暗:调整alpha值,或修改
addWeighted
的gamma参数(如设为10提亮)

五、扩展应用场景

掌握
addWeighted
后,可实现更多实用功能:

水印添加:将水印图像(src2)设置较低权重(如beta=0.2),叠加到原图(src1)上,实现半透明水印。图像过渡动画:循环改变alpha值(从0→1或1→0),生成两张图像的平滑过渡视频。图像增强:将同一场景的曝光正常图与提亮图融合,改善暗部细节。

总结

本文详细介绍了OpenCV中
addWeighted
函数的语法规则、参数含义和使用注意事项,并通过完整代码实现了图像线性融合。核心要点如下:

融合的关键是
src1

src2
的尺寸、通道数必须一致;权重分配虽然不限制,但是建议遵循
alpha + beta = 1
,避免画面失真;
gamma
参数可灵活调整融合图像的亮度。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
夜睐的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容