您想使用freeimage
库来这样做:
import numpy as np
from skimage import io, exposure, img_as_uint, img_as_float
io.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')
结果:
[[ 0 21845]
[43690 65535]]
对于3D数组,您需要正确地构建数组,然后它才能工作:
# 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')
请注意,读取的图像是翻转的,因此类似np.fliplr(np.flipud(im2))
将变为原始形状。
0
我正在使用2D浮点numpy数组,我想将它们高精度地保存到灰度.png文件(例如16位)。如果可能,我想使用scikit-image
skimage.io
包进行此操作。这是我尝试的主要内容:
产生:
首先,我尝试将其保存为图像,然后使用Python Imaging Library重新加载:
产生:
因此,某个地方(无论是写入还是读取)都失去了精度。然后,我尝试使用matplotlib插件:
给我一个32位浮点数:
但是我怀疑这真的是32位,因为我将16位uint保存到了文件中。如果有人可以指出我要去哪里,那将很棒。我也希望将其扩展到3D阵列(即每个颜色通道节省16位,每个图像节省48位)。
更新:
问题在于储蓄。图像是每个通道8位。如何使用io.imsave输出高位深度的图像?