假设我将图片加载为:
> image = Image.open('temp.png')
<PngImagePlugin.PngImageFile image mode=RGBA size=1200x600 at 0x112F0C488>
请注意,图片尺寸为1200x600
。
我想将此图像检索为2D numpy数组,其中每个条目都包含 32 位整数。
如果我这样做:
np.array(image).shape
我明白了:
(600,1200, 4)
如何将其转换为32位RGBA 2D numpy数组?
答案 0 :(得分:3)
你误解了NumPy索引图像的方式。 NumPy更喜欢图片row-major indexing的for the reasons described here( y , x , c ):
[列主要索引]的缺点是潜在的性能损失。通常在数组操作中隐式地访问数据,或者通过循环遍历图像的行来显式地访问数据。完成后,将以非最佳顺序访问数据。随着第一个索引递增,实际发生的是在内存中间隔很远的元素被顺序访问,内存访问速度通常很差。
如果您更喜欢使用列主索引( x , y , c )并且不介意潜在的性能损失,然后使用numpy.transpose
来置换索引:
np.array(image).transpose((1, 0, 2))
但是NumPy文档建议您只是习惯它:
我们建议您在访问数组元素时学习反转索引的常规顺序。当然,它与谷物相悖,但它更符合Python语义和数据的自然顺序。
数组的第三个轴为每个像素提供4个颜色通道,这里是值(红色,绿色,蓝色, 阿尔法)。这对于大多数应用程序而言比单个32位数字更有用:例如,您可以通过编写image[...,3]
来提取Alpha通道。
如果你真的想要32位颜色值,那么你可以使用ndarray.view
method来获取具有不同dtype
的相同图像数据的视图,然后使用numpy.reshape
来删除最后一个轴(现在是多余的):
a = np.array(image)
a.view(dtype=np.uint32).reshape(a.shape[:-1])