1

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

4

2 回答 2

1

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

misc.imsave(path, img.astype(numpy.uint8))  
于 2018-03-11T15:21:15.930 回答
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 的自动缩放在 github 问题帖子中被特别提到为 matplotlib 的一个缺陷。

于 2019-04-30T02:09:35.017 回答