Guarde una matriz numpy como imagen con alta precisión (16 bits) con scikit-image

Estoy trabajando con matrices numpy de punto flotante 2D que me gustaría guardar en archivos .png en escala de grises con alta precisión (por ejemplo, 16 bits). Me gustaría hacer esto usando la imagen scikitskimage.io paquete si es posible.

Aquí está lo principal que he probado:

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

produce:

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

Primero intenté guardar esto como una imagen y luego volver a cargar usando la Biblioteca de imágenes de Python:

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

produce:

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

Entonces, en algún lugar (ya sea en la escritura o en la lectura) he perdido precisión. Luego probé con el complemento matplotlib:

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

me da un flotador de 32 bits:

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

pero dudo que esto sea realmente de 32 bits dado que guardé una uint de 16 bits en el archivo. Sería genial si alguien pudiera señalarme dónde me estoy equivocando. Me gustaría que esto también se extienda a las matrices 3D (es decir, guardar 16 bits por canal de color, para 48 bits por imagen).

ACTUALIZAR:

El problema es con imsave. Las imágenes son de 8 bits por canal. ¿Cómo se puede usar io.imsave para generar una imagen de alta profundidad de bits?

Respuestas a la pregunta(1)

Su respuesta a la pregunta