程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C/C++ 圖像二進制存儲與讀取

C/C++ 圖像二進制存儲與讀取

編輯:關於C++

在深度學習時,制作樣本數據集時,需要產生和讀取一些二進制圖像的數據集,如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.

由此,繪制一個簡圖:

memory

根據圖像大小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

運行結果如下:

results

再看圖片屬性:

attribute

與官網上的大小3073一致,那麼這麼存取應該沒問題。

嚴格按照官網的RGB通道分別存儲,略作修改就可以實現:

/*  for ( int i=0; i

存儲和讀取多張圖片方法類似,這裡就不做介紹。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved