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.
Antworten
Zu viele Anzeigen?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')
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.
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.
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)
- Ursprüngliche Quelle
- Siehe auch: Rust Port in dieser Frage.
- Beispielanwendung dank @Evgeni Sergeev: https://stackoverflow.com/a/21034111/432509
- See previous answers
- Weitere Antworten anzeigen