在深度學習時,制作樣本數據集時,需要產生和讀取一些二進制圖像的數據集,如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
#include
#include
#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
運行結果如下:
再看圖片屬性:
與官網上的大小
3073
一致,那麼這麼存取應該沒問題。
嚴格按照官網的RGB通道分別存儲,略作修改就可以實現:
/* for ( int i=0; i
存儲和讀取多張圖片方法類似,這裡就不做介紹。