如何将3通道numpy数组保存为图像

Aly*_*Aly 5 python numpy python-imaging-library

我有一个形状为numpy的阵列,(3, 256, 256)它是一个3通道(RGB)图像的重新分离256x256.我想这与保存到磁盘ImagePIL通过执行以下操作:

from PIL import Image
import numpy as np

#... get array s.t. arr.shape = (3,256, 256)
img = Image.fromarray(arr, 'RGB')
img.save('out.png')
Run Code Online (Sandbox Code Playgroud)

但是,这会将尺寸为256x3的图像保存到磁盘

Ima*_*ngo 10

@Dietrich的答案是有效的,但在某些情况下它会翻转图像.由于转置操作符反转索引,如果图像存储在RGB x rows x cols转置操作符中将产生cols x rows x RGB(这是旋转的图像而不是期望的结果).

>>> arr = np.random.uniform(size=(3,256,257))*255
Run Code Online (Sandbox Code Playgroud)

请注意257可视化目的.

>>> arr.T.shape
(257, 256, 3)

>>> arr.transpose(1, 2, 0).shape
(256, 257, 3)
Run Code Online (Sandbox Code Playgroud)

最后一个是您在某些情况下可能需要的,因为它重新排序图像(rows x cols x RGB在示例中)而不是完全转置它.

>>> arr = np.random.uniform(size=(3,256,256))*255
>>> arr = np.ascontiguousarray(arr.transpose(1,2,0))
>>> img = Image.fromarray(arr, 'RGB')
>>> img.save('out.png')
Run Code Online (Sandbox Code Playgroud)

可能甚至不需要转换为连续阵列,但最好在保存之前确保图像是连续的.


Die*_*ich 5

尝试转置arr为您提供(256, 256, 3)数组:

arr = np.random.uniform(size=(3,256,256))*255
img = Image.fromarray(arr.T, 'RGB')
img.save('out.png')
Run Code Online (Sandbox Code Playgroud)