Получение значений RGBA из .png в Python - PullRequest
0 голосов
/ 03 декабря 2018

Для проекта мне нужно получить значения 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

Ответы [ 4 ]

0 голосов
/ 05 декабря 2018

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

im=Image.open("/filelocation").convert('RGBA')
0 голосов
/ 03 декабря 2018

почему бы вам просто не использовать 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 голосов
/ 03 декабря 2018

Причина, по которой вы получаете ошибку, заключается в том, что ваша переменная group в какой-то момент превращается в значение ìnt.За это отвечает функция 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)
0 голосов
/ 03 декабря 2018

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

...