删除图像背景并使用Python的PIL创建透明图像

时间:2018-09-03 08:32:45

标签: python python-imaging-library

我正在一个项目中,我需要删除图像的背景,我们唯一拥有的信息是它是其中包含一些(一个或多个)对象的图像,因此我需要删除背景,并使其成为透明图像。

以下是示例图片:

enter image description here

而且,这是我尝试使用PIL的方法:

img = Image.open(url)
img = img.convert("RGBA")
datas = img.getdata()
print('Old Length is: {}'.format(len(datas)))
# print('Exisitng Data is as: {}'.format(datas))
newData = []
for item in datas:
    # print(item)
    if item[0] == 255 and item[1] == 255 and item[2] == 255:
        newData.append((255, 255, 255, 0))
    else:
        newData.append(item)
img.putdata(newData)
print('New Length is: {}'.format(len(datas)))
img.show()
img.save("/Users/abdul/PycharmProjects/ImgSeg/img/new.png", "PNG")
print('Done')

它将与输入相同的图像保存为new.png,没有从图像中删除任何内容。

当我打印datasnewData时,它会打印相同的值:

Old Length is: 944812
New Length is: 944812

谢谢!

1 个答案:

答案 0 :(得分:1)

您正在过滤掉所有白色像素:

item[0] == 255 and item[1] == 255 and item[2] == 255

但这并不意味着:

  • 所有白色像素(255, 255, 255)都属于背景,并且

  • 所有背景仅包含白色像素。

一种启发式方法(部分适用于您的示例图像)将增加背景像素定义的阈值:

if 50 <= item[0] <= 80 and 60 <= item[1] <= 100 and 80 <= item[2] < 140:

过滤出更多像素。

您是否真的希望背景像素为白色也是要回答的问题。

此外,用于检查过滤器输出的测试将无法进行,因为无论图像的透明度如何,它们都将包含相同数量的像素。