如何将一个包含3个通道的numpy数组保存为图像。

13

我有一个形状为(3, 256, 256)的numpy数组,它是一个分辨率为256x256的三通道(RGB)图像。 我正在尝试通过以下方式使用PIL中的Image将其保存到磁盘:

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的图像保存到磁盘上。


1
你尝试过使用np.swapaxes将数组重塑为(256,256,3)吗? - cel
3个回答

19

@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
我该如何将这个变量保存为服务器上的图像文件? - Santhosh

10
尝试转置arr,这将给您一个(256, 256, 3)数组:
arr = np.random.uniform(size=(3,256,256))*255
img = Image.fromarray(arr.T, 'RGB')
img.save('out.png')

它可以工作,谢谢,很奇怪fromarray函数将第三个维度视为通道数。 - Luk Aron

0

你可以使用OpenCV合并三个通道并保存为图像。

import cv2
import numpy as np
arr = np.random.uniform(size=(3,256,256))*255 # It's a r,g,b array
img = cv2.merge((arr[2], arr[1], arr[0]))  # Use opencv to merge as b,g,r
cv2.imwrite('out.png', img) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接