Save numpy array as image with high precision (16 bits) with scikit-image Save numpy array as image with high precision (16 bits) with scikit-image numpy numpy

Save numpy array as image with high precision (16 bits) with scikit-image


You wanna use the freeimage library to do so:

import numpy as npfrom skimage import io, exposure, img_as_uint, img_as_floatio.use_plugin('freeimage')im = np.array([[1., 2.], [3., 4.]], dtype='float64')im = exposure.rescale_intensity(im, out_range='float')im = img_as_uint(im)io.imsave('test_16bit.png', im)im2 = io.imread('test_16bit.png')

Result:

[[    0 21845] [43690 65535]]

As for 3D arrays, you need to construct the array properly and then it'll work:

# im = np.array([[1, 2.], [3., 4.]], dtype='float64')im = np.linspace(0, 1., 300).reshape(10, 10, 3)im = exposure.rescale_intensity(im, out_range='float')im = img_as_uint(im)io.imsave('test_16bit.png', im)im2 = io.imread('test_16bit.png')

Note that the read image is flipped, so something like np.fliplr(np.flipud(im2)) will bring it to original shape.