当前位置:  开发笔记 > 编程语言 > 正文

将Numpy数组保存为图像

如何解决《将Numpy数组保存为图像》经验,为你挑选了10个好方法。

我有一个Numpy数组类型的矩阵.我如何将其作为图像写入磁盘?任何格式都有效(png,jpeg,bmp ......).一个重要的限制是PIL不存在.



1> Steve Tjoa..:

这使用PIL,但也许有些人可能会发现它很有用:

import scipy.misc
scipy.misc.imsave('outfile.jpg', image_array)

编辑:当前scipy版本开始标准化所有图像,以便min(数据)变为黑色,max(数据)变为白色.如果数据应该是精确的灰度级或精确的RGB通道,则这是不希望的.解决方案:

import scipy.misc
scipy.misc.toimage(image_array, cmin=0.0, cmax=...).save('outfile.jpg')


imsave生活在.../scipy/misc/pilutil.py中使用PIL
这个现在在scipy 0.19中被弃用 - scipy.io.imwrite
转换为jpg时要小心,因为它有损,因此您可能无法恢复用于生成图像的确切数据.
"imsave在SciPy 1.0.0中已弃用,将在1.2.0中删除"([Scipy 1.1.0 doc](https://docs.scipy.org/doc/scipy-1.1.0/reference/generated/ scipy.misc.imsave.html))
scipy.misc.imsave已过时。使用导入图像 imageio.imwrite('file_name.jpg',nmupy_array)

2> migas..:

使用PIL的答案(以防它有用).

给出一个numpy数组"A":

from PIL import Image
im = Image.fromarray(A)
im.save("your_file.jpeg")

您可以用几乎任何您想要的格式替换"jpeg".有关格式的详细信息在这里


非常有帮助我们这些在这里徘徊并且有PIL的人 - 我想我会使用`来自PIL import Image`以保持清晰......
图像是PIL的模块.做"打印图像.__文件___"
如果您有RGB图像,可以使用im = Image.fromarray(A).convert('RGB')获取图像更多信息:http://stackoverflow.com/questions/4711880/pil-using-fromarray -with二进制数据和写入色文本

3> christianbro..:

matplotlib:

import matplotlib

matplotlib.image.imsave('name.png', array)

使用matplotlib 1.3.1,我不知道降低版本.从文档字符串:

Arguments:
  *fname*:
    A string containing a path to a filename, or a Python file-like object.
    If *format* is *None* and *fname* is a string, the output
    format is deduced from the extension of the filename.
  *arr*:
    An MxN (luminance), MxNx3 (RGB) or MxNx4 (RGBA) array.

在此输入图像描述


它是matplotlib 2+中的`matplotlib.pyplot.imsave`
将matplotlib.pyplot导入为plt然后将plt.imsave('name.png',数组)导入

4> ideasman42..:

纯Python(2和3),没有第三方依赖的片段.

此函数写入压缩的真彩色(每像素4个字节)RGBAPNG.

def write_png(buf, width, height):
    """ buf: must be bytes or a bytearray in Python3.x,
        a regular string in Python2.x.
    """
    import zlib, struct

    # reverse the vertical line order and add null bytes at the start
    width_byte_4 = width * 4
    raw_data = b''.join(
        b'\x00' + buf[span:span + width_byte_4]
        for span in range((height - 1) * width_byte_4, -1, - width_byte_4)
    )

    def png_pack(png_tag, data):
        chunk_head = png_tag + data
        return (struct.pack("!I", len(data)) +
                chunk_head +
                struct.pack("!I", 0xFFFFFFFF & zlib.crc32(chunk_head)))

    return b''.join([
        b'\x89PNG\r\n\x1a\n',
        png_pack(b'IHDR', struct.pack("!2I5B", width, height, 8, 6, 0, 0, 0)),
        png_pack(b'IDAT', zlib.compress(raw_data, 9)),
        png_pack(b'IEND', b'')])

...数据应直接写入以二进制形式打开的文件,如:

data = write_png(buf, 64, 64)
with open("my_image.png", 'wb') as fd:
    fd.write(data)

原始来源

另请参阅:此问题的Rust端口.

感谢@Evgeni Sergeev的示例用法:https://stackoverflow.com/a/21034111/432509


这似乎正是我正在寻找的,但你可以添加一些评论吗?我没看到这是如何写入文件的.您是否必须在先前打开的文件中写入输出?谢谢!

5> dF...:

你可以使用PyPNG.它是纯Python(无依赖性)开源PNG编码器/解码器,它支持将NumPy数组编写为图像.


PyPNG是纯Python,它减少了它的外部依赖性,但使它比PIL及其派生类慢得多.例如,使用PyPNG在我的机器上保存3000x4000图像需要4.05秒,而使用scipy.misc.imsave只需0.59秒(快6倍).
请记住将值缩放到PNG的正确范围,通常为0..255.神经网络中的值范围通常为0..1或-1..1.

6> Xocoatzin..:

opencvpython(文档在这里).

import cv2
import numpy as np

cv2.imwrite("filename.png", np.zeros((10,10)))

如果您需要进行除保存以外的更多处理,则非常有用.


当我使用cv2保存图像时,如何添加类似`cmap ="gray"的内容?
@Gathide就像将一些任意的numpy矩阵写入文件的示例。在现实生活中,将`np.zeros((10,10))`替换为您的图片。

7> DopplerShift..:

如果你有matplotlib,你可以这样做:

import matplotlib.pyplot as plt
plt.imshow(matrix) #Needs to be in row,col order
plt.savefig(filename)

这将保存绘图(不是图像本身). 在此输入图像描述


不,对于pyplot接口,plt.figure()是多余的.此外,如果您还想要查看图形窗口,则只需要plt.show() - 在这种情况下,只需要保存图像文件,因此无需调用show().
请注意,生成的图像文件将包含matlplotlib图形的轴和灰色区域 - 而不仅仅是像素数据.

8> 小智..:

您可以在Python中使用'skimage'库

例:

from skimage.io import imsave
imsave('Path_to_your_folder/File_name.jpg',your_array)



9> Evgeni Serge..:

@ ideasman42答案的附录:

def saveAsPNG(array, filename):
    import struct
    if any([len(row) != len(array[0]) for row in array]):
        raise ValueError, "Array should have elements of equal size"

                                #First row becomes top row of image.
    flat = []; map(flat.extend, reversed(array))
                                 #Big-endian, unsigned 32-byte integer.
    buf = b''.join([struct.pack('>I', ((0xffFFff & i32)<<8)|(i32>>24) )
                    for i32 in flat])   #Rotate from ARGB to RGBA.

    data = write_png(buf, len(array[0]), len(array))
    f = open(filename, 'wb')
    f.write(data)
    f.close()

所以你可以这样做:

saveAsPNG([[0xffFF0000, 0xffFFFF00],
           [0xff00aa77, 0xff333333]], 'test_grid.png')

制作test_grid.png:

网格的红色,黄色,深色浅绿色,灰色

(透明度也可以,通过减少高字节0xff.)



10> 小智..:

scipy.misc给出有关imsave功能的弃用警告,并建议使用imageio替代功能。

import imageio
imageio.imwrite('image_name.png', img)

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有