【问题标题】:change bin values in a histogram更改直方图中的 bin 值
【发布时间】:2026-02-25 18:20:03
【问题描述】:

我之前发布了这段代码,但我解决了我遇到的问题。但是,我遇到了最后一个问题:如何将这段代码中的 bin 值从 64 更改为 8 和 512?对于 64 个 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();
}

}

【问题讨论】:

    标签: java arrays indexing bounds


    【解决方案1】:

    好的,我想通了。不得不参考我的颜色范围表。 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。每个 bin 的数量值是它的数字大小的储备。

    【讨论】: