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