从Python中的.png获取RGBA值



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

编辑了我的这行代码,现在它可以工作了:

im=Image.open("/filelocation").convert('RGBA')

尝试list(im.getdata())numpy.array(im.getdata())之类的东西(使用第一个可能会更好。(它以某种方式返回一个长列表,而不是一个列表列表列表,这可能会减轻这种情况。另一种选择是使用类似imageio.imread(filename)的东西,它将像素值作为numpy数组而不是序列返回。然后,您可以像在任何其他数组中一样引用数组维度。(例如image[:, :, 0]会给你所有的R值。(

为什么不直接使用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]]]

出现错误的原因是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)

最新更新