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

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.kler.cn/a/516210.html

相关文章:

  • 私有IP、VLAN和VPC,分别适合哪些场景你知道吗?
  • 【k8s】k8s部署Argo CD
  • python如何导出数据到excel文件
  • 详细介绍:Kubernetes(K8s)的技术架构(核心概念、调度和资源管理、安全性、持续集成与持续部署、网络和服务发现)
  • 不重启JVM,替换掉已经加载的类
  • 26. 【.NET 8 实战--孢子记账--从单体到微服务】--需求更新--用户注销、修改用户名、安全设置
  • cudatex文本编辑器
  • 备赛蓝桥杯之第十五届职业院校组省赛第一题:智能停车系统
  • go理论知识记录(入门)
  • 两台局域网电脑通过飞秋传输大文件失败的解决方案
  • python 统计相同像素值个数
  • 03垃圾回收篇(D4_彻底理解GC)
  • rust feature h和 workspace相关知识 (十一)
  • 【前端】Hexo 建站指南
  • 手机号码归属地与IP属地:两者差异深度解析
  • 图生3d算法学习笔记
  • 结构化布线系统分为六个子系统
  • MySQL 排序规则(COLLATE)详解
  • MySQL进阶之窗口函数
  • 从hello-web入手反混淆和disable_function绕过
  • 8.3 DALL·E 3:AI 文生图的颠覆性革命,为你的灵感插上翅膀
  • PID控制的优势与LabVIEW应用
  • 如何使用 Nginx 配置反向代理?
  • 调用deepseek API
  • java.sql.Date 弃用分析与替代方案
  • Jenkins下载 Maven、Allure 插件并且配置环境