433 Stimmen

Speichern eines Numpy-Arrays als Bild

Ich habe eine Matrix in der Art eines Numpy-Arrays. Wie würde ich sie als Bild auf die Festplatte schreiben? Jedes Format funktioniert (png, jpeg, bmp...). Eine wichtige Randbedingung ist, dass PIL nicht vorhanden ist.

460voto

migas Punkte 4149

Eine Antwort mit PIL (nur für den Fall, dass es nützlich ist).

ein numpy-Array "A" gegeben:

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

können Sie "jpeg" durch fast jedes beliebige Format ersetzen. Mehr Details über die Formate aquí

273voto

Steve Tjoa Punkte 55411

Hier wird PIL verwendet, aber vielleicht ist es für einige nützlich:

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

EDIT : Die aktuelle scipy Version begann, alle Bilder zu normalisieren, so dass min(Daten) schwarz und max(Daten) weiß werden. Dies ist unerwünscht, wenn die Daten exakte Graustufen oder exakte RGB-Kanäle sein sollen. Die Lösung:

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

136voto

christianbrodbeck Punkte 1805

Mit matplotlib :

import matplotlib

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

Funktioniert mit matplotlib 1.3.1, ich weiß nicht, über niedrigere Version. Aus dem docstring:

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.

enter image description here

93voto

ButterDog Punkte 4915

Es gibt opencv für Python ( Dokumentation hier ).

import cv2
import numpy as np

img = ... # Your image as a numpy array 

cv2.imwrite("filename.png", img)

nützlich, wenn Sie neben dem Speichern noch weitere Vorgänge durchführen müssen.

85voto

ideasman42 Punkte 35167

Reines Python (2 & 3), ein Snippet ohne Abhängigkeiten von Drittanbietern.

Diese Funktion schreibt komprimierte, farbgetreue (4 Byte pro Pixel) RGBA PNG's.

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'')])

... Die Daten sollten direkt in eine Datei geschrieben werden, die als Binärdatei geöffnet ist, wie in:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X