Python 如何从scipy imsave函数中删除规范化

Python 如何从scipy imsave函数中删除规范化,python,numpy,image-processing,scipy,python-imageio,Python,Numpy,Image Processing,Scipy,Python Imageio,我有一个简单的任务要完成,但是我发现当前的保存函数对我没有任何帮助。我要做的就是简单地将灰度图像转换成另一个强度较小的图像(特别是在120和180之间) 我实现了转换(就像改变不同的温度标度),但是当我保存图像时,scipy.misc.imsave会使其正常化。转换是正确的,因为我创建了直方图来显示保存前的强度,并且它们都位于指定的范围内 我尝试过其他工具,如: imageio.imwrite(path, img) numpy.save(path, img) scipy.misc.toimage

我有一个简单的任务要完成,但是我发现当前的保存函数对我没有任何帮助。我要做的就是简单地将灰度图像转换成另一个强度较小的图像(特别是在120和180之间)

我实现了转换(就像改变不同的温度标度),但是当我保存图像时,scipy.misc.imsave会使其正常化。转换是正确的,因为我创建了直方图来显示保存前的强度,并且它们都位于指定的范围内

我尝试过其他工具,如:

imageio.imwrite(path, img)
numpy.save(path, img)
scipy.misc.toimage(img, cmin=120, cmax=180, mode='L').save(path)
我承认最后一个我不太理解参数(我有一个猜测),而这个参数也没有帮助。有人能帮我解决这个问题吗

编辑:我正在发布代码

def ex3():
    I = misc.imread(imgname)
    N =  numpy.multiply(I , float(12.0/51.0))
    N = numpy.add(N, 120)
    NEG = I
    NEG = numpy.add(NEG, -255)
    NEG = numpy.absolute(NEG)
    misc.imsave(path, N)
    misc.imsave(os.getcwd()+"/a0/results/"+file.replace(path, NEG)
当我切换到OpenCV时,图像被完美渲染。但是如果可能的话,我想继续使用Scipy。

正如上面的回答,没有值的标准化,但是函数会根据数据类型重新缩放值。此问题的解决方案是将阵列映像的数据类型设置为uint8,如下所示:

misc.imsave(path, img.astype(numpy.uint8))  

我在matplotlib imsave上也遇到了类似的问题,当时我正考虑根据Alan的解决方案将其转换为scipy imsave

使用matplotlib:

palette_cm = ['#000000', '#ff0000', '#00ff00', '#0000ff', 
                '#ffff00', '#ff00ff', '#00ffff', '#ffffff']
def myColorMap():
    return ListedColormap(palette_cm)
plt.imsave('test.png', im.astype(np.uint8), cmap=myColorMap(), vmin=0, vmax=7)

uint8应该使imsave具有与scipy中相同的行为,将其固定为特定值,并且在一种方法中实现了这一点。在另一种方法中,它甚至通过显式强制转换来扩展范围,因此我必须添加vmin和vmax选项。这可能是由我的8值colormap造成的,但uint8的自动缩放在github发布matplotlib的帖子时被特别提到是一个缺陷。

np.save
不应向
img
添加任何规范化或更改(前提是它是
ndarray
)。如果您发布失败的部分代码,它会有所帮助。对于本例,使用类似于
img=np.random.randn(…)
的方法将您的数据替换为等效数据。感谢您的回答@user2699我更新了帖子。如果您有什么要求,请告诉我。不幸的是,我已经尝试使用np.save,但是我也得到了规范化的图像。但我同意你的看法:它不应该这样做。请参阅和我的答案。
numpy.save
不规范数据,但也不以图像格式保存数据。