深度学习入门之数组转换图片不同方法比较

一、如何查看npz文件中的文件

从网上下载的数据集是npz格式的,无法直接用解压程序打开,需要借助python查看。
利用python查看其中的文件的程序如下:

import numpy as np
face_data=np.load('C:/Users/Lenovo/Desktop/eye_tracker_train_and_val.npz')
print(face_data.files)

运行该段程序,可以看到其中的文件层次如下所示:
在这里插入图片描述
分为face、eye_left、eye_right、face_mask、y等5个训练集和5个测试集。
以train_face文件为例,如果想知道其中由哪些数据组成,可以用下面的程序查看:

// 查看train_face文件中的第48000张数据
print(face_data['train_face'][48000])

在控制台就会输出如下,这是一张训练图片的矩阵数据。由于太长,只截取其中一部分展示。
深度学习入门之数组转换图片不同方法比较_第1张图片
由于数据不够直观,我们可以利用下面的程序,查看这些数据可以呈现出什么样的图片:

from PIL import Image;
im = Image.fromarray(data['train_face'][47999])
im.show()

屏幕上就会出现这些数据代表的图片,如下所示:
深度学习入门之数组转换图片不同方法比较_第2张图片
不光如此,我们还可以用下面的代码,查看该图片具体的信息:

// 获取图片的大小
w,h=im.size
print(w)
print(h)
// 获取图片的颜色空间,尺寸等
print(im)
// 获取图片在具体位置的像素值
print(im.getpixel((16,16)))

在控制台得到的结果如下,说明该图片的大小是64**64,RGB三通道格式,具体像素点处的R、G、B的值等等。
在这里插入图片描述
有时候,为了方便我们需要将数据转换为图片保存,以方便查看,下面就来说一说。

二、numpy数组转图片的方法

经过查资料,得到numpy数组转图片的方法主要有以下几种,我们分别去试一试。

1.使用PIL模块

from PIL import Image;
im = Image.fromarray(data['train_face'][47999])
im.save("C://Users//Lenovo//Desktop//Eyetracking for everyone程序//我的调试//face_pil.jpg")

那么在指定路径下就会出现一张图片,如下所示:
在这里插入图片描述

2.使用matplotlib

程序如下:

import matplotlib;
matplotlib.image.imsave('face_matplotlib.jpg', data['train_face'][47999])

在指定路径下也会出现一张图片

3.使用scipy.misc

顺带提一下,因为我的python环境中没有该模块,需要导入,导入的程序如下:

// 打开命令行窗口
C:\Users\Lenovo>activate myenv
// 需要注意的是要安装的包是scipy而不是scipy.misc
(myenv) C:\Users\Lenovo>pip install scipy

scipy库安装完毕后,就可以用以下程序,实现保存图片:

import scipy.misc
// 第一种方法
scipy.misc.imsave('face_scipy.jpg', data['train_face'][47999])
// 第二种方法
scipy.misc.toimage(data['train_face'][47999]).save("face_scipy2.jpg")

你会发现出现如下错误,经过调整,发现将scipy库的版本调整为1.2.1即可。

// 报的错误
module 'scipy.misc' has no attribute 'imsave'

// 重新安装scipy

(myenv) C:\Users\Lenovo>pip uninstall scipy
(myenv) C:\Users\Lenovo>pip install scipy==1.2.1

经过上述调整,并再次运行程序,指定路径下就会出现一张你想要的图片啦!
这里只介绍上述几种方法,需要做进一步了解的,参见以下链接

* Saving a Numpy array as an image

三、不同方法生成的图片比较

由于在之前的博客中,发现数组保存为图像后,再读取,与原始数据有误差,这里对之前保存的图片进行比较,以验证自己的假设。
将图片读取为数组的程序如下:

// 打开图像文件
raw_image=Image.open("face_pil.jpg")
// 转换为numpy数组
image_array=np.array(raw_image)
// 将数组打印输出
print(image_array)

对不同方法生成的图片,输出图像数据如下所示:

3.1 PIL

深度学习入门之数组转换图片不同方法比较_第3张图片

3.2 matplotlib

深度学习入门之数组转换图片不同方法比较_第4张图片

3.3 scipy.misc

深度学习入门之数组转换图片不同方法比较_第5张图片

3.4 原始数据

深度学习入门之数组转换图片不同方法比较_第6张图片
通过比较发现,所有方法将数组转化成图片后,再从图片转化为数组后,输出的结果都与原始数据不一致,并且不同方法的结果都一致,这说明是从图像转化为数组的方式出了问题,需要进一步研究。

四、问题解决

通过实践,发现是由数组到图片的后缀名出了问题,原始数据集对应的图像格式是png格式的,而我的程序中保存的图像格式是jpg格式的。对之前的程序作修改,得到下面的结果。

4.1 PIL方法保存的图像数据

深度学习入门之数组转换图片不同方法比较_第7张图片

4.2 matplotlib保存的图像数据

深度学习入门之数组转换图片不同方法比较_第8张图片

4.3 scipy方法保存的图像数据

深度学习入门之数组转换图片不同方法比较_第9张图片

4.4 原始数据集中的图像数据

深度学习入门之数组转换图片不同方法比较_第10张图片
哈哈,这样的话,不同方法保存的图像数据就与原始数据对上啦!!!以后,有时间研究下不同图像格式之间的差别。

你可能感兴趣的:(深度学习,机器学习,python,深度学习)