【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()函数进行多图像叠加的技巧,并探索了掩模的影响。