问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

玩转OpenCV图像叠加:cv::addWeighted函数详解与实战

创作时间:
作者:
@小白创作中心

玩转OpenCV图像叠加:cv::addWeighted函数详解与实战

引用
CSDN
8
来源
1.
https://m.blog.csdn.net/weixin_42238129/article/details/144564391
2.
https://m.blog.csdn.net/weixin_43869605/article/details/119918814
3.
https://blog.csdn.net/qq_35037684/article/details/120281223
4.
https://blog.csdn.net/CHNIM/article/details/136621759
5.
https://m.blog.csdn.net/qq_29448131/article/details/140554402
6.
https://blog.csdn.net/qq_26043945/article/details/137039477
7.
https://www.cnblogs.com/qq21497936/p/18502043
8.
https://docs.opencv.ac.cn/4.10.0/d0/d86/tutorial_py_image_arithmetics.html

在图像处理领域,图像叠加是一种常见的操作,它可以将多张图像融合成一张,实现各种视觉效果。OpenCV作为最流行的计算机视觉库之一,提供了强大的图像处理功能,其中cv::addWeighted函数就是实现图像叠加的关键工具。本文将详细介绍这个函数的使用方法和应用场景。

函数定义与参数解释

cv::addWeighted函数的基本定义如下:

cv::addWeighted(src1, alpha, src2, beta, gamma, dst)
  • src1:第一张输入图像,通常是较为重要或需要重点显示的图像。
  • alpha:第一张图像的权重系数,用于控制src1对最终结果的贡献。范围一般在[0, 1]之间。
  • src2:第二张输入图像,通常是背景或需要进行融合的图像。
  • beta:第二张图像的权重系数,用于控制src2对最终结果的贡献。范围一般在[0, 1]之间。
  • gamma:常数加权值,默认值是0。它是对加权后的结果进行的一个常数偏移,用于调整亮度。可以为正、负或零,通常用于调整最终输出图像的亮度。
  • dst:输出图像,类型与输入图像相同。

使用场景

cv::addWeighted函数广泛应用于以下场景:

  1. 图像融合:将两张图像按一定比例叠加,生成更具艺术效果或合成效果的图像。例如,将一个图像的前景叠加在另一个图像的背景上。
  2. 透明度控制:通过调整权重参数,可以实现图像的半透明效果。
  3. 图像特效:通过调整gammaalphabeta,可以对图像进行亮度调整或应用类似遮罩、光影等效果。

代码示例

Python版本

import cv2
import numpy as np

# 读取两张图像
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')

# 确保两张图像尺寸一致
img1 = cv2.resize(img1, (640, 480))
img2 = cv2.resize(img2, (640, 480))

# 设置权重参数
alpha = 0.7
beta = 0.3
gamma = 0

# 使用cv2.addWeighted进行图像叠加
result = cv2.addWeighted(img1, alpha, img2, beta, gamma)

# 显示结果
cv2.imshow('Blended Image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

C++版本

#include <opencv2/opencv.hpp>

int main() {
    // 读取两张图像
    cv::Mat img1 = cv::imread("image1.jpg");
    cv::Mat img2 = cv::imread("image2.jpg");

    // 确保两张图像具有相同的尺寸
    cv::Mat img1_resized, img2_resized;
    if (img1.size() != img2.size()) {
        cv::resize(img1, img1_resized, img2.size(), 0, 0, cv::INTER_LINEAR);
        img2_resized = img2.clone();
    } else {
        img1_resized = img1.clone();
        img2_resized = img2.clone();
    }

    // 定义权重
    double alpha = 0.7; // 第一张图像的权重
    double beta = 0.3;  // 第二张图像的权重
    double gamma = 0;   // 常数值(可选,通常设为0)

    // 使用addWeighted()进行图像融合
    cv::Mat blended_img;
    cv::addWeighted(img1_resized, alpha, img2_resized, beta, gamma, blended_img);

    // 显示融合后的图像
    cv::imshow("Blended Image", blended_img);
    cv::waitKey(0);

    return 0;
}

应用效果展示

上图展示了两张图像叠加的效果,其中第一张图像的权重为0.7,第二张图像的权重为0.3。可以看到,通过调整权重参数,可以实现不同比例的图像融合效果。

注意事项

  1. 图像尺寸:输入的两张图像必须具有相同的尺寸。如果不一致,需要先进行resize操作。
  2. 数据类型:输入图像的数据类型必须相同。如果类型不同,需要先进行转换。
  3. 权重范围alphabeta参数的取值范围一般在[0, 1]之间,但也可以超出这个范围以实现特殊效果。
  4. 性能考虑:对于大规模图像处理任务,需要注意计算效率和内存使用情况。

通过掌握cv::addWeighted函数的使用方法,你可以轻松实现各种图像叠加效果,为图像处理和计算机视觉应用增添更多可能性。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号