【问题标题】:How do I convert a numpy array to (and display) an image?如何将 numpy 数组转换为(并显示)图像?
【发布时间】:2011-02-09 04:48:19
【问题描述】:

我因此创建了一个数组:

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

我想要做的是在 512x512 图像的中心显示一个红点。 (至少开始......我想我可以从那里弄清楚其余的)

【问题讨论】:

  • 另请参阅stackoverflow.com/questions/902761/…,尽管那个施加了不能使用 PIL 的约束。
  • 您能考虑将接受的答案更改为Peter's吗?它既避免了在 numpy 数组周围包装对象的需要,又避免了编写临时文件来显示图像。

标签: python arrays image numpy data-visualization


【解决方案1】:

以下应该有效:

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

如果您使用的是 Jupyter notebook/lab,请在导入 matplotlib 之前使用此内联命令:

%matplotlib inline 

更有特色的方式是安装ipymlpip install ipympl并使用

%matplotlib widget 

查看example

【讨论】:

  • 这比 PIL 更准确。 PIL 重新缩放/标准化数组值,而 pyplot 使用实际的 RGB 值。
  • 也许很高兴知道:如果您想显示灰度图像,建议在您的代码中调用一次plt.gray() 将以下所有图形切换为灰度。不是 OP 想要的,但很高兴知道。
  • 如何保存?
  • 文件“”,第 39 行 plt.show() ^ SyntaxError: invalid syntax
  • @Cerno 此外,灰度图像应该具有形状(h,w)而不是(h,w,1)。您可以使用squeeze() 消除第三维:plt.imshow(data.squeeze())
【解决方案2】:

您可以使用 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()

【讨论】:

  • 好像有bug。您创建大小为(w,h,3) 的数组,但它应该是(h,w,3),因为PIL 中的索引不同于numpy 中的索引。有相关问题:stackoverflow.com/questions/33725237/…
  • @user502144:感谢您指出我的错误。我应该创建一个形状数组(h,w,3)。 (它现在是固定的,上面。)第一个轴的长度可以被认为是数组中的行数,第二个轴的长度可以被认为是列数。所以(h, w) 对应于“高度”h 和“宽度”w 的数组。 Image.fromarray 将此数组转换为高度为h 和宽度为w 的图像。
  • img.show() 在 ipython 笔记本中不起作用。img_pil = Image.fromarray(img, 'RGB') display(img_pil.resize((256,256), PIL.Image.LANCZOS))
  • @unutbu 这种方法似乎会扭曲图像...stackoverflow.com/questions/62293077/…
  • Image.fromarray(...) 作为单元格的最后一个表达式足以在 Google Colab 中为我显示图像。无需写入文件或调用.show()
【解决方案3】:

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

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

这也需要安装 PIL 或 Pillow。

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

from scipy.misc import imshow
imshow(data)

【讨论】:

  • 所以这个方法与python 3.5不兼容...?
  • @bordeo,为什么会与 3.5 不兼容?它只是一个导入和几个函数调用。
  • PIL 与 3.5 不兼容(不会安装)
  • Ftr:您可以直接使用scipy.misc.imshow(data) 进一步缩短它。
  • toimage 在 scipy-1.0.0 中被弃用并在 1.2.0 中被移除,取而代之的是 Pillow 的 Image.fromarray
【解决方案4】:

如何通过示例显示存储在 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

一张图片的显示数组

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.]])

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

import matplotlib.pyplot as plt
fig, axes = plt.subplots(10,10, figsize=(8,8))

绘制 100 张图像

for i,ax in enumerate(axes.flat):
    ax.imshow(digits.images[i])

结果:

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

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

【讨论】:

    【解决方案5】:
    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
    

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        以枕头的fromarray为例:

        from PIL import Image
        from numpy import *
        
        im = array(Image.open('image.jpg'))
        Image.fromarray(im).show()
        

        【讨论】:

          【解决方案8】:

          Python Imaging Library 可以使用 Numpy 数组显示图像。请查看此页面以获取示例代码:

          编辑:正如该页面底部的注释所说,您应该查看最新的发行说明,这使得这变得更加简单:

          http://effbot.org/zone/pil-changes-116.htm

          【讨论】:

          • 这没有回答问题
          【解决方案9】:

          对 matplotlib 的补充。我发现它在执行计算机视觉任务时很方便。假设你有 dtype = int32 的数据

          from matplotlib import pyplot as plot
          import numpy as np
          
          fig = plot.figure()
          ax = fig.add_subplot(1, 1, 1)
          # make sure your data is in H W C, otherwise you can change it by
          # data = data.transpose((_, _, _))
          data = np.zeros((512,512,3), dtype=np.int32)
          data[256,256] = [255,0,0]
          ax.imshow(data.astype(np.uint8))
          

          【讨论】:

            【解决方案10】:

            这可能是一个可能的代码解决方案:

            from skimage import io
            import numpy as np
            data=np.random.randn(5,2)
            io.imshow(data)
            

            【讨论】:

              猜你喜欢
              • 2018-07-21
              • 2023-03-17
              • 2010-09-27
              • 2011-12-07
              • 2021-08-08
              • 1970-01-01
              • 2017-11-27
              相关资源
              最近更新 更多