2014-02-19 63 views
3

我运行此代码如何从位图图像的RGB值获取数组?

from PIL import Image 
import numpy as np 
im = Image.open("/Users/Hugo/green_leaves.jpg") 
im.load() 
height, widht = im.size 
p = np.array([0,0,0]) 
for row in range(height): 
    for col in range(widht): 
     a = im.getpixel((row,col)) 
     p = np.append(a.asarray()) 

但我收到以下错误

Traceback (most recent call last): 
    File "/Users/hugo/PycharmProjects/Meteo API/image.py", line 17, in <module> 
    p = np.append(a.asarray()) 
AttributeError: 'tuple' object has no attribute 'asarray' 

你能帮助我吗?

+0

我不知道numpy,但'a'是内建的'tuple'类型,并没有这样的方法。它是一个数组的python等价物。 – 2rs2ts

回答

10

你提到了numpy。如果你想要一个图像的numpy数组,不要遍历它,只要做data = np.array(im)

E.g.

from PIL import Image 
import numpy as np 
im = Image.open("/Users/Hugo/green_leaves.jpg") 
p = np.array(im) 

通过反复附加到它构建一个numpy的阵列是非常低效。 Numpy数组不像python列表(python列表非常好用!)。它们是固定大小,均匀,高效的内存阵列。

如果您确实想要通过追加构建一个numpy数组,可以使用一个列表(可以高效地追加到),然后将该列表转换为numpy数组。

但是,在这种情况下,PIL图像支持直接转换为numpy数组。

还有一点需要注意,我上面给出的例子并不是100%的代码。 p将是一个由numbands(3或4)数组构成的宽度的高度,而不是numbands数组中的numpixels,就像它在原始示例中一样。

如果你想在阵列重塑成numbands numpixels,只是做:

p = p.reshape(-1, p.shape[2]) 

(或相当于p.shape = -1, p.shape[2]

这将numbands(3或4阵列重塑成width*height ,取决于是否有alpha通道)数组。换句话说,图像中的红色,绿色,蓝色,alpha像素值序列。 -1是一个占位符,它告诉numpy根据指定的其他尺寸计算第一个轴的适当形状。

2

初始化p为列表,并且之后转换为numpy的阵列for循环:

p=[] 
for row in range(height): 
    for col in range(widht): 
     a = im.getpixel((row,col)) 
     p.append(a) 
p=np.asarray(p) 

这将创建形状的列表(*,3),其是相同np.array(im).reshape(-1, 3)。所以,如果你需要这个,只需使用后一种形式;)