C/C++ 图像二进制存储与读取
本系列文章由 @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 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++ 图像二进制存储与读取的更多相关文章
- SQLite数据库如何存储和读取二进制数据
SQLite数据库如何存储和读取二进制数据 1. 存储二进制数据 SQLite提供的绑定二进制参数接口函数为: int sqlite3_bind_blob(sqlite3_stmt*, int, co ...
- .NET中二进制图片的存储与读取
判断HttpContext是否为空: string configPath = "img/defaultPhoto.png"; if (HttpContext.Current != ...
- .Net下二进制形式的文件存储与读取
.Net下图片的常见存储与读取凡是有以下几种:存储图片:以二进制的形式存储图片时,要把数据库中的字段设置为Image数据类型(SQL Server),存储的数据是Byte[].1.参数是图片路径:返回 ...
- [TFRecord格式数据]利用TFRecords存储与读取带标签的图片
利用TFRecords存储与读取带标签的图片 原创文章,转载请注明出处~ 觉得有用的话,欢迎一起讨论相互学习~Follow Me TFRecords其实是一种二进制文件,虽然它不如其他格式好理解,但是 ...
- 在VC下采用ADO实现BLOB(Binary)数据的存储,读取,修改,删除。
在VC下采用ADO实现BLOB(Binary)数据的存储,读取,修改,删除. 作者:邵盛松 2009-09-05 前言 1关于的BLOB(Binary)数据的存储和读取功能主要参考了MSDN上的一篇& ...
- MFC用串行化实现文档存储和读取功能
在面向对象的程序设计中,一般都是用二进制文件来保存文档资料.在VC++中控制和使用文件流的方法很多,MFC程序设计中常用的有两种方法:用CFile对象存储和读取文件:利用串行化存取文件.其中用CFil ...
- Python3基础 pickle.dump和load 对一个对象进行序列化存储及读取
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- numpy中文件的存储和读取-嵩天老师笔记
numpy中csv文件的存储和读取 CSV文件:(Comma‐Separated Value, 逗号分隔值) 一维和二维数组 存储 np.savetxt(frame,array,fmt='%.18e' ...
- Numpy用于数组数据的存储和读取
Python的Numpy模块可用于存储和读取数据: 1.将一个数组存储为二进制文件 Numpy.save:将一个数组以.npy的格式保存为二进制文件 调用格式:numpy.save(file, arr ...
随机推荐
- 2.【SELinux学习笔记】概念
1.强制类型的安全上下文 在SELinux中,訪问控制属性叫做安全上上下文.不管主体还是客体都有与之关联的安全上下文.通常安全上下文是由三部分组成:用户:角色:类型. 如: $id -Z j ...
- Unity3D 射线指定层获取GameObject 注意 LayerMask
这一篇是纯技术讨论,看过我前面文章的童鞋应该清楚,我的奔跑是靠鼠标响应的,鼠标点到哪就跑到哪,后来又有了界面,麻烦就来了,我的界面居然能点 穿.我不希望点界面的时候还能点到界面后面的地面上,角色傻不拉 ...
- 基于ZF中的.htaccess文件学习Apache的Rewrite语法
首先我们看一下这个.htaccess文件: RewriteEngine On RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST ...
- Hexo简介
Hexo是什么 Hexo(中文官方网站)是一个快速, 简洁且高效的博客框架. 让上百个页面在几秒内瞬间完成渲染. Hexo支持Github Flavored Markdown的所有功能, 甚至可以整合 ...
- <% %> in html
$(document).on('click', '.invoiceNumber', function () { var string = <%= StaticHelper.GetCurrentC ...
- CodeForces 651A(水题)
Friends are going to play console. They have two joysticks and only one charger for them. Initially ...
- [BZOJ 3387] Fence Obstacle Course
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3387 [算法] f[i][0]表示从第i个栅栏的左端点走到原点的最少移动步数 f[i ...
- Node.js:Strea
ylbtech-Node.js:Stream 1.返回顶部 1. Node.js Stream(流) Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请 ...
- 南海区行政审批管理系统接口规范v0.3(规划)4.1.【queryAcceptById】业务明细查询
加密前:{"time":"1510061005493","username":"GH_DATA_EXCHANGE",&q ...
- HDU 3018 一笔画问题
题意:给你一个图 判断最少用几笔把这个图画出来(画过的边不能重新画) 思路: 并查集+欧拉回路 仔细想一想. 在一个强连通分量中 所有度为奇数的点之和÷2就是要画的笔画数 Now question : ...