Python中使用pickle Image等進行圖片序列化及讀取恢復顯示圖片
阿新 • • 發佈:2018-12-19
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]