对于一个项目,我需要从图像中获取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 :(得分:1)
尝试使用类似list(im.getdata())
或numpy.array(im.getdata())
的方法(使用第一个方法可能会更好。)以某种方式返回单个长列表而不是列表列表,这可能会减轻这种情况。另一种选择是使用类似imageio.imread(filename)
的东西,它以numpy数组而不是序列的形式返回像素值。然后,您可以像引用任何其他数组一样引用数组尺寸。 (例如image[:, :, 0]
会为您提供所有R值。)
答案 1 :(得分:1)
为什么不只使用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]]]
答案 2 :(得分:1)
编辑了我的代码的这一行,现在可以正常工作:
im=Image.open("/filelocation").convert('RGBA')
答案 3 :(得分:0)
出现错误的原因是您的group
变量有时会变成ìnt
值。 im.getdata()
函数对此负责,它将RGB值堆叠为一个值。您可以编写一个简单的解决方法来检查group是否为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)