Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用scikit图像以高精度(16位)将numpy阵列另存为图像_Python_Image Processing_Numpy_Scipy_Scikit Image - Fatal编程技术网

Python 使用scikit图像以高精度(16位)将numpy阵列另存为图像

Python 使用scikit图像以高精度(16位)将numpy阵列另存为图像,python,image-processing,numpy,scipy,scikit-image,Python,Image Processing,Numpy,Scipy,Scikit Image,我正在使用2D浮点numpy数组,我希望以高精度(例如16位)将其保存到greyscale.png文件中。如果可能的话,我想使用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 = expo

我正在使用2D浮点numpy数组,我希望以高精度(例如16位)将其保存到greyscale.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)
array([[  0,  85],
       [170, 255]], dtype=uint8)
首先,我尝试将其保存为图像,然后使用Python图像库重新加载:

# try with pil:
io.use_plugin('pil')
io.imsave('test_16bit.png', im)
im2 = io.imread('test_16bit.png')
im2
产生:

array([[    0, 21845],
       [43690, 65535]], dtype=uint16)
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
库执行此操作:

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

太好了,谢谢abudis。对于有此问题的其他用户:我在OSX上;我用自制软件安装了freeimage(
brew安装freeimage
),然后上述(
io.use_plugin('freeimage')
)工作正常。另一种选择是pypng。请看我的回答: