2015-05-05 58 views
0

我之前發佈了此代碼,但我解決了我遇到的問題。但是,我遇到了最後一個問題:如何將此代碼中的bin值從64更改爲8和512?它將在64個bin中運行得很好,但其他任何情況都會返回數組索引超出範圍。這是「stackoverflow」的完美問題,因爲這正是發生在這裏的事情。 :)更改柱狀圖中的bin值

import java.io.File; 
    import weka.core.Attribute; 
    import weka.core.FastVector; 
    import weka.core.Instance; 
    import weka.core.Instances; 
    import weka.core.converters.ArffSaver; 
    import weka.filters.Filter; 
    import weka.filters.unsupervised.instance.NonSparseToSparse; 
    import java.awt.image.BufferedImage; 
    import java.io.File; 
    import java.io.IOException; 
    import java.io.PrintWriter; 
    import javax.imageio.ImageIO; 
    import javax.swing.JPanel; 

public class AttTest { 

public static void main(String[] args) throws Exception 
{ 


    int i; 
    FastVector attributes; 
    Instances dataSet; 
    attributes = new FastVector(); 
    for (i = 0; i < 64; i++) 
    attributes.addElement(new Attribute("bin" +(i+1))) ; 


     dataSet = new Instances("NormalizedHistogram_64bins", attributes, 0); 

    NonSparseToSparse nonSparseToSparseInstance = new NonSparseToSparse(); 
    nonSparseToSparseInstance.setInputFormat(dataSet); 
    Instances sparseDataset = Filter.useFilter(dataSet, nonSparseToSparseInstance); 

    System.out.println(sparseDataset); 

    ArffSaver arffSaverInstance = new ArffSaver(); 
    arffSaverInstance.setInstances(sparseDataset); 
    arffSaverInstance.setFile(new File("ESDN.arff")); 
    arffSaverInstance.writeBatch(); 

    Histogram(); 


} 

private static void Histogram() throws IOException { 
    int[][][] ch = new int[4][4][4]; 
    BufferedImage image = ImageIO.read(new File("airplane_training3.jpg")); 
    for(int x = 0; x < image.getWidth(); x++) 
     for(int y = 0; y < image.getHeight(); y++) { 
      int color = image.getRGB(x, y); 
      int alpha = (color & 0xff000000) >> 24; 
      int red = (color & 0x00ff0000) >> 16; 
      int green = (color & 0x0000ff00) >> 8; 
      int blue = color & 0x000000ff; 
      ch[red/64][green/64][blue/64]++; 
     } 
    for(int i = 0; i < ch.length; i++) 
     for(int j = 0; j < ch[i].length; j++) 
      for(int p = 0; p < ch[i][j].length; p++) 
       System.out.print("0." + (ch[i][j][p])/64 + ","); 
    PrintWriter writer = new PrintWriter("C:\\Users\\Someguy\\Desktop\\TrainingData_64.arff"); 
    writer.println(""); 
    writer.close(); 
} 

}

回答

0

好吧,我想通了。必須參考我的顏色範圍表。 64給我64個垃圾箱。 128給我8箱,32給我512箱;然而,我不得不從[4] [4] [4]到[8] [8] [8]增加數組,以防止32出界。

這是一個有趣的數學問題,因爲最大顏色值範圍是256.因此,256/128 = 2; 256/64 = 4; 256/32 = 8。所以bin值分別爲8,64,512 == 128,64,32。每個箱的數量值是其數值大小的儲備。