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?
OriginalL'auteur tsawallis | 2014-06-16
Vous devez vous connecter pour publier un commentaire.
Vous voulez utiliser la
freeimage
de la bibliothèque de le faire:Résultat:
Comme pour tableaux 3D, vous avez besoin pour construire le tableau correctement et puis il va travailler:
Noter que la lecture de l'image est inversée, donc quelque chose comme
np.fliplr(np.flipud(im2))
de la porter à la forme originale.brew install freeimage
) puis le ci-dessus (io.use_plugin('freeimage')
) a très bien fonctionné.OriginalL'auteur abudis