我正在使用二维浮点numpy数组,我想以高精度保存到greyscale.png文件(例如16位)。如果可能的话,我想使用scikit imageskimage.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。如果有人能指点我错在哪里,那就太好了。我希望这也扩展到3D阵列(即,每彩色通道节省16位,每幅图像节省48位)。
问题在于imsave。图像是每个通道8位。如何使用io.imsave输出高位深度图像?
要使用
freeimage
库来执行此操作:结果:
对于三维阵列,您需要正确构造阵列,然后它才能工作:
请注意,读取的图像是翻转的,因此
np.fliplr(np.flipud(im2))
之类的内容将使其恢复原始形状。相关问题 更多 >
编程相关推荐