本系列文章由 @yhl_leo 出品,转载请注明出处。

文章链接: http://blog.csdn.net/yhl_leo/article/details/50782792


在深度学习时,制作样本数据集时,需要产生和读取一些二进制图像的数据集,如MNISTCIFAR-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 file
int 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 file
FILE *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); // R for ( int i=0; i<rows*cols; i++ )
fwrite(&dp[i*3+1], sizeof(char), 1, fpw); // G for ( int i=0; i<rows*cols; i++ )
fwrite(&dp[i*3], sizeof(char), 1, fpw); // B

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

本文已同步于GitHub:yhlleo/image2binarytest

C/C++ 图像二进制存储与读取的更多相关文章

  1. SQLite数据库如何存储和读取二进制数据

    SQLite数据库如何存储和读取二进制数据 1. 存储二进制数据 SQLite提供的绑定二进制参数接口函数为: int sqlite3_bind_blob(sqlite3_stmt*, int, co ...

  2. .NET中二进制图片的存储与读取

    判断HttpContext是否为空: string configPath = "img/defaultPhoto.png"; if (HttpContext.Current != ...

  3. .Net下二进制形式的文件存储与读取

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

  4. [TFRecord格式数据]利用TFRecords存储与读取带标签的图片

    利用TFRecords存储与读取带标签的图片 原创文章,转载请注明出处~ 觉得有用的话,欢迎一起讨论相互学习~Follow Me TFRecords其实是一种二进制文件,虽然它不如其他格式好理解,但是 ...

  5. 在VC下采用ADO实现BLOB(Binary)数据的存储,读取,修改,删除。

    在VC下采用ADO实现BLOB(Binary)数据的存储,读取,修改,删除. 作者:邵盛松 2009-09-05 前言 1关于的BLOB(Binary)数据的存储和读取功能主要参考了MSDN上的一篇& ...

  6. MFC用串行化实现文档存储和读取功能

    在面向对象的程序设计中,一般都是用二进制文件来保存文档资料.在VC++中控制和使用文件流的方法很多,MFC程序设计中常用的有两种方法:用CFile对象存储和读取文件:利用串行化存取文件.其中用CFil ...

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

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

  8. numpy中文件的存储和读取-嵩天老师笔记

    numpy中csv文件的存储和读取 CSV文件:(Comma‐Separated Value, 逗号分隔值) 一维和二维数组 存储 np.savetxt(frame,array,fmt='%.18e' ...

  9. Numpy用于数组数据的存储和读取

    Python的Numpy模块可用于存储和读取数据: 1.将一个数组存储为二进制文件 Numpy.save:将一个数组以.npy的格式保存为二进制文件 调用格式:numpy.save(file, arr ...

随机推荐

  1. Unity3D 射线指定层获取GameObject 注意 LayerMask

    这一篇是纯技术讨论,看过我前面文章的童鞋应该清楚,我的奔跑是靠鼠标响应的,鼠标点到哪就跑到哪,后来又有了界面,麻烦就来了,我的界面居然能点 穿.我不希望点界面的时候还能点到界面后面的地面上,角色傻不拉 ...

  2. BNU 34990 Justice String 2014 ACM-ICPC Beijing Invitational Programming Contest

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34990 DEBUG了非常久,还是legal的推断函数写错了... 此题做法.枚举Stri ...

  3. POJ3177 Redundant Paths 图的边双连通分量

    题目大意:问一个图至少加多少边能使该图的边双连通分量成为它本身. 图的边双连通分量为极大的不存在割边的子图.图的边双连通分量之间由割边连接.求法如下: 求出图的割边 在每个边双连通分量内Dfs,标记每 ...

  4. Windows 平台下 Go 语言的安装和环境变量设置

    1. Go 语言 SDK 安装包下载和安装 最新稳定版 1.5.3 安装包 go1.5.3.windows-amd64.msi下载地址 https://golang.org/dl/,大小约 69 MB ...

  5. 国外物联网平台初探(三) ——IBM Watson IoT

    平台定位 提供全面管理的云托管服务,旨在简化并从 IoT 设备中获得价值. Watson IoT Platform 提供对 IoT 设备和数据的强大应用程序访问,可快速编写分析应用程序.可视化仪表板和 ...

  6. SSH整合报错:找不到元素 'beans' 的声明

    转自:https://blog.csdn.net/haozhugogo/article/details/54233608 spring版本问题,将bean.xml中xsd文件定义的版本改为spring ...

  7. FileCopy文件复制

    package cn.com.filecopy; import java.io.FileInputStream; import java.io.FileNotFoundException; impor ...

  8. 初学struts2杂乱笔记

    1.在web.xml文件里定义struts2里的一个过滤类org.apache.struts2.dispatcher.FilterDispatcher 2.在src目录下创建struts.xml文件, ...

  9. the selection cannot be run on any server

    导入war包后运行jsp 显示: the selection cannot be run on any server 问题原因: Dynamic Web Module 的版本与server不匹配.Dy ...

  10. javascript一个作用域案例分析

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...