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

Hug*_*ugo 4 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())
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根据指定的其他大小计算第一个轴的适当形状.