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

文章目录

  • 二进制读入
  • Minist手写集与EasyX
  • 基本思路
  • 代码实现
    • read函数
    • main函数
    • 宏定义
  • 效果图

二进制读入


二进制读入的方法有很多,这里我们使用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的预览图
C++ 二进制读入和Minist图片展示_第1张图片
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 
#include 
#include 

#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


效果图

C++ 二进制读入和Minist图片展示_第2张图片

你可能感兴趣的:(学习日志,c++)