我正在使用 2D 浮点 numpy 数组,我想将其保存为高精度(例如 16 位)的灰度 .png 文件。如果可能的话,我想使用 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 图像库重新加载:
# 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 位 float :
array([[ 0. , 0.33333334],
[ 0.66666669, 1. ]], dtype=float32)
但我怀疑这真的是 32 位的,因为我在文件中保存了一个 16 位的 uint。如果有人能指出我哪里出错了,那就太好了。我也希望它能扩展到 3D 阵列(即每个颜色 channel 节省 16 位,每个图像节省 48 位)。
更新:
问题出在 imsave 上。图像是每 channel 8 位。如何使用 io.imsave 输出高位深度图像?
最佳答案
您想使用 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))
之类的东西会把它变成原来的形状。
关于python - 使用 scikit-image 将 numpy 数组保存为高精度(16 位)图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24240039/