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

12

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

另一个选择是pypng。请参见我的答案:https://dev59.com/Kl8e5IYBdhLWcg3wfaYy#25814423 - Warren Weckesser
1个回答

12

你想使用 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))这样的方法可以将其还原为原始形状。


2
太好了,谢谢abudis。对于其他遇到这个问题的用户:我使用的是OSX;我通过homebrew安装了freeimage(brew install freeimage),然后上面的代码(io.use_plugin('freeimage'))就可以正常工作了。 - tsawallis
如何在Windows上安装FreeImage插件? - Kaschi14

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接