Ask Your Question
0

How to read pixels from MNIST digit database and create the iplimage

asked 2013-06-01 05:11:53 -0600

Heshan Sandeepa gravatar image

updated 2013-06-01 05:51:23 -0600

hi, i am involved with handwritten OCR application. I use MNIST digit database for training process here. I use following code for read pixels from the database and re-create the image. programs doesnt give any error but it gives meaningless image(totally black images and unclear pixels patterns) as output. can someone explain the reason for that? plz help

here is my code

int reverseInt(int i) {
unsigned char c1, c2, c3, c4;
c1 = i & 255;
c2 = (i >> 8) & 255;
c3 = (i >> 16) & 255;
c4 = (i >> 24) & 255;
return ((int)c1 << 24) + ((int)c2 << 16) + ((int)c3 << 8) + c4;
}

void create_image(CvSize size, int channels, unsigned char* data, int imagenumber) {
string imgname; ostringstream imgstrm;string fullpath;
imgstrm << imagenumber;
imgname=imgstrm.str();
fullpath="D:\\"+imgname+".jpg";

IplImage *imghead=cvCreateImageHeader(size, IPL_DEPTH_16S, channels);
imghead->imageData=(char *)data;
cvSaveImage(fullpath.c_str(),imghead);  
}

int main(){
ifstream file ("D:\\train-images.idx3-ubyte",ios::binary);
if (file.is_open())
{
    int magic_number=0; int number_of_images=0;int r; int c;
    int n_rows=0; int n_cols=0;CvSize size;unsigned char temp=0;

    file.read((char*)&magic_number,sizeof(magic_number)); 
    magic_number= reverseInt(magic_number);

    file.read((char*)&number_of_images,sizeof(number_of_images));
    number_of_images= reverseInt(number_of_images);

    file.read((char*)&n_rows,sizeof(n_rows));
    n_rows= reverseInt(n_rows);
    file.read((char*)&n_cols,sizeof(n_cols));
    n_cols= reverseInt(n_cols);


    for(int i=0;i<number_of_images;++i)
    {
        for(r=0;r<n_rows;++r)
        {
            for(c=0;c<n_cols;++c)
            {                 
                file.read((char*)&temp,sizeof(temp));
            }           
        }
        size.height=r;size.width=c;
        create_image(size,3, &temp, i);
    }
}
return 0;
}

and this is one of result image

image description

edit retag flag offensive close merge delete

1 answer

Sort by ยป oldest newest most voted
1

answered 2013-06-01 08:34:59 -0600

Heshan Sandeepa gravatar image

i have done mistake here. there must be a variable to keep image data. temp is only for keep information about single pixel. and also MNIST database has one channel images. i have define it as 3. here is the working code ans if someone has any thing about this, please comment here.

void create_image(CvSize size, int channels, unsigned char data[28][28], int imagenumber) {
string imgname; ostringstream imgstrm;string fullpath;
imgstrm << imagenumber;
imgname=imgstrm.str();
fullpath="D:\\MNIST\\"+imgname+".jpg";

IplImage *imghead=cvCreateImageHeader(size, IPL_DEPTH_8U, channels);
cvSetData(imghead, data, size.width);
cvSaveImage(fullpath.c_str(),imghead);  
}

and in the main function. it must be as follows.

    unsigned char arr[28][28];

    for(int i=0;i<1000;++i)
    {
        for(r=0;r<n_rows;++r)
        {
            for(c=0;c<n_cols;++c)
            {                 
                file.read((char*)&temp,sizeof(temp));
                arr[r][c]= temp;
            }           
        }
        size.height=r;size.width=c;
        create_image(size,1,arr, i);

    }
edit flag offensive delete link more

Question Tools

Stats

Asked: 2013-06-01 05:11:53 -0600

Seen: 3,319 times

Last updated: Jun 01 '13