Salve a matriz numpy como imagem com alta precisão (16 bits) com imagem scikit

Estou trabalhando com matrizes numpy de ponto flutuante 2D que gostaria de salvar em arquivos .png em escala de cinza com alta precisão (por exemplo, 16 bits). Eu gostaria de fazer isso usando a imagem-scikitskimage.io pacote, se possível.

Aqui está a principal coisa que eu tentei:

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

produz:

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

Primeiro, tentei salvar isso como uma imagem e recarregar usando a Python Imaging Library:

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

produz:

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

Então, em algum lugar (na escrita ou na leitura) eu perdi a precisão. Eu tentei com o plugin matplotlib:

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

dá-me uma flutuação de 32 bits:

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

mas duvido que seja realmente de 32 bits, pois salvei um uint de 16 bits no arquivo. Seria ótimo se alguém pudesse me indicar onde estou errado. Gostaria que isso também se estendesse às matrizes 3D (ou seja, economizando 16 bits por canal de cor, para 48 bits por imagem).

ATUALIZAR:

O problema está no imsave. As imagens são 8 bits por canal. Como usar o io.imsave para gerar uma imagem com alta profundidade de bits?

questionAnswers(1)

yourAnswerToTheQuestion