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]

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

时间: 2024-10-08 16:00:50

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

Python中使用pickle持久化对象

Python中可以使用 pickle 模块将对象转化为文件保存在磁盘上,在需要的时候再读取并还原.具体用法如下: 1 pickle.dump(obj, file[, protocol]) 这是将对象持久化的方法,参数的含义分别为:obj: 要持久化保存的对象:file: 一个拥有 write() 方法的对象,并且这个 write() 方法能接收一个字符串作为参数.这个对象可以是一个以写模式打开的文件对象或者一个 StringIO 对象,或者其他自定义的满足条件的对象.protocol: 这是一个

在java中和javascript中过滤掉类似于img形式的字符串,从而不显示图片

1:javascript过滤掉<img></img>和<img />形式的字符串 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtm

python 读取并显示图片的两种方法

在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片.本人偏爱 matpoltlib,因为它的语法更像 matlab. 一.matplotlib 1. 显示图片 import matplotlib.pyplot as plt # plt 用于显示图片 import matplotlib.image as mpimg # mpimg 用于读取图片 import numpy as np lena = mpimg.imread('lena.png')

python中分割字符串split切割并选择输出 逐行读取文件后字符串拼接

字符串根据分隔符切割后输出,一下面 #!/usr/bin/python # -*- coding: utf-8 -*- str="abc,123 efg,567" #以空行分割后输出 print str.split(); #以','分割2次后输出 print str.split(',',2); #以','分割2次后输出地2个参数,1是从0开始,代表第二个参数 print str.split(',',2)[1]; 输出结果如下: ['abc,123', 'efg,567'] ['abc'

将图片转换为Framebuffer格式(终端显示图片)

要在ubuntu终端显示图片或者在板子的LCD显示图片,Framebuffer是一个简单易用的接口,直接写入像素信息即可. 但普通的图片带有头部信息或者编码格式不同,直接送入Framebuffer是显示不出来的,需要扣出像素信息,并按照Framebuffer的RGBA顺序调整好,才能显示.所以现在的问题就是,如何获取framebuffer的信息,以及如何调整图片. 第一个问题,如何获取framebuffer的信息 对于ubuntu,可以安装fbset 进行查看 sudo apt-get inst

图片下载本地缓存时间戳显示图片方法

来源:http://ask.dcloud.net.cn/article/511 源码下载 参考文章http://ask.dcloud.net.cn/article/256http://ask.dcloud.net.cn/article/397 说明:为了方便,里面使用的图片来源是从上面文章中的源码项目获取的.说明:参考了上面文章中的思路,然后自己重新写了一个较为完整的图片本地缓存显示工具.功能1.第一次显示图片时下载到本地,然后之后如果本地存在缓存(根据url),则显示本地缓存的图片2. 基于p

ie8浏览器 图片本身问题导致 无法显示图片--- 诡异现象的排查分享

引子:   前段时间 做新版2.0 首页 的时候, 总感觉 新版首页 线上 精彩回顾下的 2张图片颜色怪怪的,当时以为是图片压缩太厉害导致的,由于实在太忙就没太在意!以下 是来自线上 截图:  红色方框 我认为  那2张 怪怪的 图片,大家感受下颜色是否不一样!   问题描述:        今天,测试同学找到我,说新版首页 精彩回顾下方 2张图片 在 ie8下 图片展现不出来了!   开始排查:  通过 浏览器 查看图片 DOM结构, 代码如下:  <img data-original="

python中的pickle模块

python的pickle模块实现了基本的数据序列和反序列化. 通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储. 通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象. 对象——>文件 import pickle # 使用pickle模块将数据对象保存到文件 data1 = {'a': [1, 2.0, 3, 4+6j], 'b': ('string', u'Unicode string'), 'c': None} selfref_

关于python中的pickle函数

8-7参考阅读 - 读文件.写文件.异常处理.文件保存游戏.pickle数据转成文本的过程又被称为"序列化",即将对象状态转换为可保持或传输的格式的过程.对应的,从序列化的格式中解析对象状态的过程被称为"反序列化". import pickle#序列化,反序列化,所以文件中的内容要求是列表或元组 test_data = ["save me",123.456,True]f = open("test_2.txt","w&