一、MATLAB程序
参考网址:http://blog.youkuaiyun.com/destiny0321/article/details/49025163
手写数字库很容易建立,但是总会很浪费时间。Google实验室的Corinna Cortes和纽约大学柯朗研究所的Yann LeCun建有一个手写数字数据库,训练库有60,000张手写数字图像,测试库有10,000张。源图像数据可访问原站 http://yann.lecun.com/exdb/mnist/进行下载,或到 http://download.youkuaiyun.com/detail/destiny0321/9167873进行下载,该数据库的一个文件中包含了所有的图像,使用起来很不方便。笔者在MATLAB平台上将该数据包保存为一张一张的带有标识的.bmp图片文件,以供今后研究使用。
- 首先讲解一下train-images.idx3-ubyte这个数据库个存储格式:
训练集图像格式(train-images.idx3-ubyte)
offset——–type————–value———- description
0000 —32 bit integer——0x00000803—–magic number
0004—32 bit integer——–60000——number of images
0008—32 bit integer———-28———–number of rows
0012—32 bit integer———-28——–number of columns
0016—unsigned byte ——–??——————pixel
0017—unsigned byte ——–??——————pixel
……..
xxxx—unsigned byte———??——————pixel
可见,前32bit*4对数据库进行了整体描述,之后是大小为8bit的像素值,也就是我们所需要的数据。
- 其次讲解一下train-labels.idx1-ubyte这个数据库个存储格式:
训练集标签格式(train-labels.idx1-ubyte)
offset——–type—————-value———- description
0000 —32 bit integer——0x00000803—–magic number
0004—32 bit integer——–60000——number of images
0008—unsigned byte ———??——————number
0009—unsigned byte ———??——————number
……..
xxxx—unsigned byte———-??——————number
可见,前32bit*2对数据库进行了整体描述,之后是大小为8bit的范围从0到9的数字标签,依次对应于train-images.idx3-ubyte中每幅图像所表示的数字。
对这两个文件有了清楚的认识之后,就很容易对其进行操作,获取我们想得到的*.bmp图像数据了。这是程序运行后的截图:
- 源程序如下:
参考文章:http://blog.youkuaiyun.com/u010194274/article/details/50817999
操作之前先将train-images-idx3-ubyte拷贝到当前python代码目录,并且在当前目录下新建文件夹train,安装numpy和matplotlib
(apt-get搞定:
sudo apt-get install python-numpy
sudo apt-get install python-matplotlib)
import struct
import numpy as np
import matplotlib.pyplot as plt
import Image
filename='./train-images-idx3-ubyte'
binfile=open(filename,'rb')
buf=binfile.read()
index=0
magic,numImages,numRows,numColumns=struct.unpack_from('>IIII',buf,index)
index+=struct.calcsize('>IIII')
for image in range(0,numImages):
im=struct.unpack_from('>784B',buf,index)
index+=struct.calcsize('>784B')
im=np.array(im,dtype='uint8')
im=im.reshape(28,28)
im=Image.fromarray(im)
im.save('train/train_%s.bmp'%image,'bmp')
亲测以上两个代码都能成功运行并保存bmp