Zar*_*doz 4 python numpy image scipy python-imaging-library
使用Scipy保存二维Numpy数组(单个值)toimage或imsave像素值与Numpy数组中的像素值不完全匹配时.相反,有些区域,主要是在边缘,图像算法似乎使用某种插值.
是否有一个选项可以停止插值并保留精确数据(例如7在PNG中总是得到rgb(7,7,7)?
如果您有一个2D numpy数组,那么您将保存为灰度PNG,因此您永远不会获得rgb图像(只有一个通道).我不确定单个值是什么意思,也许它是单精度浮点数?尽管PIL支持单精度浮点数,但PNG却不支持.保存为PNG,您可以使用每通道8位(默认值)或每通道16位.这意味着您的数组将被缩放到最大2 ^ 8/2 ^ 16(8/16位),并转换为整数.在此转换中,结果可能略有不同.
随着scipy.misc.image人们似乎没有选择另存为16位,因此会一直写一个8位PNG.但您可以使用scipy.misc.toimage创建一个16位图像,只需确保通过mode='I'.还要确保指定数组min和max以避免缩放.以下是如何使用它来保存16位png:
import numpy as np
import scipy.misc
a = np.random.uniform(0, 2**16 - 1, (500, 500)).astype('int32')
img = scipy.misc.toimage(a, high=np.max(a), low=np.min(a), mode='I')
img.save('my16bit.png')
# check that you got the same values
b = scipy.misc.imread('my16bit.png')
b.dtype
# dtype('int32')
np.array_equal(a, b)
# True
Run Code Online (Sandbox Code Playgroud)
请注意,在此示例中,我用于int32数据类型.但是,数据必须仍然适合uint16.如果您将负值或值设置为大于2 ^ 16,则会将这些值剪切到保存到PNG中.相反,即使sp.misc.imread读取为int32,数据也永远不会超过uint16.
总结:如果你想要将完全相同的numpy数组写入PNG,你需要确保它是uint8/uint16类型的,并且你传递正确high/low/mode的scipy.misc.toimage.