C++ 二进制读入和Minist图片展示

本文介绍了如何使用C语言的fread函数从Minist手写数字数据集中读取二进制数据,并通过EasyX库将其转换为RGB图像,逐像素绘制出来。主要涉及读取函数实现、主函数中数据处理以及宏定义,适合初学者理解图像处理与编程接口应用。
摘要由CSDN通过智能技术生成

二进制读入


二进制读入的方法有很多,这里我们使用fread函数进行读入(因为读取的是pixel,使用fread可以一次性读入)


Minist手写集与EasyX

MNIST 数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST). 训练集 (training set) 由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生, 50% 来自人口普查局 (the Census Bureau) 的工作人员. 测试集(test set) 也是同样比例的手写数字数据


本文章讲的是利用EasyX将Minist手写集图片展示到前台


EasyX官网及下载地址
Minist数据集下载

基本思路

1.首先在Minist数据集中读入二进制数据,因为Minist数据集是经过灰度处理的图像,所以RGB三色全有1个pixel来表示
2.利用EasyX画方块的API进行绘图并填充RGB颜色

代码实现

read函数

byte* read(const char path[],int count)
{
	int cnt = count > MAX_READCOUNTS ? MAX_READCOUNTS : count;
	cnt *= BIT_WIDTH * BIT_HEIGHT;
	FILE* file = fopen(path, "rb");
	if (file == NULL)return NULL;
	fseek(file, 16, SEEK_SET);
	byte* data = new byte[cnt];
	fread(data, 1, cnt, file);	
	return data;
}

read函数第一个参数传入Minist数据集的地址,第二个传入读取的图片张数
为什么要移动16字节,下载后我们可以看到Minist的预览图
在这里插入图片描述
magic_number image_number rows columns分别占了16个字节
而rows和columns我们将使用宏进行定义


main函数

int main()
{
	int width = BIT_WIDTH * COLUMN_COUNT * RATIO;
	int height = BIT_HEIGHT * ROW_COUNT * RATIO;
	initgraph(width, height);
	byte* arr = read("你的图片地址",30);
	int position[] = { 0,0,RATIO,RATIO };
	int offset[] = { 0,0 };
	int base[] = { 0,0,RATIO,RATIO };
	for (int i = 0; i < BIT_COUNT; ++i)
	{
		solidrectangle(position[0], position[1], position[2], position[3]);
		setfillcolor(RGB(int(arr[i]), int(arr[i]), int(arr[i])));

		if (offset[0] >= BIT_WIDTH)
		{
			position[1] += OFFSET;
			position[3] += OFFSET;

			position[0] = base[0];
			position[2] = base[2];

			offset[0] = 0;
			offset[1]++;
		}
		if (offset[1] >= BIT_HEIGHT * ROW_COUNT)
		{
			base[0] += BIT_WIDTH * RATIO;
			base[2] += BIT_WIDTH * RATIO;

			position[0] = base[0];
			position[2] = base[2];
			position[1] = base[1];
			position[3] = base[3];

			offset[1] = 0;

		}

		position[0] += OFFSET;
		position[2] += OFFSET;
		offset[0]++;

	}
	_getch();
	
	delete[] arr;
	closegraph();
	return 0;

}

宏定义

#define _CRT_SECURE_NO_WARNINGS //如果你使用的是Visual Studio
#include <graphics.h>
#include <conio.h>
#include <stdio.h>

#define MAX_READCOUNTS 60000
#define BIT_WIDTH 28
#define BIT_HEIGHT 28   
#define ROW_COUNT 4   //数字行数量
#define COLUMN_COUNT 5   //数字列数量
#define RATIO 2  //放大倍数
#define OFFSET 1*RATIO
#define BIT_COUNT BIT_WIDTH*BIT_HEIGHT*ROW_COUNT*COLUMN_COUNT

ROW_COUNT 输出图片的每行的数量
COLUMN_COUNT 输出图片每列的数据
RATIO 图片放大的倍数
注意!read函数读入的数量不能低于ROW_COUNT*COLUMN_COUNT


效果图

在这里插入图片描述

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: MINIST数据集中的每张图片大小为28x28像素。这意味着每张图像有784个像素点。MINIST数据集是一个手写数字识别数据库,由于数字仅使用黑色和白色像素表示,因此每个像素点只能是0或1。因此,每张图像都是784个二进制像素值的数组。这个数据集包含60,000张训练图像和10,000张测试图像,这些图像都被标记为0到9之间的数字。在MINIST数据集中,所有图像都已经被标准化和中心化,这意味着它们已经调整为相同的大小,并从中心位置移动,以确保它们在相似的位置上。由于MINIST数据集图像大小较小,这使得它成为机器学习和数字识别算法的流行数据集之一,有助于简化算法的实现和调试。 ### 回答2: 经过查询,可以得知MINIST数据集中的图片大小为28x28像素。也就是说,每张MINIST数据集图片共有784个像素点,每个像素点都用0-255之间的灰度值来表示图片中对应位置的黑白程度。MINIST数据集包含了一系列手写数字的图片,其应用广泛,例如用于机器学习中的图像分类任务。这些图片可以方便地用于训练模型,以实现自动识别手写数字等功能。总的来说,MINIST数据集是一种非常有用的工具,可以帮助人们更好地理解和应用计算机视觉技术。 ### 回答3: Minist数据集是一个常用的手写数字识别数据集,包含了70,000张28x28像素的灰度图像,其中60,000张用于训练,10,000张用于测试。每张图片都有一个标签,标记了它所表示的数字。28x28像素意味着每张图片都有28个像素点的宽度和28个像素点的高度,而灰度图像表示每个像素点的强度仅由阴影级别决定,而不是用颜色来表示,因此每个像素点只需要一个8位二进制数(byte)来表示它的灰度级别。因此,每张图片需要28x28=784个像素点,每个像素点用一个8位二进制数(byte)来表示,所以每张图片的大小为784字节(比特)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

纸墨青鸢

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

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

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

打赏作者

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

抵扣说明:

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

余额充值