【问题标题】:Remove Image background and create a transparent Image using Python's PIL使用 Python 的 PIL 删除图像背景并创建透明图像
【发布时间】:2019-02-08 06:54:25
【问题描述】:

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

这是一个示例图片:

而且,这是我使用 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

提前致谢!

【问题讨论】:

    标签: python python-imaging-library


    【解决方案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:
    

    过滤掉更多的像素。

    你真的希望你的背景像素是白色的也是一个有待回答的问题。

    此外,您检查过滤输出的测试将无法正常工作,因为无论它们的透明度如何,两个图像都将包含相同数量的像素。

    【讨论】:

    • 嗨@Eypros,背景不会像往常一样,它会因图像而异,我如何设置此代码以适用于所有类型的背景?
    • “所有类型的背景”是什么意思?如果您只检查 RGB 阈值,它肯定会失败。您需要一种更好的背景估计方法。
    • 如果我尝试使用不同的图像,它完全失败了,我正在寻找一种适用于任何图像的解决方案,可能不是 100% 正确,但至少应该给出一些结果。任何资源也将不胜感激。
    • 你还没有具体说明你的背景是如何定义的?除了 RGB 值,你还有什么方法可以找到背景?
    猜你喜欢
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 2012-05-31
    • 2014-02-08
    • 2011-12-23
    相关资源
    最近更新 更多