如何从位图图像的RGB值获取数组?

时间:2014-02-19 15:57:46

标签: python pillow

我正在运行此代码

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'

你能帮帮我吗?

2 个答案:

答案 0 :(得分:12)

您提到了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,取决于是否存在alpha通道)数组将数组重新整形为width*height。换句话说,图像中的红色,绿色,蓝色,α像素值的序列。 -1是一个占位符,它告诉numpy根据指定的其他大小计算第一个轴的适当形状。

答案 1 :(得分:2)

p初始化为列表,并在for循环后将其转换为numpy数组:

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)相同。所以,如果你需要这个,只需使用后一种形式;)