python 将MNIST数据集转为jpg图片格式

下载的数据集格式是字节存储的,有时需要转为图片格式,以下以测试集为例子,说明python转换代码。

IDX数据格式

这四个文件采用了IDX的文件格式,一种平铺直叙的方式:

magic number

size in dimension 0

size in dimension 1

.....

size in dimension N

data

其中magic number为4字节,前2字节永远是0,第3字节代表数据的格式:
0x08: unsigned byte
0x09: signed byte
0x0B: short (2 bytes)
0x0C: int (4 bytes)
0x0D: float (4 bytes)
0x0E: double (8 bytes)

第4字节的含义表示维度的数量(dimensions): 1 表示一维(比如vectors), 2 表示二维( 比如matrices),3表示三维(比如numpy表示的图像,高,宽,通道数)。

训练集和测试集的标签文件的格式(train-labels-idx1-ubyte和t10k-labels-idx1-ubyte)

1,前4个字节(第0~3个字节)是魔数2049(int型,0x00000801, 大端);

2,再往后4个字节(第4~7个字节)是标签的个数:60000或10000;

3,再往后每1个字节是一个无符号型的数,值为0~9。

import os
import cv2
import numpy as np



def save_mnist_to_jpg(dataset_path, output_path): #parameters:(数据集所在路径,最后输出存储路径)
    files = os.listdir(dataset_path)
    #生成image_file路径
    mnist_image_file = os.path.join(dataset_path, [f for f in files if "image" in f][0])
    #生成label_file路径  
    mnist_label_file = os.path.join(dataset_path, [f for f in files if "label" in f][0])
    save_dir = output_path
    num_file = 10000
    height, width = 28, 28
    size = height * width
    prefix = 'test'
    #二进制形式读取文件
    with open(mnist_image_file, 'rb') as f1:  
        image_file = f1.read()
    with open(mnist_label_file, 'rb') as f2:
        label_file = f2.read()
    image_file = image_file[16:]     #将所读数据进行切片,去掉开头16字节
    label_file = label_file[8:]   
    for i in range(num_file):
        label = label_file[i]
        image_list = [item for item in image_file[i * size:i * size + size]]
        image_np = np.array(image_list, dtype=np.uint8).reshape(height, width)
        save_name = os.path.join(save_dir, '{}_{}_{}.jpg'.format(prefix, i, label))
        cv2.imwrite(save_name, image_np)
    print("=" * 20, "preprocess data finished", "=" * 20)


if __name__ == '__main__':
    save_mnist_to_jpg('你的数据集所在路径','最后图片存储位置')

 最后结果:

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白白白白白8

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值