来自 PIL 图像的 32 位 RGBA numpy 数组

Jos*_*osh 4 python numpy computer-vision python-imaging-library

假设我将图像加载为:

> image = Image.open('temp.png')

<PngImagePlugin.PngImageFile image mode=RGBA size=1200x600 at 0x112F0C488>
Run Code Online (Sandbox Code Playgroud)

请注意,图像尺寸为1200x600

我想将此图像作为 2D numpy 数组检索,其中每个条目保存一个32位整数。

如果我做:

np.array(image).shape
Run Code Online (Sandbox Code Playgroud)

我得到:

(600,1200, 4)
Run Code Online (Sandbox Code Playgroud)

如何将其转换为 32 位 RGBA 2D numpy 数组?

Gar*_*ees 5

1. 索引

\n\n

您误解了 NumPy 索引图像的方式。NumPy 更喜欢图像的行主索引yxc,原因如下

\n\n
\n

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

\n
\n\n

如果您更喜欢使用列主索引(xyc)并且不介意潜在的性能损失,则可以使用numpy.transpose排列索引:

\n\n
np.array(image).transpose((1, 0, 2))\n
Run Code Online (Sandbox Code Playgroud)\n\n

但 NumPy 文档建议您习惯它:

\n\n
\n

我们建议在访问数组元素时简单地学习反转索引的通常顺序。诚然,它违背了规律,但它更符合 Python 语义和数据的自然顺序。

\n
\n\n

2. 颜色通道

\n\n

数组的第三个轴为每个像素提供 4 个颜色通道,此处为值(redgreenbluealpha)。对于大多数应用程序来说,这比单个 32 位数字更有用:例如,您可以通过编写 来提取 alpha 通道image[...,3]

\n\n

如果您确实想要 32 位颜色值,那么您可以使用该ndarray.view方法获取具有不同颜色的相同图像数据的视图dtype,然后使用numpy.reshape删除最后一个轴(现在是多余的):

\n\n
a = np.array(image)\na.view(dtype=np.uint32).reshape(a.shape[:-1])\n
Run Code Online (Sandbox Code Playgroud)\n