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

How to remove normalization from scipy imsave function

我有一个简单的任务要完成,但我发现的当前保存功能对我没有任何帮助。我所要做的只是将灰度图像转换为另一个强度属于较小间隔(特别是在 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)

我承认最后一个我不太了解参数(我有一个猜测),documentation 没有帮助。有人可以帮我解决这个问题吗?

编辑:我正在发布代码

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。

正如 Warren Weckesser on this 的回答,没有对值进行规范化,但是函数会根据数据类型重新缩放值。此问题的解决方案是将数组图像的数据类型设置为 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 值颜色图引起的,但是 uint8 的自动缩放在 github matplotlib 问题帖子中被特别提到为缺陷。