python学opencv|读取图像(四十二)使用cv2.add()函数实现多图像叠加

【1】引言

前序学习过程中,掌握了灰度图像和彩色图像的掩模操作:

python学opencv|读取图像(九)用numpy创建黑白相间灰度图_numpy生成全黑图片-CSDN博客

python学opencv|读取图像(四十)掩模:三通道图像的局部覆盖-CSDN博客

也受此启发,尝试直接使用cv2.add()函数让两张图片进行叠加:

python学opencv|读取图像(四十一 )使用cv2.add()函数实现各个像素点BGR叠加-CSDN博客

在此基础上,我们如果进一步尝试,就可以对3张图片进行叠加。

比如,我们已经知晓彩色三通道图像的每一个通道都可以单独设置对应BGR值,它们叠加的效果是新的彩色图像。实际上,这种叠加效果我们早期在没有使用cv2.add()函数的时候,已经悄然获得了:

python学opencv|读取图像(十)用numpy创建彩色图像_cv2 通过numpy创建图像-CSDN博客

此时,在已经、学习了cv2.add()函数的基础上,我们可以进一步验证。

【2】可行性分析

【2.1】未使用cv.add()函数

在python学opencv|读取图像(十)用numpy创建彩色图像_cv2 通过numpy创建图像-CSDN博客文章中,使用的代码为:

import numpy as np  # 引入numpy模块
import cv2 as cv  # 引入cv2模块
from imageio.v2 import imwrite# 定义图像
t = np.arange(300, 600, 20)  # 定义变量,在[300,600)区间,每隔20取一个值
t_max = np.max(t)  # 取变量最大值作为像素大小
print('t_max=', t_max)  # 输出最大值
image = np.zeros([t_max, t_max, 3], np.uint8)  # 定义一个竖直和水平像素均为t_max的全0矩阵
image[:, :, 0] = 155  # 第一个通道值
image[:, :, 1] = 200  # 第二个通道值
image[:, :, 2] = 255  # 第三个通道值# 显示和保存定义的图像
cv.imshow('display-pho', image)  # 显示图像
cv.imwrite('gray-pho-3.png', image)  # 保存图像
cv.waitKey()  # 图像不关闭
cv.destroyAllWindows()  # 释放所有窗口

这其中的核心代码段,有一个逐层覆盖和叠加的效果:

image[:, :, 0] = 155  # 第一个通道值
image[:, :, 1] = 200  # 第二个通道值
image[:, :, 2] = 255  # 第三个通道值

【2.2】使用cv.add()函数

为验证使用add()函数的叠加效果,在上述代码后面补充一段代码:

image1 = np.zeros([t_max, t_max, 3], np.uint8)  # 定义一个竖直和水平像素均为t_max的全0矩阵
image1[:, :, 0] = 155  # 第一个图像
image2 = np.zeros([t_max, t_max, 3], np.uint8)  # 定义一个竖直和水平像素均为t_max的全0矩阵
image2[:, :, 1] = 200  # 第二个图像
image3 = np.zeros([t_max, t_max, 3], np.uint8)  # 定义一个竖直和水平像素均为t_max的全0矩阵
image3[:, :, 2] = 255  # 第三个图像
img=cv.add(image1,image2) # 第一和第二图像叠加
cv.imshow('display-12', img)  # 显示图像
cv.imwrite('gray-pho-12.png', img)  # 保存图像
img=cv.add(img,image3) # 第一、第二和第三图像叠加
cv.imshow('display-123', img)  # 显示图像
cv.imwrite('gray-pho-123.png', img)  # 保存图像

运行代码后,获得的图像为:

图1 gray-pho-3.png-未使用add()函数

图2 gray-pho-123.png-使用add()函数 

由图1和图2可见,无论是否使用add()函数,图像叠加的本质都是各个通道的BGR值对应相加,获得的图像效果是一样的。

此外,中间的过渡图像,也就是image1[:, :, 0] = 155和image1[:, :,1] = 200叠加后的图像为:

图3 gray-pho-12.png-使用add()函数

【2.3】使用cv.add()函数+掩模效果

在前述的两个测试中,使用的图像叠加都没有尝试掩模效果。

但add()函数本身允许添加一个mask参数来做掩模效果,为验证掩模效果,继续增加下述代码:

#验证掩模效果
mask=np.zeros((t_max, t_max,1),np.uint8)   # 定义一个竖直和水平像素均为t_max的全0矩阵
mask[20:300, 200:500, ] = 200  # 第二个图像
cv.imshow('display-mask', mask)  # 显示图像
cv.imwrite('gray-pho-mask.png',mask)  # 保存图像
img=cv.add(image1,image2,mask=mask) # 第一和第二图像叠加
cv.imshow('display-12-mask', img)  # 显示图像
cv.imwrite('gray-pho-12-mask.png', img)  # 保存图像

这里应用掩模效果的核心代码为:

img=cv.add(image1,image2,mask=mask) # 第一和第二图像叠加

代码运行后的掩模效果为:

图4 gray-pho-12-mask.png-使用add()函数

由图4可见,图像只在使用掩模的区域进行了效果叠加,其他区域仍然保留了全0矩阵对应的纯黑色画布特点。

因为刚好掩模的矩阵赋值也是200,和image2的通道赋值一样,为进一步测试,把这个掩模的矩阵赋值改到255,增加下述代码:

mask1=np.zeros((t_max, t_max,1),np.uint8)   # 定义一个竖直和水平像素均为t_max的全0矩阵
mask1[20:300, 200:500, ] = 255  # 第二个图像
cv.imshow('display-mask', mask1)  # 显示图像
cv.imwrite('gray-pho-mask.png',mask1)  # 保存图像
img=cv.add(image1,image2,mask=mask1) # 第一和第二图像叠加
cv.imshow('display-123-mask', img)  # 显示图像
cv.imwrite('gray-pho-123-mask.png', img)  # 保存图像

此时获得的图像为:

图5 gray-pho-mask.png-掩模

图6 gray-pho-123-mask.png-使用add()函数+掩模

可见,使用掩模效果后,图像依然是image1+image2的效果,且只在掩模控制的区域显示这个叠加效果。

此时的完整代码为:

import numpy as np  # 引入numpy模块
import cv2 as cv  # 引入cv2模块
from imageio.v2 import imwrite# 定义图像
t = np.arange(300, 600, 20)  # 定义变量,在[300,600)区间,每隔20取一个值
t_max = np.max(t)  # 取变量最大值作为像素大小
print('t_max=', t_max)  # 输出最大值
image = np.zeros([t_max, t_max, 3], np.uint8)  # 定义一个竖直和水平像素均为t_max的全0矩阵
image[:, :, 0] = 155  # 第一个通道值
image[:, :, 1] = 200  # 第二个通道值
image[:, :, 2] = 255  # 第三个通道值# 显示和保存定义的图像
cv.imshow('display-pho', image)  # 显示图像
cv.imwrite('gray-pho-3.png', image)  # 保存图像image1 = np.zeros([t_max, t_max, 3], np.uint8)  # 定义一个竖直和水平像素均为t_max的全0矩阵
image1[:, :, 0] = 155  # 第一个图像
image2 = np.zeros([t_max, t_max, 3], np.uint8)  # 定义一个竖直和水平像素均为t_max的全0矩阵
image2[:, :, 1] = 200  # 第二个图像
image3 = np.zeros([t_max, t_max, 3], np.uint8)  # 定义一个竖直和水平像素均为t_max的全0矩阵
image3[:, :, 2] = 255  # 第三个图像
img=cv.add(image1,image2) # 第一和第二图像叠加
cv.imshow('display-12', img)  # 显示图像
cv.imwrite('gray-pho-12.png', img)  # 保存图像
img=cv.add(img,image3) # 第一、第二和第三图像叠加
cv.imshow('display-123', img)  # 显示图像
cv.imwrite('gray-pho-123.png', img)  # 保存图像#验证掩模效果
mask=np.zeros((t_max, t_max,1),np.uint8)   # 定义一个竖直和水平像素均为t_max的全0矩阵
mask[20:300, 200:500, ] = 200  # 第二个图像
cv.imshow('display-mask', mask)  # 显示图像
cv.imwrite('gray-pho-mask.png',mask)  # 保存图像
img=cv.add(image1,image2,mask=mask) # 第一和第二图像叠加
cv.imshow('display-12-mask', img)  # 显示图像
cv.imwrite('gray-pho-12-mask.png', img)  # 保存图像mask1=np.zeros((t_max, t_max,1),np.uint8)   # 定义一个竖直和水平像素均为t_max的全0矩阵
mask1[20:300, 200:500, ] = 255  # 第二个图像
cv.imshow('display-mask', mask1)  # 显示图像
cv.imwrite('gray-pho-mask.png',mask1)  # 保存图像
img=cv.add(image1,image2,mask=mask1) # 第一和第二图像叠加
cv.imshow('display-123-mask', img)  # 显示图像
cv.imwrite('gray-pho-123-mask.png', img)  # 保存图像cv.waitKey()  # 图像不关闭
cv.destroyAllWindows()  # 释放所有窗口

【3】总结

掌握了使用python+opencv实现使用cv2.add()函数进行多图像叠加的技巧,并探索了掩模的影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/6864.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于C语言的数组从入门到精通

简介:本篇文章主要介绍了一维数组,二维数组,字符数组的定义,数组的应用,数组的核心代码解析,适用于0基础的初学者. C语言数组 1.一维数组 1.1定义 1.1.1声明 语法:数据类型 数组名[数组大小];示例:int arr[5]; 1.1.2初始化 a.静态初始化 完全初始化:int arr[5] {1…

【kong gateway】5分钟快速上手kong gateway

kong gateway的请求响应示意图 安装 下载对应的docker 镜像 可以直接使用docker pull命令拉取,也可以从以下地址下载:kong gateway 3.9.0.0 docker 镜像 https://download.csdn.net/download/zhangshenglu1/90307400, postgres-13.tar http…

python 安装插件 requests 下载免费简历(自学7)

安装 requests 库: 他们三个 按一个就行 pip install requests 或者 pip3 install requests 或者 conda install requests 代码 每次只可以下载一页的 简历模板 需要手动修改 id ### import requests from lxml import etree import osif __name__ "__…

西门子【Library of General Functions (LGF) for SIMATIC S7-1200 / S7-1500】

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 通用函数库 (LGF) 扩展了 TIA Portal 中用于 PLC 编程的 STEP 7 指令(数学函数、时间、计数器 等)。该库可以不受限制地使用,并包含 FIFO 、搜索功能、矩阵计算、 astro 计…

最新最详细的配置Node.js环境教程

配置Node.js环境 一、前言 (一)为什么要配置Node.js?(二)NPM生态是什么(三)Node和NPM的区别 二、如何配置Node.js环境 第一步、安装环境第二步、安装步骤第三步、验证安装第四步、修改全局模块…

黑龙江锅包肉:酸甜香酥的东北经典

黑龙江锅包肉:酸甜香酥的东北经典 黑龙江锅包肉,作为东北菜的代表之一,尤其在黑龙江省哈尔滨市享有极高的声誉。这道美食不仅承载着丰富的历史文化内涵,更以其鲜明的地域特色,成为了黑龙江省乃至整个东北地区的标志性菜肴。 历史渊源 锅包肉的历史可以追溯到清朝光绪年间,其…

linux——网络基础

文章目录 目录 文章目录 踏入网络世界:探索 Linux 网络的无垠天地 一、网络发展 早期单机处理模式 网络发展的需求催生 网络发展后的优势对比 二、局域网or广域网 典型局域网架构 广域网连接多个局域网 二者关系 三、协议 语言层与汉语协议 通信设备层与电话机协议 …

挖掘机的市场现状和发展前景:全球增长潜力,重塑基础设施建设新篇章

引言:工程机械的心脏,挖掘机的崛起之路 在现代化建设的浪潮中,挖掘机作为工程机械领域的核心设备,正以其强大的作业能力和广泛的应用场景,成为推动全球基础设施建设不可或缺的力量。从高速公路到大型矿场,…

tkinter绘制组件(44)——浮出ui控件

tkinter绘制组件(44)——浮出ui控件 引言布局函数结构ui框架对齐方向绑定已有控件出现和隐藏逻辑出现和隐藏动画完整代码函数 效果测试代码最终效果 github项目pip下载 引言 TinUI的浮出ui控件(flyout)其实是一个之间创建在UI框架…

【Unity3D】《跳舞的线》游戏的方块单方向拉伸实现案例

通过网盘分享的文件:CubeMoveMusic.unitypackage 链接: https://pan.baidu.com/s/1Rq-HH4H9qzVNtpQ84WXyUA?pwda7xn 提取码: a7xn 运行游戏点击空格动态创建拉伸的方块,由Speed控制速度,新方向是随机上下左右生成。 using System.Collect…

新版IDEA创建数据库表

这是老版本的IDEA创建数据库表,下面可以自己勾选Not null(非空),Auto inc(自增长),Unique(唯一标识)和Primary key(主键) 这是新版的IDEA创建数据库表,Not null和Auto inc可以看得到,但Unique和Primary key…

jmeter中对接口进行循环请求后获取相应数据

1、工作中遇到一个场景就是对某个单一接口进行循环请求,并需要获取每次请求后返回的相应数据; 2、首先就在jmeter对接口相关组件进行配置,需要组件有:循环控制器、CSV数据文件设置、计数器、访问接口、HTTP信息头管理器、正则表达…

【含代码】逆向获取 webpack chunk 下的__webpack_require__ 函数,获悉所有的模块以及模块下的函数

背景 Webpack 打包后的代码是不会直接暴露 __webpack_require__ 函数,目的是为了避免污染全局变量同时也为了保护 webpack 的打包后的模块都隐藏在闭包函数里,达到数据的安全性。 而有时我们为了测试某个函数,想直接获取这个内置函数&#…

最新常见的图数据库对比,选型,架构,性能对比

图数据库排名 地址:https://db-engines.com/en/ranking/graphdbms 知识图谱查询语言 SPARQL、Cypher、Gremlin、PGQL 和 G-CORE 语法 / 语义 / 特性 SPARQL Cypher Gremlin PGQL G-CORE 图模式匹配查询 语法 CGP CGP CGP(无可选)1 CGP CGP 语义 子…

CentOS7使用源码安装PHP8教程整理

CentOS7使用源码安装PHP8教程整理 下载安装包解压下载的php tar源码包安装所需的一些依赖扩展库安装前的配置修改配置文件1、进入php8的安装包 配置环境变量开机自启启动服务创建软连接常见问题1、checking for icu-uc > 50.1 icu-io icu-i18n... no2、configure: error: Pa…

php-phar打包避坑指南2025

有很多php脚本工具都是打包成phar形式,使用起来就很方便,那么如何自己做一个呢?也找了很多文档,也遇到很多坑,这里就来总结一下 phar安装 现在直接装yum php-cli包就有phar文件,很方便 可通过phar help查看…

博睿数据获中国信通院泰尔终端实验室致谢!

近日,博睿数据收到中国信息通信研究院(以下简称“中国信通院”)的感谢信,信中对博睿数据积极参与信通院牵头的“铸基计划——高质量数字化转型推进行动”,并在新技术研究、标准建设、课题共创、专家智库等多项工作中提…

分布式理解

分布式 如何理解分布式 狭义的分布是指,指多台PC在地理位置上分布在不同的地方。 分布式系统 分布式系**统:**多个能独立运行的计算机(称为结点)组成。各个结点利用计算机网络进行信息传递,从而实现共同的“目标或者任…

centos哪个版本建站好?centos最稳定好用的版本

在信息化飞速发展的今天,服务器操作系统作为构建网络架构的基石,其稳定性和易用性成为企业和个人用户关注的重点。CentOS作为一款广受欢迎的开源服务器操作系统,凭借其强大的性能、出色的稳定性和丰富的软件包资源,成为众多用户建…

计算机网络 (58)无线局域网WLAN

前言 无线局域网WLAN(Wireless Local Area Network)是一种利用无线通信技术将计算机设备互联起来,构成可以互相通信和实现资源共享的网络体系。 一、定义与特点 定义: WLAN通过无线信道代替有线传输介质连接两个或多个设备形成一个…