在Python中从.png获取RGBA值

时间:2018-12-03 17:08:24

标签: python python-imaging-library

对于一个项目,我需要从图像中获取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 :(得分: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)