PIL从图像中删除背景图像

时间:2016-02-21 03:27:32

标签: python background python-imaging-library

使用背景图片,我是否可以从其他图片中删除该背景并获得所有差异?例如:

enter image description here

enter image description here

假装我保存了这两张图片。如何在保留所有猫的同时从第二张照片中删除第一张照片?

1 个答案:

答案 0 :(得分:2)

根据PIL handbookImageChops模块有一个减法操作:

ImageChops.subtract(image1, image2, scale, offset) => image
Subtracts two images, dividing the result by scale and adding the offset.
If omitted, scale defaults to 1.0, and offset to 0.0.
out = (image1 - image2) / scale + offset

您可以将生成的图像用作猫图像的蒙版:保持蒙版不为零的像素,否则使其成为所需的背景颜色。

以下示例代码:

from PIL import Image
from PIL import ImageChops
image1 = Image.open("image1.jpg") # no cats
image2 = Image.open("image2.jpg") # with cats

image = ImageChops.subtract(image2, image1)

mask1 = Image.eval(image, lambda a: 0 if a <= 24 else 255)
mask2 = mask1.convert('1')

blank = Image.eval(image, lambda a: 0)

new = Image.composite(image2, blank, mask2) 
new.show()

它几乎可以工作: - )

resulting image

两张图片之间的差异比看上去要多一些。因为图像存储为JPG,所以它们是有损的。它们将略微不同地呈现,因此减法操作不会总是导致相同区域中的像素为零(即黑色)。

出于这个原因,我必须使用lambda a: 0 if a <= 24 else 255eval函数来获得合理的结果。

如果您使用无损图像,它应该正常工作。然后,您应该使用0 if a == 0 else 255来创建蒙版。

请注意,如果某些'cat'像素偶然与背景像素相同,它们将显示为黑色像素。