深度学习----【3】MNIST手写数字数据库保存为bmp图片

一、MATLAB程序

参考网址:http://blog.csdn.net/destiny0321/article/details/49025163

手写数字库很容易建立,但是总会很浪费时间。Google实验室的Corinna Cortes和纽约大学柯朗研究所的Yann LeCun建有一个手写数字数据库,训练库有60,000张手写数字图像,测试库有10,000张。源图像数据可访问原站 http://yann.lecun.com/exdb/mnist/进行下载,或到 http://download.csdn.net/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图像数据了。这是程序运行后的截图: 
这里写图片描述

  1. 源程序如下:
fid_image=fopen('train-images.idx3-ubyte','r');
fid_label=fopen('train-labels.idx1-ubyte','r');
% Read the first 16 Bytes
magicnumber=fread(fid_image,4);
size=fread(fid_image,4);
row=fread(fid_image,4);
col=fread(fid_image,4);
% Read the first 8 Bytes
extra=fread(fid_label,8);
% Read labels related to images
imageIndex=fread(fid_label);
Num=length(imageIndex);
% Count repeat times of 0 to 9
cnt=zeros(1,10);
for k=1:Num
    image=fread(fid_image,[max(row),max(col)]);     % Get image data
    val=imageIndex(k);      % Get value of image
    for i=0:9
        if val==i
            cnt(val+1)=cnt(val+1)+1;
        end
    end
    if cnt(val+1)<10
        str=[num2str(val),'_000',num2str(cnt(val+1)),'.bmp'];
    elseif cnt(val+1)<100
        str=[num2str(val),'_00',num2str(cnt(val+1)),'.bmp'];
    elseif cnt(val+1)<1000
        str=[num2str(val),'_0',num2str(cnt(val+1)),'.bmp'];
    else
        str=[num2str(val),'_',num2str(cnt(val+1)),'.bmp'];
    end
    imwrite(image',str);
end
fclose(fid_image);
fclos
二、python程序

参考文章:http://blog.csdn.net/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

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值