Python中使用pickle Image等进行图片序列化及读取恢复显示图片

Python中有各种各样的学习扩展包,尤其是其在算法包方面,例如机器学习,深度学习等等都是十分出色的,同样我们也可以在Python中找到图像处理相关的扩展包例如PIL,Image等等,下面我们就使用olivettifaces人脸库,一个只有400张人脸总共40个人的迷你数据集,来向大家展示如何将图片保存为一个灰度值组成的大数组,并保存为一个pkl文件,然后再将数组序列恢复显示为一张图片。


图片总大小为1140*942,一共400个人脸图,每个人有10张不同角度的人脸,总共40个不同的人,故每张人脸图大小为(1140/20)*(942/20)即57*47=2679 ,我们的目标是将这些图片保存在一个400*2679的数组当中,每一行代表一张人脸,每一张人脸图都保存为一个2679维的一维向量;

Python中使用pickle Image等进行图片序列化及读取恢复显示图片_第1张图片

从图片当中我们可以观察出总共有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]
                                                                              Python中使用pickle Image等进行图片序列化及读取恢复显示图片_第2张图片





参考资料:http://blog.csdn.net/u012162613/article/details/43226127


你可能感兴趣的:(python,image,PIL,图像处理,numpy)