我正在使用2D浮点numpy数组,我想保存到高精度的灰度.png文件(例如16位).skimage.io如果可能的话,我想使用scikit-image 包.
这是我尝试过的主要内容:
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
Run Code Online (Sandbox Code Playgroud)
生产:
array([[ 0, 21845],
[43690, 65535]], dtype=uint16)
Run Code Online (Sandbox Code Playgroud)
首先,我尝试将其保存为图像,然后使用Python Imaging Library重新加载:
# try with pil:
io.use_plugin('pil')
io.imsave('test_16bit.png', im)
im2 = io.imread('test_16bit.png')
im2
Run Code Online (Sandbox Code Playgroud)
生产:
array([[ 0, 85],
[170, 255]], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)
所以在某处(无论是写入还是读取)我都失去了精确度.然后我尝试使用matplotlib插件:
# try with matplotlib:
io.use_plugin('matplotlib')
io.imsave('test_16bit.png', im)
im3 = io.imread('test_16bit.png')
im3
Run Code Online (Sandbox Code Playgroud)
给我一个32位浮点数:
array([[ 0. , 0.33333334],
[ 0.66666669, 1. ]], …Run Code Online (Sandbox Code Playgroud) 我正在使用
import matplotlib.pyplot as plt
plt.imsave(img_path,img_arr,cmap = 'gray') #shape (512,512)
...
img = plt.imread(img_path)
Run Code Online (Sandbox Code Playgroud)
并且 img.shape 返回一个 (512,512,4) 而我预计它只会是 (512,512)。我想也许所有的频道都是一样的,所以我可以只选择一个,但np.allclose(img[:,:,0],img_arr)
无论我选择哪个索引都返回 false。打印图像,它们确实是我比较的正确图像,因为它们看起来几乎相同(肉眼),但显然不完全相同。
我也尝试用 cv2 保存图像,但由于某种原因,这似乎保存了一个黑匣子。加载它们cv2.imread(img_path,0)确实会返回一个 (512,512) 数组,但似乎丢失了一些东西,因为再次np.allclose()告诉我它们是不同的。
我想知道是否有保存灰度图像的好方法?我尝试的每种方法似乎都将其转换为 RBG 或 RGBA,这真的很烦人。另外,我想保留图像的 dtype (int16),因为下采样会丢失重要信息。
提前致谢。
我有一个NumPy数组格式的图像,我想将它保存到我的磁盘.我用过这段代码:
from PIL import Image
....
Image.fromarray(img).save('res.png')
Run Code Online (Sandbox Code Playgroud)
但它保存为8位.如何将其保存为16位?