Для проекта мне нужно получить значения 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
почему бы вам просто не использовать 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]]]
Отредактировал эту строку моего кода, и теперь она работает:
im=Image.open("/filelocation").convert('RGBA')
Попробуйте что-то вроде list(im.getdata())
или numpy.array(im.getdata())
(Вероятно, вам лучше с первым.) Он каким-то образом возвращает один длинный список, а не список списков, и это может смягчить это. Другой вариант - использовать что-то вроде imageio.imread(filename)
, которое возвращает значения пикселей как массив numpy, а не последовательность. Затем вы можете ссылаться на размеры массива, как вы можете, в любом другом массиве. (например, image[:, :, 0]
предоставит вам все ваши значения R).
Причина, по которой вы получаете сообщение об ошибке, заключается в том, что ваша 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)
x=Image.open('name.png').convert('RGBA')