我正在使用
保存图像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),因为降低采样率会丢失重要信息。
谢谢。
答案 0 :(得分:0)
使用matplotlib将图像保存为仅具有256种颜色(= 8位)的任何默认颜色图时,您无法保留16位的位深度。
此外,matplotlib将像素值转换为浮点数,这可能是舍入错误的来源。
总的来说,如果需要获得完美的准确性,matplotlib似乎并不是最佳的工具。
话虽如此,即使PIL
似乎也不允许16位单通道png。 this question中有可能的解决方案,但我尚未对其进行测试。
在任何情况下,保存数组而不丢失精度的防弹方法是使用numpy np.save("arr.npy", im_arr)
保存。