使用matplotlib保存灰度图像,加载时出现多个通道的情况

6

我正在使用以下方法保存图片:

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个回答

1

如果使用默认的色图,matplotlib 只有 256 种颜色(=8 位),因此无法保留 16 位的位深度。

另外,matplotlib 将像素值转换为浮点数,这可能会导致舍入误差。

总的来说,如果需要完美的精度,matplotlib 似乎不是最佳工具。

话虽如此,即使 PIL 也似乎不能允许 16 位单通道 PNG。在 this question 中有一个可能的解决方案,但我还没有测试过。

无论如何,保存数组并且不会失去精度的可靠方法是使用 numpy,np.save("arr.npy", im_arr)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接