Speichern numpy-array als Bild mit hoher Genauigkeit (16 bit) mit scikit-image
Arbeite ich mit 2D-floating-point-numpy-arrays, ich würde gerne speichern, um die Graustufen .png-Dateien mit hoher Präzision (z.B. 16 bits). Ich möchte dies tun, indem Sie die scikit-image skimage.io
Paket, wenn möglich.
Hier ist das wichtigste, was ich versucht habe:
import numpy as np
from skimage import io, exposure, img_as_uint, img_as_float
im = np.array([[1., 2.], [3., 4.]], dtype='float64')
im = exposure.rescale_intensity(im, out_range='float')
im = img_as_uint(im)
im
produziert:
array([[ 0, 21845],
[43690, 65535]], dtype=uint16)
Zuerst habe ich versucht, speichern Sie diese als Bild, dann nachladen mit Hilfe der Python Imaging-Bibliothek:
# try with pil:
io.use_plugin('pil')
io.imsave('test_16bit.png', im)
im2 = io.imread('test_16bit.png')
im2
produziert:
array([[ 0, 85],
[170, 255]], dtype=uint8)
Also irgendwo (entweder im schreiben oder Lesen) ich habe verloren Präzision. Ich habe dann versucht mit der matplotlib-plugin:
# try with matplotlib:
io.use_plugin('matplotlib')
io.imsave('test_16bit.png', im)
im3 = io.imread('test_16bit.png')
im3
gibt mir eine 32-bit-float:
array([[ 0. , 0.33333334],
[ 0.66666669, 1. ]], dtype=float32)
aber ich bezweifle, dass das wirklich ist, 32-bit gegeben, dass ich gerettet eine 16-bit uint zu der Datei. Es wäre toll, wenn jemand könnte mich zu, wohin ich gehe falsch. Ich möchte diese erweitern, um 3D-arrays (d.h. speichern 16 bit pro Farbkanal, für die 48 bits pro Bild).
UPDATE:
Ist das problem mit imsave. Die Bilder werden mit 8 bit pro Kanal. Wie kann man io.imsave zur Ausgabe eines high-bit-Tiefe-Bild?
InformationsquelleAutor tsawallis | 2014-06-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du willst verwenden Sie die
freeimage
Bibliothek zu tun:Ergebnis:
Als 3D-arrays, die Sie benötigen, zu konstruieren, das array richtig und dann klappts:
Beachten Sie, dass das lese-Bild ist gespiegelt, so etwas wie
np.fliplr(np.flipud(im2))
bringen Sie es zur ursprünglichen Form.brew install freeimage
), dann ist die oben (io.use_plugin('freeimage')
) hat Prima funktioniert.InformationsquelleAutor abudis