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
时间: 2024-10-08 16:00:50