Как удалить фон изображения и сделать его прозрачным? - PullRequest
0 голосов
/ 07 августа 2020

Я использую следующий код:

from PIL import Image
import os

path = 'C:/Users/User/Desktop/GF_BSIF/temp'
newData = []

for image in os.listdir(path):
    img = Image.open(path+'/'+image)
    img = img.convert("RGBA")
    datas = img.getdata()

    for item in datas:
        if item[0] == 255 and item[1] == 255 and item[2] == 255:
            newData.append((255, 255, 255, 0))
        else:
            if item[0] > 150:
                newData.append((0, 0, 0, 255))
            else:
                newData.append(item)
                print(item)

img.putdata(newData)
img.save('C:/Users/User/Desktop/GF_BSIF/temp'+'/'+"open_science_logo_transparent.png", "PNG")

Оригинал:

enter image description here

Result:

введите описание изображения здесь

Результат не делает фон прозрачным.

Как улучшить код и сделать черный фон прозрачным?

EDIT:

from PIL import Image
import matplotlib.pyplot as plt
import os
import shutil
path = 'C:/Users/User/Desktop/GF_BSIF/temp'
out_put = 'C:/Users/User/Desktop/data science/cropped'
newData = []


for image in os.listdir(path):
    img = Image.open(path+'/'+image)
    img = img.convert("RGBA")
    datas = img.getdata()
    
    for item in datas:
        if all(i == 0 for i in datas[0:3]):
            newData.append((0, 0, 0, 0))
        else:
            etcetcetc
img.putdata(newData)
img.save('C:/Users/User/Desktop/GF_BSIF/temp'+'/'+"open_science_logo_transparent.png", "PNG")   

@ NotActuallyErik

Выдает ошибку

TypeError Traceback (последний вызов последний)

в 14 15 для элемента в данных: ---> 16, если все (i == 0 для i в данных [0: 3]): 17 newData .append ((0, 0, 0, 0)) 18 else:

TypeError: индекс последовательности должен быть целым числом, а не «срезом».

Как это исправить?

1 Ответ

2 голосов
/ 07 августа 2020

Ваш код сообщает PIL удалить, заменить каждый белый пиксель черным: [255,255,255,0] -> [0,0,0,255], поэтому ваш черный фон остается, а удаляются только полностью белые пятна. Вам нужно сделать обратное, чтобы удалить фон, т.е. [0,0,0,255] -> [0,0,0,0]

это может сработать

for item in datas:
    if all(i == 0 for i in datas[0:3]):
        newData.append((0, 0, 0, 0))
    else:
        etcetcetc
...