2013-06-24 17 views
4

我已经建立在J​​ava中的图像分类,我想测试对这里提供的图像:http://yann.lecun.com/exdb/mnist/读一IDX文件类型在Java中

不幸的是,如果你下载的火车图像-的idx3-ubyte.gz或任何其他3个文件,他们都是文件类型:.idx1-ubyte

第一个问题: 我想知道是否有人可以给我说明如何使.idx1-ubyte位图(.bmp )文件?

第二个问题: 或者我怎样才能读取这些文件?

关于IDX文件格式的信息: IDX文件格式是各种数学类型的向量和多维矩阵的简单格式。 基本格式是:

magic number 
size in dimension 0 
size in dimension 1 
size in dimension 2 
..... 
size in dimension N 
data 

该幻数是一个整数(MSB第一)。前2个字节总是为0

第三字节码的数据的类型:

0x08: unsigned byte 
0x09: signed byte 
0x0B: short (2 bytes) 
0x0C: int (4 bytes) 
0x0D: float (4 bytes) 
0x0E: double (8 bytes) 

的4个字节码的矢量/矩阵的维数:1为载体,2对于矩阵......

每个维度中的大小是4字节整数(MSB优先,高位,就像大多数非Intel处理器一样)。

数据存储方式类似于C数组,即最后一个维度中的索引变化最快。

+0

我不能相信单词“直接”出现在原始字节和高端编码的上下文两次。不要试图成为史蒂夫·沃兹尼亚克,只是想要我的数据。真的,任何想法为什么他们这么复杂? –

+1

这种灵魂(Joseph Redmon)在他的网站上提供了MNIST数据的csv下载:http://www.pjreddie.com/projects/mnist-in-csv/ –

回答

0

URL描述了你必须解码的格式,并且他们提到它是非标准的,所以明显的Goggle搜索没有出现任何使用代码。然而,这是非常直接的一个标题,其后是0-255灰度值的28x28像素矩阵。一旦你读出数据(记住要注意endian-ness),创建BMP文件很简单。我向你推荐以下文章:How to make bmp image from pixel byte array in java他们的问题是关于颜色的,但是他们的代码已经适用于灰度级,这就是你需要的东西,你应该能够从该片段中得到一些东西。

7

非常直截了当,正如WPrecht所说:“URL描述了你必须解码的格式。这是我的idx文件的ImageSet导出器,不是很干净,但它做的事情。

public class IdxReader { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     FileInputStream inImage = null; 
     FileInputStream inLabel = null; 

     String inputImagePath = "CBIR_Project/imagesRaw/MNIST/train-images-idx3-ubyte"; 
     String inputLabelPath = "CBIR_Project/imagesRaw/MNIST/train-labels-idx1-ubyte"; 

     String outputPath = "CBIR_Project/images/MNIST_Database_ARGB/"; 

     int[] hashMap = new int[10]; 

     try { 
      inImage = new FileInputStream(inputImagePath); 
      inLabel = new FileInputStream(inputLabelPath); 

      int magicNumberImages = (inImage.read() << 24) | (inImage.read() << 16) | (inImage.read() << 8) | (inImage.read()); 
      int numberOfImages = (inImage.read() << 24) | (inImage.read() << 16) | (inImage.read() << 8) | (inImage.read()); 
      int numberOfRows = (inImage.read() << 24) | (inImage.read() << 16) | (inImage.read() << 8) | (inImage.read()); 
      int numberOfColumns = (inImage.read() << 24) | (inImage.read() << 16) | (inImage.read() << 8) | (inImage.read()); 

      int magicNumberLabels = (inLabel.read() << 24) | (inLabel.read() << 16) | (inLabel.read() << 8) | (inLabel.read()); 
      int numberOfLabels = (inLabel.read() << 24) | (inLabel.read() << 16) | (inLabel.read() << 8) | (inLabel.read()); 

      BufferedImage image = new BufferedImage(numberOfColumns, numberOfRows, BufferedImage.TYPE_INT_ARGB); 
      int numberOfPixels = numberOfRows * numberOfColumns; 
      int[] imgPixels = new int[numberOfPixels]; 

      for(int i = 0; i < numberOfImages; i++) { 

       if(i % 100 == 0) {System.out.println("Number of images extracted: " + i);} 

       for(int p = 0; p < numberOfPixels; p++) { 
        int gray = 255 - inImage.read(); 
        imgPixels[p] = 0xFF000000 | (gray<<16) | (gray<<8) | gray; 
       } 

       image.setRGB(0, 0, numberOfColumns, numberOfRows, imgPixels, 0, numberOfColumns); 

       int label = inLabel.read(); 

       hashMap[label]++; 
       File outputfile = new File(outputPath + label + "_0" + hashMap[label] + ".png"); 

       ImageIO.write(image, "png", outputfile); 
      } 

     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } finally { 
      if (inImage != null) { 
       try { 
        inImage.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
      if (inLabel != null) { 
       try { 
        inLabel.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

}