我有一个形状为(3, 256, 256)
的numpy数组,它是一个3通道(RGB)图像的重新分离256x256。我尝试通过执行以下操作,将Image
PIL
保存到磁盘:
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')
但是这会将尺寸为256x3的图像保存到磁盘
答案 0 :(得分:9)
@Dietrich的答案是有效的,但在某些情况下,它会翻转图像。由于转置运算符会反转索引,如果图像存储在RGB x rows x cols
中,转置运算符将产生cols x rows x RGB
(这是旋转的图像而不是所需的结果)。
>>> arr = np.random.uniform(size=(3,256,257))*255
注意257
用于可视化目的。
>>> arr.T.shape
(257, 256, 3)
>>> arr.transpose(1, 2, 0).shape
(256, 257, 3)
最后一个是您在某些情况下可能需要的,因为它重新排序图像(示例中为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')
甚至可能不需要转换为连续数组,但最好在保存之前确保图像是连续的。
答案 1 :(得分:4)
尝试转置arr
,它会为您提供(256, 256, 3)
数组:
arr = np.random.uniform(size=(3,256,256))*255
img = Image.fromarray(arr.T, 'RGB')
img.save('out.png')
答案 2 :(得分:-2)
您可以使用opencv合并三个通道并另存为img。
SET DEBUG FILE TO '/tmp/mytest.trace';
TRACE OFF;
TRACE ON;