2010-04-17 179 views
109

我已经创建了一个阵列正是如此:如何将numpy数组转换为(并显示)图像?

import numpy as np 
data = np.zeros((512,512,3), dtype=np.uint8) 
data[256,256] = [255,0,0] 

我想这个做的是在512×512图像的中心显示一个红点。 (至少从头开始...我想我可以从那里找出其余的部分)

+1

参见http://stackoverflow.com/questions/902761/saving-a-numpy-array-as-尽管那个人强加了PIL不能使用的限制。 – 2010-04-17 18:01:47

回答

96

你可以使用PIL创建(和显示)的图像:

from PIL import Image 
import numpy as np 

w, h = 512, 512 
data = np.zeros((h, w, 3), dtype=np.uint8) 
data[256, 256] = [255, 0, 0] 
img = Image.fromarray(data, 'RGB') 
img.save('my.png') 
img.show() 
+0

这工作很好。谢谢。 – jlswint 2010-04-17 18:23:11

+2

似乎有一个错误。你创建的数组大小为'(w,h,3)',但它应该是'(h,w,3)',因为PIL中的索引与numpy中的索引不同。有相关的问题:http:// stackoverflow。com/questions/33725237/image-fromarray-changes-size – user502144 2015-12-06 18:57:20

+0

@ user502144:谢谢你指出我的错误。我应该创建一个形状数组''(h,w,3)'。 (现在已经固定,在上面)。第一个轴的长度可以被认为是数组中的行数,第二个轴的长度是列数。因此'(h,w)'对应于一个“高度”“h”和“宽度”“w”的数组。 'Image.fromarray'将这个数组转换成高度为'h'和宽度为'w'的图像。 – unutbu 2015-12-06 20:47:59

0

使用pygame,您可以打开一个窗口,以一个像素数组的形式获取曲面,然后根据需要进行操作。您需要将您的numpy数组复制到曲面数组中,然而,这比在pygame曲面上进行实际的图形操作要慢得多。

40

最短路径使用scipy,像这样:

from scipy.misc import toimage 
toimage(data).show() 

这需要安装PIL或Pillow。

类似的方法也需要PIL或枕头但可以调用不同的观众是:

from scipy.misc import imshow 
imshow(data) 
+0

所以这种方法是不符合python 3.5 ...? – bordeo 2016-02-05 23:48:56

+0

@bordeo,为什么它会与3.5不兼容?它只是一个导入和一些函数调用。 – 2016-02-06 15:32:33

+0

PIL与3.5不兼容(不会安装) – bordeo 2016-02-06 17:19:21

145

你刚才说这个?

from matplotlib import pyplot as plt 
plt.imshow(data, interpolation='nearest') 
plt.show() 
+2

这比PIL更准确。 PIL重新调整/标准化数组值,而pyplot原样使用实际的RGB值。 – GaryO 2013-01-27 14:08:41

+2

谢谢!值得最好的答案徽章! – 2016-01-24 09:28:04

+9

也许很高兴知道:如果要显示灰度图像,建议您在代码中调用'plt.gray()'一次将所有以下图形切换为灰度。不是OP想要什么,但很高兴知道。 – Cerno 2017-02-28 12:21:46

相关问题