我正在一个项目中,我需要删除图像的背景,我们唯一拥有的信息是它是其中包含一些(一个或多个)对象的图像,因此我需要删除背景,并使其成为透明图像。
以下是示例图片:
而且,这是我尝试使用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
,没有从图像中删除任何内容。
当我打印datas
和newData
时,它会打印相同的值:
Old Length is: 944812
New Length is: 944812
谢谢!
答案 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:
过滤出更多像素。
您是否真的希望背景像素为白色也是要回答的问题。
此外,用于检查过滤器输出的测试将无法进行,因为无论图像的透明度如何,它们都将包含相同数量的像素。