【问题标题】:Saving a Numpy array as an image (instructions)将 Numpy 数组保存为图像(说明)
【发布时间】:2011-10-18 09:50:48
【问题描述】:

我在之前的帖子中找到了答案:Saving a Numpy array as an image。唯一的问题是,没有太多关于使用 PyPNG 模块的说明。

网上只有几个例子—— http://packages.python.org/pypng/ex.html#numpy http://nullege.com/codes/search/png.Writer.write

但是鉴于这样的 .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 保存为 n=80 列、m=105 行的灰度 png 图像。

谢谢,

【问题讨论】:

  • PIL,尽管存在所有问题,但至少得到了更广泛的使用,因此得到了更好的支持。 pythonware.com/products/pil 你最好只做任何你需要的重新缩放(例如重新缩放并转换为uint8)然后Image.fromarray(data).save('whatever.png')
  • 我应该说,PrincipalComponent 是 numpy.ndarray 类型而不是列表。我可以使用 PrincipalComponent.reshape(row,col) 重新缩放数组,但是将 numpy.ndarray 转换为可写图像文件?
  • 这是(numpy.ndarrayImage.fromarray 所期望的,物有所值。

标签: python image numpy


【解决方案1】:

使用 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')

【讨论】:

  • 感谢乔的帮助!图像文件正在按预期读取。
  • 如果您的数据是 rgb 格式的 3 维数据,您将如何做同样的事情
  • 如何将此变量保存为服务器上的图像文件?
【解决方案2】:

最好使用 scipy。

from scipy.misc import imsave
# x is the array you want to save 
imsave("image.png", x)

完整文档在这里:https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.misc.imsave.html

【讨论】:

    【解决方案3】:
    import matplotlib.pyplot as plt
    import numpy as np
    plt.imshow(np.random.random(100, 100))
    plt.savefig('')
    

    【讨论】:

    • 您好,请考虑添加您的代码说明。
    • 欢迎来到 Stack Overflow!感谢您提供此代码 sn-p,它可能会提供一些即时帮助。一个正确的解释would greatly improve 其教育价值通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有类似但不相同的问题的读者更有用。请edit您的答案添加解释,并说明适用的限制和假设。
    • 这不能按预期工作,因为它包含 matplotlib 框架
    猜你喜欢
    • 2010-10-28
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2015-02-20
    • 2021-02-05
    • 1970-01-01
    • 2020-12-01
    相关资源
    最近更新 更多