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?

Eine weitere alternative ist pypng. Siehe meine Antwort hier: stackoverflow.com/questions/25696615/...

InformationsquelleAutor tsawallis | 2014-06-16

Schreibe einen Kommentar