【问题标题】:Error saving a numpy.ndarray as an image (.png) using matplotlib.pyplot.imsave使用 matplotlib.pyplot.imsave 将 numpy.ndarray 保存为图像 (.png) 时出错
【发布时间】:2014-10-03 11:27:49
【问题描述】:

如何将numpy.ndarray 导出为图形文件(png、jpg、...)?

当我尝试以下操作时:

test = zeros((500, 750, 3), dtype=numpy.uint8)
imsave('out.png',test)

我收到此错误:

TypeError: from_bounds() takes exactly 4 arguments (5 given)

下面是完整的错误输出:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-ff0e3e551b72> in <module>()
----> 1 imsave('out.png',test)

/usr/lib/pymodules/python2.7/matplotlib/pyplot.pyc in imsave(*args, **kwargs)
   1751 @docstring.copy_dedent(_imsave)
   1752 def imsave(*args, **kwargs):
-> 1753     return _imsave(*args, **kwargs)
   1754 
   1755 def matshow(A, fignum=None, **kw):

/usr/lib/pymodules/python2.7/matplotlib/image.pyc in imsave(fname, arr, vmin, vmax, cmap, format, origin, dpi)
   1229 
   1230     figsize = [x / float(dpi) for x in arr.shape[::-1]]
-> 1231     fig = Figure(figsize=figsize, dpi=dpi, frameon=False)
   1232     canvas = FigureCanvas(fig)
   1233     im = fig.figimage(arr, cmap=cmap, vmin=vmin, vmax=vmax, origin=origin)

/usr/lib/pymodules/python2.7/matplotlib/figure.pyc in __init__(self, figsize, dpi, facecolor, edgecolor, linewidth, frameon, subplotpars)
    266         self.dpi_scale_trans = Affine2D()
    267         self.dpi = dpi
--> 268         self.bbox_inches = Bbox.from_bounds(0, 0, *figsize)
    269         self.bbox = TransformedBbox(self.bbox_inches, self.dpi_scale_trans)
    270 

TypeError: from_bounds() takes exactly 4 arguments (5 given)

【问题讨论】:

  • 如果您向我们展示您从哪里导入 imsave 会有所帮助
  • 也许试试 uint8 而不是 int8?
  • @John Zwinck - 你是对的。应该是dtype=numpy.uint8。但即便如此,imsave 也不起作用。
  • @ali_m - 函数imsave来自matplotlib.pyplot

标签: python python-2.7 numpy matplotlib


【解决方案1】:

您可以使用 PIL:

import Image
import numpy as np

test = np.zeros((500, 750, 3), np.int8)
im = Image.fromarray(test, 'RGB')
im.save('test.png')

【讨论】:

    【解决方案2】:

    您看到的错误原因是回溯中的这一行:

    1230     figsize = [x / float(dpi) for x in arr.shape[::-1]]
    

    您的数组是 3 维的,因此 figsize 将是一个长度为 3 的列表。稍后,此列表将在 Bbox.from_bounds() 的参数中解压缩:

    --> 268         self.bbox_inches = Bbox.from_bounds(0, 0, *figsize)
    

    Bbox.from_bounds() 需要 4 个参数,但由于 figsize 的长度是 3,它会得到 5 个参数,因此会出错。

    此错误仅影响 RGB(A) 图像数组,and was fixed in this commit - 如果您将 matplotlib 版本更新到 1.3.1 或更高版本,问题就会消失。

    当然,还有很多其他方法可以将 numpy 数组保存到图像文件中,您始终可以使用 PIL(如@enrico.bascis 的回答),或者@JohnZwink 链接到的问题中的其他方法之一而是。

    【讨论】:

      猜你喜欢
      • 2012-05-09
      • 2012-10-16
      • 2017-09-24
      • 2011-08-21
      • 1970-01-01
      • 2017-03-01
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      相关资源
      最近更新 更多