Python получить позиции пикселей из PNG - PullRequest
0 голосов
/ 11 января 2019

Я работаю над веб-приложением, которое редактирует изображение, и часть его включает в себя холст на html. Я получаю область выделения, которую я сохраняю как пример изображения в формате png ниже

enter image description here

следующий шаг - получить x, y позиции области выделения, чтобы я знал, где только применить эффект, код выглядит следующим образом

pixels = img.load()
if cropped:
    x, y = position['left'], position['top']
else:
    x, y = 0, 0

img_width, img_height = 0, 0
matches = []
counter = 0
for _ in range(img.width * img.height):
    if img_width == img.width:
        img_width = 0
        img_height += 1

    counter += 1

    pixel = pixels[img_width, img_height]

    if pixel != (0, 0, 0, 0):
        matches.append([img_width+y, img_height+x])

    img_width += 1

if matches:
    filename = random_filename(extension='.pickle')
    with open(filename, 'wb') as f:
        # Pickle the 'data' dictionary using the highest protocol available.
        pickle.dump(matches, f, pickle.HIGHEST_PROTOCOL)

получает клетки и сохраняет их в рассоле.

Однако, когда я применяю эффект к этим ячейкам, возникает «эффект ореола», когда линия выделения находится на расстоянии от основной области выделения

enter image description here

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

Я также пошел еще дальше и использовал один из пикселей области выделения, чтобы восстановить файл png, чтобы увидеть, есть ли в нем проблема (что должно быть)

In [1]: from PIL import Image

In [14]: new = Image.new('RGB', (600, 399))

In [15]: import pickle

In [16]: pickle_file = open('pickle_cells/qPxsEaw7wcQR5YWK9iZrb6r.pickle', 'rb')

In [17]: cells = pickle.load(pickle_file)

In [18]: pickle_file.close()

In [20]: cells[0]
Out[20]: [259, 117]

In [22]: for cell in cells:
    ...:     new.putpixel([cell[0], cell[1]], (50, 50, 50))
    ...:

In [23]: new.save('test.png')

In [24]:

это создает это изображение, которое показывает ту же ошибку

enter image description here

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Забавная вещь; это было вызвано использованием сглаживания

img = img2.resize((full_width, full_height), PILImage.ANTIALIAS)

это было причиной проблемы.

0 голосов
/ 11 января 2019

Я думаю, что проблема в том, что ваш файл PNG не содержит того, что вы ожидаете. В нем 41 уникальный цвет, а не два, которые вы могли бы ожидать.

Каждый пиксель в файле черный, а фон белый. Посмотрите на выделенные красным цветом части в этом анализе:

enter image description here

41 различных оттенков черного представлены исключительно вариациями альфа-канала. Посмотрите на эту гистограмму присутствующих цветов, R = 0, G = 0, B = 0 для всех из них, но альфа-канал сильно различается.

enter image description here

Я бы предложил пороговое значение альфа-канала.


Я сгенерировал приведенный выше анализ с ImageMagick - включенным в большинство дистрибутивов Linux и доступным для macOS и Windows. Просто в командной строке:

magick identify -verbose image.png

Или, если используется версия v6 или старше, отбросьте magick и запустите:

identify -verbose image.png
...