1. 程式人生 > >Python中使用pickle Image等進行圖片序列化及讀取恢復顯示圖片

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維的一維向量;

從圖片當中我們可以觀察出總共有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]