使用scikit imag将numpy数组保存为高精度图像(16位)

2024-06-07 01:09:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用二维浮点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输出高位深度图像?


Tags: 文件iotest图像numpyimgpngmatplotlib
1条回答
网友
1楼 · 发布于 2024-06-07 01:09:02

要使用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]]

对于三维阵列,您需要正确构造阵列,然后它才能工作:

# 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))之类的内容将使其恢复原始形状。

相关问题 更多 >