当前位置: 首页 > news >正文

OpenCV图像加权函数:addWeighted

1 addWeighted函数

在OpenCV 里,addWeighted 函数的作用是对两个图像进行加权求和,常用于图像融合、图像过渡等场景。函数如下:

cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])

2 参数解释

  • src1:第一个输入图像。
  • alpha:第一个输入图像的权重,取值范围是 0 到 1。
  • src2:第二个输入图像,它的大小和通道数必须与 src1 相同。
  • beta:第二个输入图像的权重,取值范围是 0 到 1。
  • gamma:标量值,添加到加权和中(通常用于亮度调整)。
  • dst:输出图像(可选参数,直接通过返回值获取)。
  • dtype:输出图像的可选深度,若未指定,则使用输入图像的深度。

该函数将两个图像按权重相加,实现图像的线性混合,其数学公式为:
d s t = α ∗ s r c 1 + β ∗ s r c 2 + γ dst = \alpha * src1 + \beta * src2 + \gamma dst=αsrc1+βsrc2+γ

3 注意

  1. 图像尺寸和通道数src1src2 必须具有相同的尺寸和通道数,否则会报错。
  2. 权重和alpha + beta 不需要等于 1,但若想实现透明度混合(如 alpha + beta = 1),需自行控制。
  3. 数据类型:若输入为 uint8 类型,结果会自动截断到 [0, 255] 范围(饱和操作)。
  4. gamma 的作用:用于调整输出图像的亮度(例如,gamma=10 会使整体亮度增加)。
    • 若 alpha + beta > 1,图像可能过曝(值被截断到 255)。
    • 若 gamma > 0,整体亮度增加;若 gamma < 0,亮度降低。
  5. cv2.add() 的区别cv2.add() 是直接相加(无权重),而 addWeighted() 允许更灵活的线性组合。

4 函数原型

def addWeighted(src1: Mat, alpha, src2: Mat, beta, gamma, dts: Mat = ..., dtype=...) 
from __doc__
    """
    'addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) -> dst  
    . @brief Calculates the weighted sum of two arrays.   
    . The function addWeighted calculates the weighted sum of two arrays as follows:                          
    . \\f[\\texttt{dst} (I)= \\texttt{saturate} ( \\texttt{src1} (I)* \\texttt{alpha} +  \\texttt{src2} (I)* \\texttt{beta} +  \\texttt{gamma} )\\f] 
    . where I is a multi-dimensional index of array elements. In case of multi-channel arrays, each
    . channel is processed independently.   
    . The function can be replaced with a matrix expression:   
    . @code{.cpp}       
    . dst = src1*alpha + src2*beta + gamma;   
    . @endcode   
    . @note Saturation is not applied when the output array has the depth CV_32S. You may even get   
    . result of an incorrect sign in the case of overflow.   
    . @param src1 first input array.   
    . @param alpha weight of the first array elements.  
    . @param src2 second input array of the same size and channel number as src1.               
    . @param beta weight of the second array elements.  
    . @param gamma scalar added to each sum.   
    . @param dst output array that has the same size and number of channels as the input arrays.  
    . @param dtype optional depth of the output array; when both input arrays have the same depth, dtype   
    . can be set to -1, which will be equivalent to src1.depth().   
    . @sa  add, subtract, scaleAdd, Mat::convertTo'
    """
    pass

5 函数应用

  1. 图像叠加:例如,在制作幻灯片过渡效果时,就可以使用该函数实现图像的平滑过渡:通过调整 alphabeta 实现淡入淡出效果。

  2. ROI 混合:结合掩码(mask)对局部区域进行混合:

roi = img1[y:y+h, x:x+w]
blended_roi = cv2.addWeighted(roi, 0.5, img2_roi, 0.5, 0)
img1[y:y+h, x:x+w] = blended_roi

6 示例代码

代码如下:

import cv2

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

# 定义权重
alpha = 0.7
beta = 0.3
gamma = 0

# 进行加权求和
result = cv2.addWeighted(image1, alpha, image2, beta, gamma)

# 显示结果
cv2.imshow("Touxiang", image1)
cv2.imshow("Zi", image2)
cv2.imshow('Weighted Image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

通过以上代码,可以将两张图片融合,配置不同的alpha和beta值,可以得到不同融合效果。

融合前:
在这里插入图片描述
融合后:
在这里插入图片描述

相关文章:

  • TSN CB:恢复算法与潜在错误检测
  • 动态规划----完全平方数(3种写法,逐步简化)
  • cursor中使用prettier-code formatter插件方法
  • 六十天前端强化训练之第十七天React Hooks 入门:useState 深度解析
  • 基于 GEE 利用 Sentinel-1 双极化数据计算 SDWI 指数实现逐月提取水域面积
  • CFD交易与传统股票交易在交易机制上存在哪些显著差异
  • 矩阵交换行(信息学奥赛一本通-1119)
  • Compose笔记(九)--Checkbox
  • 【eNSP实战】使用高级ACL实现单向Ping
  • 基于UniApp + Vue3开发的智能汉字转拼音工具
  • 【前端三剑客】万字总结JavaScript
  • 【6*】差分约束系统学习笔记
  • nerfstudio以及相关使用记录(长期更新)
  • 【STM32】NVIC(嵌套向量中断控制器)
  • 【蓝桥】-动态规划-倒水
  • AI Agent席卷B端:解锁部门效率新玩法,挑战企业软件的智能革命
  • Git常用操作之GitLab
  • 元萝卜 1.0.9| 免root无限多开,支持Xposed模块和微信平板模式
  • 热修复框架Tinker与Robust原理剖析
  • python 类的相关知识, 介绍一下类的定义,创建类的实例,构造方法,创建类的成员并访问,以及访问限制的知识
  • 四川省政府党组成员、副省长、省公安厅厅长叶寒冰接受审查调查
  • 国家消防救援局应急通信和科技司负责人张昊接受审查调查
  • 以色列媒体:以总理称将接管整个加沙
  • 特朗普与普京通话前夕,英美法德意领导人通话讨论俄乌问题
  • 释新闻|拜登确诊恶性前列腺癌,预后情况如何?
  • 中国旅游日|上天当个“显眼包”!低空经济的“飞”凡魅力