Speichern Sie numpy array als Bild mit hoher Genauigkeit (16 Bit) mit scikit-image

Ich arbeite mit 2D-Gleitkomma-Arrays, die ich mit hoher Genauigkeit (z. B. 16 Bit) in Graustufen-PNG-Dateien speichern möchte. Ich würde das gerne mit dem Scikit-Bild machenskimage.io wenn möglich paketieren.

Hier ist die Hauptsache, die ich ausprobiert 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, dies als Bild zu speichern und dann mit der Python Imaging-Bibliothek neu zu laden:

# 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)

Irgendwo (entweder beim Schreiben oder Lesen) habe ich die Präzision verloren. Ich habe es dann mit dem matplotlib Plugin versucht:

# try with matplotlib:
io.use_plugin('matplotlib')
io.imsave('test_16bit.png', im)
im3 = io.imread('test_16bit.png')
im3

gibt mir ein 32-Bit-float:

array([[ 0.        ,  0.33333334],
       [ 0.66666669,  1.        ]], dtype=float32)

aber ich bezweifle, dass dies wirklich 32-Bit ist, da ich eine 16-Bit-Uint in der Datei gespeichert habe. Es wäre großartig, wenn mich jemand darauf hinweisen könnte, wo ich falsch liege. Ich möchte, dass dies auch auf 3D-Arrays ausgedehnt wird (d. H. Einsparung von 16 Bit pro Farbkanal für 48 Bit pro Bild).

AKTUALISIEREN:

Das Problem ist mit imsave. Die Bilder sind 8 Bits pro Kanal. Wie kann man mit io.imsave ein Bild mit hoher Bittiefe ausgeben?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage