我试图将一个16位的numpy数组保存为16位的PNG格式,但是我得到的只是一张黑色的图片。下面是一个最简单的例子。
im = np.random.randint(low=1, high=6536, size=65536).reshape(256,256) #sample numpy array to save as image
plt.imshow(im, cmap=plt.cm.gray)
给定上述的numpy数组,使用matplotlib我能看到这张图片,但是当我将这张图片保存为16位的png格式时,我得到了下面这张图片:
import imageio
imageio.imwrite('result.png', im)
图像已保存:
在图像中可以看到一些浅灰色斑点,但图像基本上是黑色的。无论如何,当我读回图像并再次使用matplotlib可视化时,我看到了相同的起始图像。我还尝试了其他库(如PIL或PyPNG)代替imageio,但结果相同。
我知道16位图像值的范围是0到65535,在这里的numpy数组中只有1到6536的值,但我需要保存类似于这样的numpy数组图像,即图像中表示的最大值不是最大可表示值。我认为保存过程中涉及某种归一化。我需要以matplotlib在其最大分辨率下看到它们的确切数组,并且没有压缩或缩小其值(因此除以255或转换为8位数组不适用)。
.tif
。 像.jpg
或.png
这样的格式总是会应用某种压缩。 - JacoSolariimshow
函数会在绘图时归一化颜色范围。如果要查看无符号16位整数的“真实”颜色比例尺,请使用plt.imshow(im, cmap=plt.cm.gray, vmin=0, vmax=65535)
。 - Warren Weckesser