在Python中把一个图像叠加在另一个图像上
叠加一个图像是指将一个图像的数据复制到另一个图像上的过程。叠加也可以指其他类型的图像处理方法,如叠加类似的图像进行降噪,混合等。但现在,我们将集中讨论前一种方法。在这篇文章中,我们将学习如何用图像处理方法在另一图像上叠加一个图像。
需要的模块:
Pillow: Python Imaging Library(PIL的扩展)是Python语言事实上的图像处理包。它集成了轻量级的图像处理工具,用于编辑、创建和保存图像。
pip install pillow
出于示范目的,我们将使用以下图像作为主图像。
例子1:叠加一个alpha图像。
如果我们在一个不透明的图像上叠加一个包含透明区域的图像,那么在最终的图像中,只有被叠加的图像的不透明区域会出现。像素可能不是完全不透明的,因此可以有模拟不透明度(alpha通道)。这种类型的叠加是最主要的,因为它可以使图像无缝地混合在一起。
为了覆盖图像,我们将使用pillow库中的paste()函数。
语法: paste(self, im, box=None, mask=None)
将另一个图像粘贴到这个图像中。
参数:
- im:源图像或像素值(整数或元组)。
- box:一个可选的4元组,给出要粘贴的区域。如果用一个2元组代替,它将被视为左上角。如果省略或没有,源文件将被粘贴到左上角。
- mask: 一个可选的遮罩图像。
为了演示,我们将叠加以下图片:
以下是实现情况:
from PIL import Image
# Opening the primary image (used in background)
img1 = Image.open(r"BACKGROUND_IMAGE_PATH")
# Opening the secondary image (overlay image)
img2 = Image.open(r"OVERLAY_IMAGE_PATH")
# Pasting img2 image on top of img1
# starting at coordinates (0, 0)
img1.paste(img2, (0,0), mask = img2)
# Displaying the image
img1.show()
输出:
解释:
首先,我们打开主图像并将其图像对象保存到变量img1。然后我们打开将被用作覆盖的图像,并将其图像对象保存到变量img2中。然后我们调用粘贴方法,将传递的图像覆盖/粘贴在img1上。第一个参数是img2,它是包含透明文本的图像对象。这张图片将被用于叠加。第二个参数是一个大小为2的元组,表示img1的坐标,img2应该被粘贴在那里。因为它是(0, 0),所以第二张图片将被粘贴在img1的左上方。第三个参数是img2,它被传递给mask参数。它将为img2指定透明度掩码。最后,我们显示了图像。
例子2:叠加非阿尔法图像
如果我们将一个完全不透明的图像叠加在一个不透明的图像上,被叠加图像的所有像素值都会保留在最终的图像中。在这个过程中,背景图像的像素值会在这个过程中丢失(在被覆盖的图像占据的区域)。
我们将使用以下图像作为覆盖图像。
以下是实现情况:
from PIL import Image
img1 = Image.open(r"BACKGROUND_IMAGE_PATH")
img2 = Image.open(r"OVERLAY_IMAGE_PATH")
# No transparency mask specified,
# simulating an raster overlay
img1.paste(img2, (0,0))
img1.show()
输出:
解释:
这段代码与前面的基本相同,所以只有改变后的代码是我们感兴趣的。在粘贴方法的调用中,我们省略了mask参数,这使得覆盖层没有使用透明度掩码。因此,图像被简单地复制粘贴到img1上。由于img2的像素值被原样复制,白色背景也出现在输出的图像中。这给观看者提供了一个线索,即由于在最终图像中发现了突然的颜色变化,图像被修改了,而没有过多考虑最终图像的质量(当覆盖的图像包含透明区域时,这种情况会有所缓解)。