背景
最近在熟悉TensorFlow时 进行手写数字识别时 需要用到图片输出28*28像素的手写数字 使用了一下的方法
import scipy.misc as sm
sm.toimage(image).save(filename)
由于训练模型是在google的colab中进行
但当这条命令执行时 去报了没有toimage这个函数的错误 当即在网上找了 发现scipy.misc中的确有这个函数
很奇怪。。。
原因
当即想到了是不是colab内的scipy版本太低了
查看了一下
同时在本地也进行了查看
在本地环境中能够顺利的跑通 并且将图片输出 如下图:
一开始觉得既然colab的版本不低 按道理来说不应该会有函数缺失呀
不过 就在本地运行代码的时候~~ 真相出现了!!!
在本地使用1.0.0版本的scipy调用toimage时 出现了这样的警告
显然,这个toimage在1.2.0版本的时候就将会去除 所以colab中的1.3.0版本scipy自然是没有了
【注】:不仅仅是toimage 还有很多如 imread imfilter等等
而它也给出了解决方案 使用PIL中的 Image.fromarray代替
img=PIL.Image.fromarray(image,'L')
img.save(filename)
附:
scipy中没有toimage的原因已经找到了
但是使用PIL代替 同样也遇到了问题
image内存放的是28x28的array
我也尝试了许多种不同的mode来转化image
但是最终输出的结果都是全黑
于是我打印了一下image这个数组中的值
原来里面的范围是【0-1】 所以出来的图像都是接近0的黑色 所以 将这个数组全部乘以255
我尝试了乘以255后 继续使用 PIL.Image.fromarray(image,‘L’) 但是失败了 图片很奇怪
所以只有用了下面的方式
image = image *255
img = Image.new("L",(28,28))
for i in range(28):
for j in range(28):
img.putpixel((i,j),int(image[i][j]))
img.save(filename)
结果如下图:
虽然这个方法能够存储 但是总感觉有点笨
不知道是否有更好的方法来存储这种结构的图片 希望大家能一起交流一下~~