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 数组?
您误解了 NumPy 索引图像的方式。NumPy 更喜欢图像的行主索引(y、x、c),原因如下:
\n\n\n\n\n[列主索引] 的缺点是潜在的性能损失。通常按顺序访问数据,或者在数组操作中隐式访问,或者通过循环图像的行显式访问。完成后,数据将以非最佳顺序访问。当第一个索引递增时,实际发生的情况是,内存中间隔较远的元素被顺序访问,而内存访问速度通常很差。
\n
如果您更喜欢使用列主索引(x、y、c)并且不介意潜在的性能损失,则可以使用numpy.transpose排列索引:
np.array(image).transpose((1, 0, 2))\nRun Code Online (Sandbox Code Playgroud)\n\n但 NumPy 文档建议您习惯它:
\n\n\n\n\n我们建议在访问数组元素时简单地学习反转索引的通常顺序。诚然,它违背了规律,但它更符合 Python 语义和数据的自然顺序。
\n
数组的第三个轴为每个像素提供 4 个颜色通道,此处为值(red、green、blue、alpha)。对于大多数应用程序来说,这比单个 32 位数字更有用:例如,您可以通过编写 来提取 alpha 通道image[...,3]。
如果您确实想要 32 位颜色值,那么您可以使用该ndarray.view方法获取具有不同颜色的相同图像数据的视图dtype,然后使用numpy.reshape删除最后一个轴(现在是多余的):
a = np.array(image)\na.view(dtype=np.uint32).reshape(a.shape[:-1])\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
6870 次 |
| 最近记录: |