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

  • Post category:Python

在Python中将一个图像叠加在另一个图像上,可以通过以下步骤来完成:

  1. 加载原始图像和待叠加的图像。在Python中,可以使用Pillow库来加载图像。在加载图像之前,需要确保Pillow库已经正确安装。下面是一个示例:
from PIL import Image

# 加载原始图像和待叠加的图像
bg_img = Image.open('bg.png')
fg_img = Image.open('fg.png')
  1. 调整待叠加的图像的大小和位置。在将待叠加的图像叠加到原始图像上之前,需要根据需要调整待叠加的图像的大小和位置。在Pillow库中,可以使用resize()函数和crop()函数来调整图像大小和位置。下面是一个示例:
# 调整待叠加的图像大小
resize_ratio = 0.5 # 缩小一半
fg_img = fg_img.resize((int(fg_img.width * resize_ratio), 
                        int(fg_img.height * resize_ratio)))

# 调整待叠加的图像位置
position = (100, 100) # 在原始图像的左上角附近
bg_img.paste(fg_img, position)
  1. 将待叠加的图像叠加到原始图像上。在Pillow库中,可以使用paste()函数将待叠加的图像叠加到原始图像上。下面是一个示例:
# 将待叠加的图像叠加到原始图像上
bg_img.paste(fg_img, position, mask=fg_img) # 使用掩码避免透明部分被叠加

下面是一个完整的示例,其中将一个图像叠加在另一个图像上,并将叠加后的图像保存为新的图像文件:

from PIL import Image

# 加载原始图像和待叠加的图像
bg_img = Image.open('bg.png')
fg_img = Image.open('fg.png')

# 调整待叠加的图像大小
resize_ratio = 0.5 # 缩小一半
fg_img = fg_img.resize((int(fg_img.width * resize_ratio), 
                        int(fg_img.height * resize_ratio)))
# 调整待叠加的图像位置
position = (100, 100) # 在原始图像的左上角附近

# 将待叠加的图像叠加到原始图像上
bg_img.paste(fg_img, position, mask=fg_img) # 使用掩码避免透明部分被叠加

# 保存叠加后的图像
bg_img.save('output.png')

在下面的示例中,我们将使用OpenCV库将一个图像叠加在另一个图像上:

import cv2

# 加载原始图像和待叠加的图像
bg_img = cv2.imread('bg.png')
fg_img = cv2.imread('fg.png', cv2.IMREAD_UNCHANGED)

# 调整待叠加的图像大小
resize_ratio = 0.5 # 缩小一半
fg_img = cv2.resize(fg_img, 
                    (int(fg_img.shape[1] * resize_ratio), 
                     int(fg_img.shape[0] * resize_ratio)))

# 将待叠加的图像叠加到原始图像上
position = (100, 100) # 在原始图像的左上角附近
y1, y2 = position[0], position[0] + fg_img.shape[0]
x1, x2 = position[1], position[1] + fg_img.shape[1]
alpha_s = fg_img[:, :, 3] / 255.0 # 计算alpha通道的值
alpha_l = 1.0 - alpha_s
for c in range(0, 3):
    bg_img[y1:y2, x1:x2, c] = (alpha_s * fg_img[:, :, c] + 
                               alpha_l * bg_img[y1:y2, x1:x2, c])

# 保存叠加后的图像
cv2.imwrite('output.png', bg_img)

在这个示例中,我们首先使用OpenCV的imread()函数加载原始图像和待叠加的图像。与Pillow库中的RGB模式不同,OpenCV库以BGR模式加载图像。

然后,我们使用resize()函数调整待叠加的图像的大小,并将待叠加的图像叠加到原始图像上。更具体地说,我们首先计算alpha通道的值,并使用alpha通道将待叠加的图像叠加到原始图像上。最后,我们使用imwrite()函数保存叠加后的图像。