PIL 从图像中删除背景图像
PIL remove background image from image
有了背景图片,我是否可以从另一张图片中删除该背景并得到所有差异?例如:
假设我已经保存了这两张图片。如何在保留所有猫的同时从第二张图片中删除第一张图片?
根据PIL handbook,ImageChops
模块有一个减法操作:
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()
它几乎可以工作:-)
两张图片之间的差异比看起来要大一些。由于图像以 JPG 格式存储,因此它们是有损的。它们的渲染方式会略有不同,因此减法运算不会总是导致相同区域中的像素为零(即黑色)。
出于这个原因,我不得不对 eval
函数使用 lambda a: 0 if a <= 24 else 255
以获得合理的结果。
如果您使用无损图像,它应该可以正常工作。然后,您应该使用 0 if a == 0 else 255
创建掩码。
请注意,如果一些 'cat' 像素不小心与背景像素相同,它们将显示为黑色像素。
有了背景图片,我是否可以从另一张图片中删除该背景并得到所有差异?例如:
假设我已经保存了这两张图片。如何在保留所有猫的同时从第二张图片中删除第一张图片?
根据PIL handbook,ImageChops
模块有一个减法操作:
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()
它几乎可以工作:-)
两张图片之间的差异比看起来要大一些。由于图像以 JPG 格式存储,因此它们是有损的。它们的渲染方式会略有不同,因此减法运算不会总是导致相同区域中的像素为零(即黑色)。
出于这个原因,我不得不对 eval
函数使用 lambda a: 0 if a <= 24 else 255
以获得合理的结果。
如果您使用无损图像,它应该可以正常工作。然后,您应该使用 0 if a == 0 else 255
创建掩码。
请注意,如果一些 'cat' 像素不小心与背景像素相同,它们将显示为黑色像素。