Удалите фоновое изображение и создайте прозрачное изображение, используя PIL Python - PullRequest
0 голосов
/ 03 сентября 2018

Я работаю над проектом, в котором мне нужно удалить фон изображения, единственная информация, которая у нас есть, это то, что это изображение содержит несколько (один или несколько) объектов, и мне нужно удалить фон и сделать его прозрачным изображением.

Вот образец изображения:

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, с изображения ничего не удалено.

Когда я печатаю datas и newData, он печатает одинаковые значения:

Old Length is: 944812
New Length is: 944812

Заранее спасибо!

1 Ответ

0 голосов
/ 03 сентября 2018

Вы отфильтровываете все белый пикселей:

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:

отфильтровывает намного больше пикселей.

Вы действительно хотите, чтобы фоновые пиксели были белыми, это тоже вопрос, на который нужно ответить.

Кроме того, ваш тест для проверки выходных данных вашей фильтрации не будет работать, поскольку оба изображения в любом случае будут содержать одинаковое количество пикселей, независимо от их прозрачности.

...