原文地址:https://blog.csdn.net/qq_14959801/article/details/51367447
Python中有各种各样的学习扩展包,尤其是其在算法包方面,例如机器学习,深度学习等等都是十分出色的,同样我们也可以在Python中找到图像处理相关的扩展包例如PIL,Image等等,下面我们就使用olivettifaces人脸库,一个只有400张人脸总共40个人的迷你数据集,来向大家展示如何将图片保存为一个灰度值组成的大数组,并保存为一个pkl文件,然后再将数组序列恢复显示为一张图片。
图片总大小为1140*942,一共400个人脸图,每个人有10张不同角度的人脸,总共40个不同的人,故每张人脸图大小为(1140/20)*(942/20)即57*47=2679 ,我们的目标是将这些图片保存在一个400*2679的数组当中,每一行代表一张人脸,每一张人脸图都保存为一个2679维的一维向量;
从图片当中我们可以观察出总共有20行20列,20列中有两个人,每人10张不同角度的图片,20行中每行都是不同的人;
下面给出Python代码的实现:
import numpy
from PIL import Image
import pickle
img = Image.open('C:\Python34\olivettifaces.gif') #将图片转化为ndarray灰度数组
img_ndarray = numpy.asarray(img, dtype='float64')/256 #将灰度值由0~256转换到0~1
#图片总大小为1140*942,一共400个人脸图,故每张人脸图大小为(1140/20)*(942/20)即57*47=2679
#将全部400个样本存储为一个400*2679的数组,每一行代表一个人脸,并且第0~9、10~19行分别属于同个人脸
#另外,用olivettifaces_label表示每一个样本的类别,它是400维的向量,有0~39共40类,代表40个不同的人。
olivettifaces=numpy.empty((400,2679)) #开辟一个空数组
for row in range(20):
for column in range(20): #从第一行开始 第一行有20个人脸 两个人
olivettifaces[row*20+column]=numpy.ndarray.flatten(img_ndarray [row*57:(row+1)*57,column*47:(column+1)*47])
#建立分类标签
olivettifaces_label=numpy.empty(400)
for label in range(40):
olivettifaces_label[label*10:label*10+10]=label #每十个赋值为一类标签
olivettifaces_label=olivettifaces_label.astype(numpy.int)
#保存olivettifaces以及olivettifaces_label到olivettifaces.pkl文件
write_file=open('C:\Python34\olivettifaces.pkl','wb')
pickle.dump(olivettifaces,write_file,-1)
pickle.dump(olivettifaces_label,write_file,-1) # dump了两次
write_file.close()
import pylab
read_file=open('C:\Python34\olivettifaces.pkl','rb')
faces=pickle.load(read_file)
read_file.close()
img1=faces[1].reshape(57,47)
pylab.imshow(img1)
pylab.gray()
pylab.show()
#将olivettifaces分为训练集(320个样本),验证集(40个样本),测试集(40个样本)
import pickle
read_file=open('C:\Python34\olivettifaces.pkl','rb')
faces=pickle.load(read_file) # pickle.load了两次
label=pickle.load(read_file)
read_file.close()
train_data=numpy.empty((320,2679)) #创建空盒子 分成为三块大小分别为320,40,40
train_label=numpy.empty(320)
valid_data=numpy.empty((40,2679))
valid_label=numpy.empty(40)
test_data=numpy.empty((40,2679))
test_label=numpy.empty(40)
for i in range(40): #0~7 0~7
train_data[i*8:i*8+8]=faces[i*10:i*10+8] #8~15 10~17
train_label[i*8:i*8+8]=label[i*10:i*10+8] #16~23 20~27
valid_data[i]=faces[i*10+8] #312~319 390~397
valid_label[i]=label[i*10+8]
test_data[i]=faces[i*10+9] #8
test_label[i]=label[i*10+9] #18
#28
#398
#9
#19
#29
#399
输出结果我们发现显示的就是第一行中第二张人脸图,序号为[1]
参考资料:http://blog.csdn.net/u012162613/article/details/43226127