我有一个简单的任务要完成,但我发现的当前保存功能根本没有帮助我。我要做的只是简单地将灰度图像转换为另一个具有属于较小间隔(具体地在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。
答案 0 :(得分:1)
正如Warren Weckesser对question所回答的那样,没有对值进行规范化,但函数会根据数据类型重新调整值。解决此问题的方法是将数组图像的数据类型设置为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问题中特别提到为缺陷。