来自PIL图像的32位RGBA numpy阵列

时间:2014-08-27 21:21:41

标签: python numpy computer-vision python-imaging-library

假设我将图片加载为:

> 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数组?

1 个答案:

答案 0 :(得分:3)

1。索引

你误解了NumPy索引图像的方式。 NumPy更喜欢图片row-major indexingfor the reasons described here y x c ):

  

[列主要索引]的缺点是潜在的性能损失。通常在数组操作中隐式地访问数据,或者通过循环遍历图像的行来显式地访问数据。完成后,将以非最佳顺序访问数据。随着第一个索引递增,实际发生的是在内存中间隔很远的元素被顺序访问,内存访问速度通常很差。

如果您更喜欢使用列主索引( x y c )并且不介意潜在的性能损失,然后使用numpy.transpose来置换索引:

np.array(image).transpose((1, 0, 2))

但是NumPy文档建议您只是习惯它:

  

我们建议您在访问数组元素时学习反转索引的常规顺序。当然,它与谷物相悖,但它更符合Python语义和数据的自然顺序。

2。颜色通道

数组的第三个轴为每个像素提供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])