Сохраните массив numy как изображение с высокой точностью (16 бит) с помощью scikit-image

Я работаю с двумерными массивами с плавающей точкой, которые я хотел бы сохранить с высокой точностью в файлах .png в оттенках серого (например, 16 бит). Я хотел бы сделать это с помощью scikit-изображенияskimage.io пакет, если это возможно.

Вот главное, что я пробовал:

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

производит:

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

Сначала я попытался сохранить это как изображение, а затем перезагрузить, используя библиотеку изображений Python:

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

производит:

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

Так что где-то (либо в записи, либо в чтении) я потерял точность. Затем я попытался с плагином Matplotlib:

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

дает мне 32-битное число:

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

но я сомневаюсь, что это действительно 32-битная версия, учитывая, что я сохранил 16-битную UINT в файл. Было бы замечательно, если бы кто-то мог указать мне, где я иду не так. Мне бы хотелось, чтобы это также распространялось и на трехмерные массивы (т. Е. Экономия 16 бит на канал цвета, 48 бит на изображение).

ОБНОВИТЬ:

Проблема с imsave. Изображения 8 бит на канал. Как можно использовать io.imsave для вывода изображения с большой битовой глубиной?

Ответы на вопрос(1)

Ваш ответ на вопрос