本系列文章由 @yhl_leo 出品,转载请注明出处。
文章链接: http://blog.csdn.net/yhl_leo/article/details/50782792


在深度学习时,制作样本数据集时,需要产生和读取一些二进制图像的数据集,如MNIST,CIFAR-10等都提供了适合C语言的二进制版本。

以CIFAR-10的数据集为例,官网上有两段关键的介绍:

二进制版本数据集格式为(图像大小为32x32):

<1 x label><3072 x pixel>
...
<1 x label><3072 x pixel>

In other words, the first byte is the label of the first image, which is a number in the range 0-9. The next 3072 bytes are the values of the pixels of the image. The first 1024 bytes are the red channel values, the next 1024 the green, and the final 1024 the blue. The values are stored in row-major order, so the first 32 bytes are the red channel values of the first row of the image.

由此,绘制一个简图:

根据图像大小32x32 = 1024,不难知道,每个颜色值存储为1 byte,因此,对于单个图像的二进制存储与读取(先不管RGB颜色存储顺序),找了一张32x32的彩色lena图像,如下实现:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>#include "cv.h"
#include "highgui.h"using namespace cv;
using namespace std;void main()
{FILE *fpw = fopen( "E:\\patch.bin", "wb" );if ( fpw == NULL ){cout << "Open error!" << endl;fclose(fpw);return;}Mat image = imread("E:\\lena32.jpg");if ( !image.data || image.channels() != 3 ){cout << "Image read failed or image channels isn't equal to 3."<< endl;return;}// write image to binary format fileint labelw = 1;int rows = image.rows;int cols = image.cols;fwrite( &labelw, sizeof(char), 1, fpw );char* dp = (char*)image.data;for ( int i=0; i<rows*cols; i++ ){fwrite( &dp[i*3],   sizeof(char), 1, fpw );fwrite( &dp[i*3+1], sizeof(char), 1, fpw );fwrite( &dp[i*3+2], sizeof(char), 1, fpw );}fclose(fpw);// read image from binary format fileFILE *fpr = fopen( "E:\\patch.bin", "rb" );if ( fpr == NULL ){cout << "Open error!" << endl;fclose(fpr);return;}int labelr(0);fread( &labelr, sizeof(char), 1, fpr );cout << "label: " << labelr << endl;Mat image2( rows, cols, CV_8UC3, Scalar::all(0) );char* pData = (char*)image2.data;for ( int i=0; i<rows*cols; i++ ){fread( &pData[i*3],   sizeof(char), 1, fpr );fread( &pData[i*3+1], sizeof(char), 1, fpr );fread( &pData[i*3+2], sizeof(char), 1, fpr );}fclose(fpr);imshow("1", image2);waitKey(0);
}

运行结果如下:

再看图片属性:

与官网上的大小3073一致,那么这么存取应该没问题。

严格按照官网的RGB通道分别存储,略作修改就可以实现:

/*  for ( int i=0; i<rows*cols; i++ ){fwrite(&dp[i*3],   sizeof(char), 1, fpw);fwrite(&dp[i*3+1], sizeof(char), 1, fpw);fwrite(&dp[i*3+2], sizeof(char), 1, fpw);}
*/for ( int i=0; i<rows*cols; i++ )fwrite(&dp[i*3+2],   sizeof(char), 1, fpw); // Rfor ( int i=0; i<rows*cols; i++ )fwrite(&dp[i*3+1],   sizeof(char), 1, fpw); // Gfor ( int i=0; i<rows*cols; i++ )fwrite(&dp[i*3],   sizeof(char), 1, fpw);  // B

存储和读取多张图片方法类似,这里就不做介绍。

本文已同步于GitHub:yhlleo/image2binarytest

转载于:https://www.cnblogs.com/hehehaha/p/6332154.html

C/C++ 图像二进制存储与读取相关推荐

  1. .Net下二进制形式的文件(图片)的存储与读取 [ZT]

    .Net下图片的常见存储与读取凡是有以下几种: 存储图片:以二进制的形式存储图片时,要把数据库中的字段设置为Image数据类型(SQL Server),存储的数据是Byte[]. 1.参数是图片路径: ...

  2. Python数据攻略-图像存储与读取技术

    大家好,我是Mr数据杨.今天的主题是如何像三国时期的智者那样处理数据.请想象一下,如果三国中的谋士们要处理大量的情报,他们会如何做呢? 从数据准备开始.周瑜在赤壁之战中,需要收集各方面的情报,这就如同 ...

  3. python读二进制格点雷达基数据_对numpy中二进制格式的数据存储与读取方法详解...

    使用save可以实现对numpy数据的磁盘存储,存储的方式是二进制.查看使用说明,说明专门提到了是未经压缩的二进制形式.存储后的数据可以进行加载或者读取,通过使用load方法. In [81]:np. ...

  4. 【Android FFMPEG 开发】FFMPEG AVFrame 图像格式转换 YUV - RGBA ( 获取 SwsContext | 初始化图像数据存储内存 | 图像格式转换 )

    文章目录 I . FFMPEG AVFrame 图像数据帧处理 前置操作 II . FFMPEG 解码 AVPacket 数据到 AVFrame 流程 III. FFMPEG 解码前后的图像格式 IV ...

  5. 【tensorFlow】——图像数据增强、读取图像、保存图像

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/4/13 10:54 # @Author : @linlianqin # @S ...

  6. Python+OpenCV:图像二进制鲁棒独立基本特征(BRIEF, Binary Robust Independent Elementary Features)

    Python+OpenCV:图像二进制鲁棒独立基本特征(BRIEF, Binary Robust Independent Elementary Features) 理论 We know SIFT us ...

  7. python numpy读取数据_numpy中以文本的方式存储以及读取数据方法

    这篇文章主要介绍了关于numpy中以文本的方式存储以及读取数据方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 Numpy中除了能够把数据以二进制文件的方式保存到文件中以外,还可以选 ...

  8. ESP32_学习笔记(一)NVS的操作(存储和读取大数组)(为什么存入数据成功,读取却为零的原因)

    目录 ESP32_学习笔记(一)NVS的操作 前言 函数介绍 创建句柄: 定义存储空间: 打开函数: 存储函数: 读取函数: 提交函数: 关闭函数: 易错点提醒:为什么明明存入了,读取的值为0 这就是 ...

  9. python3 dump_Python3基础 pickle.dump和load 对一个对象进行序列化存储及读取

    Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda : 4.5.11 typesetting : Markdown ...

  10. Mybatis解决数据库Blob类型存储与读取问题

    1.Blob介绍 首先,先简单介绍下数据库Blob字段,Blob(Binary Large Object)是指二进制大对象字段,顺带介绍下Clob类型,Clob(Character Large Obj ...

最新文章

  1. Android 中 include的使用
  2. [php]如何做到高并发优化
  3. 什么时候用redis_C++传参什么时候用引用, 什么时候用指针?
  4. 今天做了一个复杂的table
  5. 谱减法降噪的matlab代码实现
  6. SQL Compare
  7. java null和 的区别_java中null和的区别
  8. 非编程人学Python,要注意哪些隐秘的错误认知?
  9. android firefox 版本,Android版本Firefox初期预览版发布
  10. RMDB与hadoop的实时整合
  11. 计算机软件进费用什么科目,购买软件费用如何记账?
  12. Win7 无法安装 VMware Tools
  13. Mount is denied because the NTFS volume is already exclusively opened.
  14. 【PTA|Python】浙大版《Python 程序设计》题目集:函数练习
  15. 2022年新版青龙面板对接企业微信应用实现定时推送日志
  16. 生命线检查计算机还是连接线,lifeline生命线泰勒到达山脚找到控制室 面对控制室的电脑电线要怎么做...
  17. Qt中绘制五子棋棋盘
  18. 【SAP】根据生产订单号查询序列号并导出序列号数据
  19. 达内python 资源_Python学习资源整理,优质Python学习资源推荐
  20. cpu功能解析,cpu功能作用与其工作过程

热门文章

  1. Postfix 邮件队列删除
  2. 【组播技术入门 01】IP组播概述
  3. 深入解读Docker底层技术cgroup系列(4)——cgroup子系统cpu
  4. 【多媒体封装格式详解】---MKV【2】
  5. Linux工作队列实现机制
  6. make条件判断ifeq,ifneq,ifdef,ifndef
  7. qt中如何刷新一下屏幕_感情维护:如何在恋爱关系中分开一下,然后更坚强地回来...
  8. mllib逻辑回归LogisticRegressionWithLBFGS LogisticRegressionModel源码分析
  9. linux下解压java压缩包报错
  10. css文本行高是哪个属性_CSS-常用文本属性