python数组转图片 - python矩阵保存为图片



将Numpy数组保存为图像 (9)

@ 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的高字节,透明性也可以工作。)

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


matplotlib svn有一个新的功能来将图像保存为一个图像 - 没有坐标轴等,这也是一个非常简单的功能,如果您不想安装svn(直接从matplotlib svn中的image.py中复制, docstring为简洁起见):

def imsave(fname, arr, vmin=None, vmax=None, cmap=None, format=None, origin=None):
    from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
    from matplotlib.figure import Figure

    fig = Figure(figsize=arr.shape[::-1], dpi=1, frameon=False)
    canvas = FigureCanvas(fig)
    fig.figimage(arr, cmap=cmap, vmin=vmin, vmax=vmax, origin=origin)
    fig.savefig(fname, dpi=1, format=format)

使用PIL的答案(以防万一)。

给定一个数组“A”:

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

你可以用几乎任何你想要的格式替换“jpeg”。 有关here格式的更多细节


假设你想要一个灰度图像:

im = Image.new('L', (width, height))
im.putdata(an_array.flatten().tolist())
im.save("image.tiff")

如果您恰好已经使用[Py] Qt,那么您可能对qimage2ndarray感兴趣。 从版本1.4(刚刚发布)开始,PySide也受到支持,并且会有一个类似于scipy的小型imsave(filename, array)函数,但使用Qt代替PIL。 使用1.3,只需使用以下内容:

qImage = array2qimage(image, normalize = False) # create QImage from ndarray
success = qImage.save(filename) # use Qt's image IO functions for saving PNG/JPG/..

(1.4的另一个优点是它是一个纯粹的Python解决方案,这使得它更加轻量级。)


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

例:

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

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.


纯Python(2&3),没有第三方依赖关系的片段。

该函数写入压缩的真彩色(每像素4个字节) RGBA PNG。

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://.com/a/21034111/432509 ://.com/a/21034111/432509

这使用PIL,但也许有些人可能会觉得它有用:

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

编辑 :当前scipy版本开始正常化所有图像,以便最小(数据)变成黑色,最大(数据)变成白色。 如果数据应该是精确的灰度级或精确的RGB通道,则这是不需要的。 解决方案:

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




numpy