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.