暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OpenCV-Python - 核心功能 - 使用 OpenCV 添加(混合)两个图像

数据库杂货铺 2022-01-23
339

使用 OpenCV 添加(混合)两个图像

 

目标

 

在本文中将学习:

 

 什么是线性混合以及为什么它有用;

 

 如何使用 addWeighted() 添加两个图像

 

理论

 

请注意

 

下面的解释来自 Richard Szeliski 的《计算机视觉: 算法和应用》一书

 

在之前的教程中,我们已经知道了一些像素运算符。一个有趣的二元(双输入)运算符是线性混合运算符:


g(x)=(1α)f0(x)+αf1(x)


通过改变 α 值从 01,这个运算可以用于在两个图像或视频之间执行时间上的交叉融合,就像在幻灯片放映和电影制作中看到的那样(很酷,不是吗?)

 

源码

 

from __future__ import print_function
import cv2 as cv


alpha = 0.5
try:
raw_input # Python 2
except NameError:
raw_input = input # Python 3


print(''' 简易线性混合器
-----------------------
* 请输入 alpha [0.0-1.0]: ''')
input_alpha = float(raw_input().strip())


if 0 <= alpha <= 1:
alpha = input_alpha


# 加载
src1 = cv.imread('python.jpg')
src2 = cv.imread('opencv.jpg')


if src1 is None:
print("加载 src1 错误")
exit(-1)
elif src2 is None:
print("加载 src2 错误")
exit(-1)


# 混合图像
beta = (1.0 - alpha)
dst = cv.addWeighted(src1, alpha, src2, beta, 0.0)


# 显示图像
cv.imshow('dst', dst)
cv.waitKey(0)


cv.destroyAllWindows()
复制

 

 

两个原图分别为:




解释

 

因为我们要执行:

g(x)=(1α)f0(x)+αf1(x)

 

我们需要两个源图像(f0(x)  f1(x))。因此,我们以通常的方式加载它们:


src1 = cv.imread('python.jpg')
src2 = cv.imread('opencv.jpg')
复制

 

警告

我们要添加的 src1  src2 必须具有相同的大小(宽度和高度)和类型。

 

现在我们需要生成 g(x) 图像。使用函数 addWeighted() 非常方便:

 

beta = (1.0 - alpha)
dst = cv.addWeighted(src1, alpha, src2, beta, 0.0)
复制

 

上述代码的 Numpy 版本(但 cv 函数大约快2倍):

 

dst = np.uint8(alpha*(img1)+beta*(img2))
复制

 

由于 addWeighted() 产生:


dst=αsrc1+βsrc2+γ


在本例子中,gamma 在上述代码中是 0.0

 

创建窗口,显示图像并等待用户结束程序。

 

cv.imshow('dst', dst)
cv.waitKey(0)
复制

 

结果:

 

(venv) c:\Python310test>python demo.py

 简易线性混合器

-----------------------

* 请输入 alpha [0.0-1.0]:

0.6



 

 

官方文档:

https://docs.opencv.org/4.5.5/d5/d98/tutorial_mat_operations.html


文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论