我正在运行此代码
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())
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误
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'
Run Code Online (Sandbox Code Playgroud)
你可以帮帮我吗?
Joe*_*ton 12
你提到过numpy.如果你想要一个numpy数组的图像,不要迭代它,只是做data = np.array(im).
例如
from PIL import Image
import numpy as np
im = Image.open("/Users/Hugo/green_leaves.jpg")
p = np.array(im)
Run Code Online (Sandbox Code Playgroud)
通过反复追加来构建一个numpy数组是非常低效的.Numpy数组不像python列表(python列表很好地服务于这个目的!!).它们是固定大小,同质,内存高效的阵列.
如果你确实想通过追加建立一个numpy数组,请使用一个列表(可以有效地附加到该列表),然后将该列表转换为numpy数组.
但是,在这种情况下,PIL图像支持直接转换为numpy数组.
还有一点需要注意,上面给出的示例并不是100%等同于您的代码. p将是numbands(3或4)数组的宽度高度,而不是像原始示例中的numbands数组那样的numpixels.
如果你想通过numbands将数组重塑为numpixels,只需执行:
p = p.reshape(-1, p.shape[2])
Run Code Online (Sandbox Code Playgroud)
(或等效地p.shape = -1, p.shape[2])
这将width*height通过numbands(3或4,取决于是否存在alpha通道)数组重新整形数组.换句话说,图像中的红色,绿色,蓝色,α像素值的序列.这-1是一个占位符,告诉numpy根据指定的其他大小计算第一个轴的适当形状.