将MNIST数据集的train图片及lable分割成 number_index.bmp的形式

@Luffy 2018年2月13日创建

将MNIST数据集的train图片及lable分割成 number_index.bmp的形式。


number是图片的标签,即0~9十个数字
index是当前图片在图片所在数字中的序号
图片的类型是bmp,未压缩全彩。当然,MNIST的图片是黑底灰度图像。

import struct
import numpy as np
from PIL import Image

打开image文件,自行下载MNIST数据集,数据集包含4个文件,自行解压,并放置在程序所在目录下的 MNIST_data目录下
并新建/MNIST_data/train/目录,用于保存输出的数字图片。

filename_image='MNIST_data/train-images.idx3-ubyte'
bin_image=open(filename_image,'rb')
buf_image=bin_image.read()


打开label文件

filename_label='MNIST_data/train-labels.idx1-ubyte' 
bin_label=open(filename_label,'rb')
buf_label=bin_label.read()

struct使用自行百度参考。本案例使用大端法
设定IMAGE文件流的位移指针
index_image=0

一个I是4个字节的int,前4个字节的int分别表示魔数、本文件所含图片的数量、单个图片的rows,单个图片的cols
magic,numImages,numRows,numColumns=struct.unpack_from('>IIII',buf_image,index_image)

图片从第16个字节开始,0为文件的起始
index_image+=struct.calcsize('>IIII') 
print(magic,numImages,index_image)

设定label文件流指针
index_label=0

label文件前两个int是魔数、label的总数

magic,numlabels = struct.unpack_from('>II',buf_label,index_label)
index_label+=struct.calcsize('>II')
print(magic,numlabels,index_label)

定义包含10个数字的数组,保存当前图片的index
例如图片的名称是0_1042.bmp、9_345.bmp,1042,345就是index

inum=[0,0,0,0,0,0,0,0,0,0]

for i in range(0,numImages):
        im=struct.unpack_from('>784B',buf_image,index_image)
        index_image+=struct.calcsize('>784B')
        #f返回的lb是一个tuple类型,tuple实际上是个数组
        lb=struct.unpack_from('>1B',buf_label,index_label)
        index_label+=struct.calcsize('>1B')
        im=np.array(im,dtype='uint8')
        im=im.reshape(28,28)
        im=Image.fromarray(im)
        #文件名的形态 number_index.bmp
        im.save('MNIST_data/train/%s_%s.bmp'%(lb[0],inum[lb[0]]),'bmp')
        print('MNIST_data/train/%s_%s.bmp'%(lb[0],inum[lb[0]]))
        #数字的index向前进1
        inum[lb[0]]+=1

猜你喜欢

转载自blog.csdn.net/weixin_40920228/article/details/79294236