Получение значений RGBA из .png в Python

1

Для проекта мне нужно получить значения RGBA из изображения и использовать их в последующих вычислениях. Для этого я использовал im.getdata() и потому, что это дает мне значения в формате списков в списке, я написал код, чтобы поместить его в один длинный список.

for group in pix_val:
    for item in group:
        pix_val_flat.append(item)

Это отлично сработало для меня, пока я не проверил код с совершенно белым изображением. Вместо того, чтобы создавать наборы из 4 значений в списке, он просто дал мне один длинный список - это означает, что я получаю сообщение об ошибке, когда моя программа пытается сгладить список. Кто-нибудь понимает, почему это происходит и как я могу это исправить?

Это мой код:

im=Image.open("/filelocation")
pix_val=list(im.getdata())
pix_val_flat=[]
for group in pix_val:
    for item in group:
        pix_val_flat.append(item)

Это сообщение об ошибке:

Traceback (most recent call last):
    File "/program", line 286 in <module>
        for item in group:
    TypeError: 'int' object is not iterable
  • 0
    Проблема в группе. Это возвращает int в этом случае. Означает, что pix_val является массивом целых чисел, а не массивом целых чисел. Попробуйте проверить вывод каждого метода с помощью printf. Поймите разницу оттуда.
  • 0
    Я подозреваю, что ваше чисто белое изображение было преобразовано в изображение палитры, которое имеет только одно значение для каждого пикселя (который является индексом в палитре), а не 4 значения RGBA для каждого пикселя. Если вы хотите изображение RGBA, используйте x=Image.open('name.png').convert('RGBA')
Показать ещё 1 комментарий
Теги:
python-imaging-library

4 ответа

1

почему бы вам просто не использовать img.load() что упрощает работу с одним img.load().

from PIL import Image

img=Image.open("n.png")
pixels = img.load()

pix_val_flat = [v for c in [[x,y] for x in range(img.size[0]) for y in range(img.size[1])] for v in pixels[c[0],c[1]]]
0

Отредактировал эту строку моего кода, и теперь она работает:

im=Image.open("/filelocation").convert('RGBA')
  • 0
    Отлично сработано! Вы можете принять свой собственный ответ и набрать очки.
0

Попробуйте что-то вроде list(im.getdata()) или numpy.array(im.getdata()) (Вероятно, вам лучше с первым.) Он каким-то образом возвращает один длинный список, а не список списков, и это может смягчить это. Другой вариант - использовать что-то вроде imageio.imread(filename), которое возвращает значения пикселей как массив numpy, а не последовательность. Затем вы можете ссылаться на размеры массива, как вы можете, в любом другом массиве. (например, image[:, :, 0] предоставит вам все ваши значения R).

0

Причина, по которой вы получаете сообщение об ошибке, заключается в том, что ваша group переменная в ìnt то момент превращается в значение " ìnt. За это im.getdata() функция im.getdata(), которая суммирует значения RGB с одним значением. Вы можете написать простой обходной путь, чтобы проверить, является ли группа значением int или кортежем (как вы ожидаете). Что-то вроде этого должно работать:

from PIL import Image
im = Image.open("test.png")
pix_val = list(im.getdata())
pix_val_flat = []

for group in pix_val:
    if type(group) == int:
        group (group, group, group, 0) # if int, change it to tupel
    for item in group:
        pix_val_flat.append(item)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню