使用scikit-image将numpy数组另存为高精度图像(16位)
image-processing
numpy
python
scipy
5
0

我正在使用2D浮点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位uint保存到了文件中。如果有人可以指出我要去哪里,那将很棒。我也希望将其扩展到3D阵列(即每个颜色通道节省16位,每个图像节省48位)。

更新:

问题在于储蓄。图像是每个通道8位。如何使用io.imsave输出高位深度的图像?

参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

您想使用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))将变为原始形状。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号