使用matplotlib保存灰度图像,并且在加载时具有多个通道

时间:2018-07-11 20:16:24

标签: python image matplotlib

我正在使用

保存图像
import matplotlib.pyplot as plt
plt.imsave(img_path,img_arr,cmap = 'gray') #shape (512,512)
...
img = plt.imread(img_path)

和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),因为降低采样率会丢失重要信息。

谢谢。

1 个答案:

答案 0 :(得分:0)

使用matplotlib将图像保存为仅具有256种颜色(= 8位)的任何默认颜色图时,您无法保留16位的位深度。

此外,matplotlib将像素值转换为浮点数,这可能是舍入错误的来源。

总的来说,如果需要获得完美的准确性,matplotlib似乎并不是最佳的工具。

话虽如此,即使PIL似乎也不允许16位单通道png。 this question中有可能的解决方案,但我尚未对其进行测试。

在任何情况下,保存数组而不丢失精度的防弹方法是使用numpy np.save("arr.npy", im_arr)保存。