Skip to main content
 首页 » 编程设计

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

2025年05月04日15langtianya

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

请您参考如下方法:

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

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 链接到的问题中的其他方法之一相反。