我正在使用二维浮点numpy数组,并希望将其保存为灰度.png文件以达到高精度(例如16位)。如果可能,我想使用scikit-image 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 Imaging Library重新加载:
# 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 位的无符号整数保存到了文件中。如果有人能指出我哪里错了那就太好了。我也希望能够扩展到三维数组(即每个颜色通道保存 16 位,每张图片达到 48 位)。更新:
问题在于 imsave。这些图像每个通道只有 8 位。如何使用 io.imsave 输出高比特深度的图像?