问题描述:
学习MNIST机器学习入门课程时,将numpy数组转为图片保存时,出现AttributeError: module ‘scipy.misc’ has no attribute 'toimage’报错问题。
执行代码如下:
# 保存前20张图片
for i in range(20):
image_array = train_images[i]
#保存文件的格式为:mnist_train_0.jpg,mnist_train_1.jpg,...
filename = save_dir + '/mnist_train_%d.jpg' %i
#将image_array保存为图片
# 先用scipy.misc.toimage转换为图像,再调用save直接保存
scipy.misc.toimage(image_array, cmin=0.0, cmax=1.0).save(filename)
症结归因:
在网上查了python3使用toimage()
函数的场景,发现这个函数已经弃用(deprecated),很多教程推荐降低第三方scipy
的版本来配合toimage()
函数的使用,本人感觉这有点“下嫁”的感觉,无法从根本上解决问题,况且技术更新迭代是不可避免的,我们需要顺势而为。
scipy.misc.toimage官方最新说明。
解决方案:
将问题转化为如何将数组保存成图像?
- 方法一:使用
cv2模块
的.imwrite()
函数,将numpy数组转成图片保存。具体代码如下:
cv2.imwrite(filename, image_array) #使用cv2实现图片与numpy数组的相互转化
- 方法二:使用
PIL模块
中Image
下的.fromarray()
函数,将numpy数组转成图片保存。具体代码如下:
from PIL import Image
Image.fromarray((image_array)).save(filename) #使用PIL实现图片与numpy数组的相互转化
# 或者
Image.fromarray((image_array*255).astype('uint8'), mode='L').convert('RGB').save(filename) # 用于处理彩色图像
参考链接:AttributeError: module ‘scipy.misc’ has no attribute ‘toimage’
- 方法三:使用
matplotlib模块
,实现将numpy数组转成图片保存。(包含两种方法):
(1)优先推荐: 使用matplotlib模块
中image
下的.imsave()
函数,将numpy数组转成图片保存。具体代码如下:
from matplotlib import image
image.imsave(filename,image_array,cmap='gray') # cmap常用于改变绘制风格,如黑白gray,翠绿色virdidis
(2)不太推荐: 使用matplotlib模块
中pyplot
下的.savefig()
函数,将numpy数组转成图片保存,生成的图片包含坐标轴和边框信息等。具体代码如下:
import matplotlib.pyplot as plt
# 绘制图片
plt.imshow(image_array,cmap='gray')
# 保存图片
plt.savefig(filename) # 此时,绘制图片时已经指定图片变量,故保存时无需再指明
参考链接:将Numpy数组保存为图像的几种方法