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

时间:2018-03-09 14:44:05

标签: python numpy image-processing scipy python-imageio

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

2 个答案:

答案 0 :(得分:1)

正如Warren Weckesserquestion所回答的那样,没有对值进行规范化,但函数会根据数据类型重新调整值。解决此问题的方法是将数组图像的数据类型设置为uint8,如下所示:

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

答案 1 :(得分:0)

我在使用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的自动缩放在matplotlib的github问题中特别提到为缺陷。