我正在运行此代码
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 :(得分: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)
相同。所以,如果你需要这个,只需使用后一种形式;)