详解在Python中把一个图像叠加在另一个图像上

  • Post category:Python

在Python中,我们可以使用OpenCV库来实现将一张图片叠加在另一张图片上,以下是详细的步骤:

  1. 为两张图片导入必要的库

首先需要导入OpenCV和numpy库:

import cv2
import numpy as np
  1. 读入两张图片和颜色透明度调整

可以利用“cv2.imread”函数来读取图片,并使用“cv2.resize”函数对图片进行缩放:

# 读取底图和叠加图,注意通道数量要一致
img1 = cv2.imread('image1.png',cv2.IMREAD_UNCHANGED)
img2 = cv2.imread('image2.png',cv2.IMREAD_UNCHANGED)

# 调整叠加图的透明度(alpha)
alpha = 0.5

# 对叠加图的透明度进行调整
overlay = cv2.addWeighted(img1, alpha, img2, 1-alpha, 0)
  1. 图像叠加

实现两张图片的叠加可以使用“cv2.addWeighted”函数。

该函数有5个参数,分别是:
src1:第一张图片
alpha:第一张图片的权重
src2:第二张图片
beta:第二张图片的权重
gamma:标量加到每个和上

下面是一个简单的示例,将图片2叠加在图片1的上方:

# 读取底图和叠加图,注意通道数量要一致
img1 = cv2.imread('image1.png')
img2 = cv2.imread('image2.png')

# 将图片2叠加在图片1上
result = cv2.addWeighted(img1, 1, img2, 1, 0)

在这个示例中,“cv2.addWeighted”函数的alpha、beta参数均为1,即两张图片的权重相等,gamma为0。

  1. 显示结果

完成图像叠加之后,可以使用“cv2.imshow”函数将结果显示出来:

# 显示叠加后的图像
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

完整的代码示例:

import cv2
import numpy as np

# 读取底图和叠加图,注意通道数量要一致
img1 = cv2.imread('image1.png')
img2 = cv2.imread('image2.png')

# 将图片2叠加在图片1上
result = cv2.addWeighted(img1, 1, img2, 1, 0)

# 显示叠加后的图像
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

以下是另一个示例,实现将一张人物图片的轮廓抠出来并叠加在另一张背景图片上的效果:

# 读取背景图片和人物图片
background = cv2.imread('background.jpg')
person = cv2.imread('person.png', cv2.IMREAD_UNCHANGED)

# 生成掩码
mask = person[:,:,3]/255.0

# 抠出人物轮廓,并将其缩放到背景图片大小
person = person[:,:,0:3]
person = cv2.resize(person, (background.shape[1],background.shape[0]))

# 将人物轮廓放到背景图片上
result = np.zeros((background.shape[0],background.shape[1],3), np.uint8)
for i in range(3):
    result[:,:,i] = person[:,:,i]*mask + background[:,:,i]*(1-mask)

# 显示叠加后的图像
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,将人物图片的透明度掩码提取出来,并使用“cv2.resize”将人物图片缩放到与背景图片一样大小。接着,遍历每个通道,将掩码与背景图片按照线性组合的方式相加,得到最终结果。最后使用“cv2.imshow”函数将结果显示出来。