如何将numpy数组转换为(并显示)图像?

jls*_*int 191 python arrays numpy data-visualization image

我这样创建了一个数组:

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

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

Ste*_*joa 251

以下应该有效:

from matplotlib import pyplot as plt
plt.imshow(data, interpolation='nearest')
plt.show()
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Jupyter笔记本/实验室,请在导入matplotlib之前使用此内联命令:

%matplotlib inline 
Run Code Online (Sandbox Code Playgroud)

  • 也许很有用:如果你想显示灰度图像,建议你在代码中调用一次`plt.gray()`将所有后续图形切换为灰度图像.不是OP想要的,但很高兴知道. (15认同)
  • @Cerno此外,灰度图像应该具有形状(h,w)而不是(h,w,1)。您可以使用 `squeeze()` 消除第三个维度:`plt.imshow(data.squeeze())` (3认同)
  • 这比PIL更准确.PIL重新调整/规范化数组值,而pyplot使用实际的RGB值. (2认同)
  • 谢谢!值得最好的答案的徽章! (2认同)
  • 如何保存? (2认同)

unu*_*tbu 189

您可以使用PIL创建(并显示)图像:

from PIL import Image
import numpy as np

w, h = 512, 512
data = np.zeros((h, w, 3), dtype=np.uint8)
data[0:256, 0:256] = [255, 0, 0] # red patch in upper left
img = Image.fromarray(data, 'RGB')
img.save('my.png')
img.show()
Run Code Online (Sandbox Code Playgroud)

  • `img.show()` 在 ipython notebook 中不起作用。`img_pil = Image.fromarray(img, 'RGB') display(img_pil.resize((256,256), PIL.Image.LANCZOS))` (6认同)
  • 似乎有一个bug.你创建大小为`(w,h,3)`的数组,但它应该是`(h,w,3)`,因为PIL中的索引与numpy中的索引不同.有相关问题:http://stackoverflow.com/questions/33725237/image-fromarray-changes-size (3认同)

Pet*_*sen 51

使用最短路径scipy,如下所示:

from scipy.misc import toimage
toimage(data).show()
Run Code Online (Sandbox Code Playgroud)

这也需要安装PIL或Pillow.

类似的方法也需要PIL或Pillow,但可以调用不同的查看器:

from scipy.misc import imshow
imshow(data)
Run Code Online (Sandbox Code Playgroud)

  • `toimage` 在 scipy-1.0.0 中已被弃用,并在 1.2.0 中被删除,取而代之的是 Pillow 的 `Image.fromarray`。 (5认同)

Har*_*vey 12

如何使用示例显示存储在 numpy 数组中的图像(适用于 Jupyter notebook)

我知道有更简单的答案,但这个答案会让您了解图像实际上是如何从 numpy 数组中绘制的。

加载示例

from sklearn.datasets import load_digits
digits = load_digits()
digits.images.shape   #this will give you (1797, 8, 8). 1797 images, each 8 x 8 in size
Run Code Online (Sandbox Code Playgroud)

显示一张图像的数组

digits.images[0]
array([[ 0.,  0.,  5., 13.,  9.,  1.,  0.,  0.],
       [ 0.,  0., 13., 15., 10., 15.,  5.,  0.],
       [ 0.,  3., 15.,  2.,  0., 11.,  8.,  0.],
       [ 0.,  4., 12.,  0.,  0.,  8.,  8.,  0.],
       [ 0.,  5.,  8.,  0.,  0.,  9.,  8.,  0.],
       [ 0.,  4., 11.,  0.,  1., 12.,  7.,  0.],
       [ 0.,  2., 14.,  5., 10., 12.,  0.,  0.],
       [ 0.,  0.,  6., 13., 10.,  0.,  0.,  0.]])
Run Code Online (Sandbox Code Playgroud)

创建空的 10 x 10 子图以可视化 100 个图像

import matplotlib.pyplot as plt
fig, axes = plt.subplots(10,10, figsize=(8,8))
Run Code Online (Sandbox Code Playgroud)

绘制 100 张图像

for i,ax in enumerate(axes.flat):
    ax.imshow(digits.images[i])
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明

有什么作用axes.flat 它创建了一个 numpy 枚举器,因此您可以遍历轴以在其上绘制对象。 例子:

import numpy as np
x = np.arange(6).reshape(2,3)
x.flat
for item in (x.flat):
    print (item, end=' ')
Run Code Online (Sandbox Code Playgroud)


小智 9

使用pillow的fromarray,例如:

from PIL import Image
from numpy import *

im = array(Image.open('image.jpg'))
Image.fromarray(im).show()
Run Code Online (Sandbox Code Playgroud)


小智 6

import numpy as np
from keras.preprocessing.image import array_to_img
img = np.zeros([525,525,3], np.uint8)
b=array_to_img(img)
b
Run Code Online (Sandbox Code Playgroud)


Ste*_*all 5

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