将Numpy数组保存为图像(说明)

17
我在以前的帖子中找到了答案:将Numpy数组保存为图像。唯一的问题是,对于使用PyPNG模块没有太多的说明。
只有一些在线示例- http://packages.python.org/pypng/ex.html#numpy http://nullege.com/codes/search/png.Writer.write 但是如果遇到像这样的写入错误,我该怎么办:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/png.py", line 638, in write
    nrows = self.write_passes(outfile, rows)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/png.py", line 783, in write_passes
    extend(row)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/png.py", line 780, in <lambda>
    return lambda sl: f(map(int, sl))
TypeError: argument 2 to map() must support iteration

这是我的代码中出现错误的地方,位于PCA_tool.py中(错误发生在“folder.write(outfilename, PrincipalComponent”)之后:

#PrincipalComponent.save(path+'transform_'+str(each)+'.png', format='PNG')
outfilename = open(str(path)+'transformed/transform_'+str(each)+'.png', 'wb')
folder = png.Writer(m,n,greyscale=True)
folder.write(outfilename, PrincipalComponent)
outfilename.close()

sys.exit(0)
我正在尝试将一个包含8400个元素的numpy.ndarray保存为一张80列、105行的灰度png图像。

谢谢。


2
尽管PIL存在一些问题,但至少它被广泛使用,因此得到了更好的支持。http://www.pythonware.com/products/pil/ 你最好只是进行任何所需的重新缩放(例如重新缩放并转换为uint8),然后Image.fromarray(data).save('whatever.png') - Joe Kington
我应该说,PrincipalComponent是numpy.ndarray类型而不是列表。我可以使用PrincipalComponent.reshape(row,col)重新调整数组的比例,但是将numpy.ndarray转换为可写入的图像文件? - Alvin
这就是 Image.fromarray 所期望的 (numpy.ndarray),如果有用的话。 - Joe Kington
3个回答

40

你最好使用PIL:

from PIL import Image
import numpy as np

data = np.random.random((100,100))

#Rescale to 0-255 and convert to uint8
rescaled = (255.0 / data.max() * (data - data.min())).astype(np.uint8)

im = Image.fromarray(rescaled)
im.save('test.png')

谢谢你的帮助,Joe!图像文件已按预期读取。 - Alvin
1
如果您的数据是三维数据,并且需要转换为RGB格式,您将如何进行操作? - Sulabh Tiwari
如何将此变量保存为服务器上的图像文件? - Santhosh

0
import matplotlib.pyplot as plt
import numpy as np
plt.imshow(np.random.random(100, 100))
plt.savefig('')

3
你好,请考虑添加代码的说明。 - tima
1
欢迎来到Stack Overflow!感谢您提供这段代码片段,它可能会提供一些即时的帮助。通过展示为什么这是一个好的解决方案,适当的解释将极大地提高其教育价值,并使其对未来有类似但不完全相同问题的读者更有用。请编辑您的答案以添加解释,并指出适用的限制和假设。 - Toby Speight
2
这个不像预期的那样工作,因为它包含了matplotlib框架。 - yota

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接