Изображение содержит альфа-прозрачность , и большие блоки, которые вы видите, на самом деле выглядят таковыми в оригинале - но альфа-маска скрывает их. Фон, который вы видите белым в этом посте, на самом деле не белый, а полностью прозрачный. Другие программы просмотра изображений могут показывать даже серый или серый клетчатый фон.
Проблема почти сразу же появляется в вашем коде, потому что вы сглаживаете изображение в RGB:
image = Image.open(R1_Path+image_name)
image = image.convert('RGB')
и теперь image.show()
покажет вам, что именно в этот момент прозрачность была удалена, и появляются большие блоки. ª
Кажется, нет причины для преобразования в RGB, потому что это изображение уже является одним; так почему бы не оставить все как есть. Единственное, что, когда вы тестируете не белый пиксель, вы должны сначала проверить, если его основной цвет - белый или что-нибудь еще - на самом деле уже невидим из-за прозрачности , Тогда, только если пиксель виден, проверьте его цвет.
Вместо точного теста для «белого» (который вам все равно придется пересмотреть, поскольку на этом изображении нет чистого белого), я тестирую здесь только один канал. Для других изображений это, вероятно, не будет работать, и вам понадобится эвристическая формула - например, преобразование цвета в оттенки серого. Поскольку это работает для вашего изображения, я не исследовал это дальше.
from PIL import Image
image = Image.open('eq2hl.png')
pixelMap = image.load()
newImg = Image.new(image.mode,image.size)
pixelsNew = newImg.load()
width,height = newImg.size
for i in range(width):
for j in range(height):
pixelsNew[i,j] = pixelMap[i,j]
if pixelMap[i,j][3] < 250:
pixelsNew[i,j] = (255,255,255,255)
elif pixelMap[i,j][0] < 255:
pixelsNew[i,j] = (0,0,255,255)
newImg.show()
... и результат:
, где все почти полностью прозрачные пиксели заменены фактическими белыми, а каждый небелой пиксель заменен чистым синим. Этот последний шаг, кстати, также убил сглаживание по краю, но это часть игры. Это можно сохранить, но это будет немного больше кода.
ª Вы можете назвать это ошибкой преобразования PIL. Все, что делает преобразование, это выбрасывает весь альфа-канал. С другой стороны, для правильного удаления альфа потребуется указать цвет фона. См. Как я могу установить фон прозрачного изображения на белый, используя PIL? для примера того, как это сделать, если вам потребуется.