使用matplotlib.pyplot.imsave将numpy.ndarray保存为图像(.png)时出错

时间:2014-08-10 14:39:11

标签: python python-2.7 numpy matplotlib

如何将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)

2 个答案:

答案 0 :(得分:4)

您正在查看的错误原因是追溯中的这一行:

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

您的数组是三维的,因此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链接到了。

答案 1 :(得分:3)

您可以使用PIL:

import Image
import numpy as np

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