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

Ian*_*olo 6 python image matplotlib

我正在使用

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

提前致谢。

Imp*_*est 1

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

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

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

话虽这么说,甚至PIL似乎不允许 16 位单通道 png。这个问题有一个可能的解决方案,但我还没有测试过。

无论如何,保存数组而不损失准确性的万无一失的方法是使用 numpy, np.save("arr.npy", im_arr).