Enregistrer un tableau numpy que l'image avec la haute précision (16 bits) avec scikit-image

Je suis en train de travailler avec la 2D à virgule flottante tableaux numpy que je voudrais économiser de l'échelle de gris .les fichiers png avec une grande précision (par exemple, 16 bits). Je voudrais faire cela à l'aide de la scikit-image skimage.io paquet si possible.

Voici la principale chose que j'ai essayé:

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

produit:

array([[    0, 21845],
       [43690, 65535]], dtype=uint16)

J'ai d'abord essayé de sauver une image puis de rechargement à l'aide de la Bibliothèque Python Imaging library:

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

produit:

array([[  0,  85],
       [170, 255]], dtype=uint8)

Donc quelque part (soit dans l'écriture ou de lecture), j'ai perdu de la précision. J'ai ensuite essayé avec le matplotlib plugin:

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

me donne un 32 bits float:

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

mais je doute que cela soit vraiment de 32-bits de donnée que j'ai sauvé un 16 bits uint pour le fichier. Il serait génial si quelqu'un pouvait m'indiquer où je vais mal. Je voudrais étendre à la 3D tableaux de trop (c'est à dire l'épargne de 16 bits par canal de couleur de 48 bits par image).

Mise à JOUR:

Le problème est avec imsave. Les images sont de 8 bits par canal. Comment peut-on utiliser io.imsave à la sortie d'une grande profondeur de bits de l'image?

Une autre alternative est pypng. Voir ma réponse ici: stackoverflow.com/questions/25696615/...

OriginalL'auteur tsawallis | 2014-06-16