Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更改直方图中的bin值_Java_Arrays_Indexing_Bounds - Fatal编程技术网

Java 更改直方图中的bin值

Java 更改直方图中的bin值,java,arrays,indexing,bounds,Java,Arrays,Indexing,Bounds,我之前发布了这段代码,但我解决了我遇到的问题。然而,我遇到了最后一个问题:如何将代码中的bin值从64更改为8和512?它可以在64个存储箱中正常运行,但其他任何操作都会返回一个超出范围的数组索引。这是一个完美的“stackoverflow”问题,因为这正是这里发生的事情 导入java.io.File; 导入weka.core.Attribute; 导入weka.core.FastVector; 导入weka.core.Instance; 导入weka.core.Instances; 导入wek

我之前发布了这段代码,但我解决了我遇到的问题。然而,我遇到了最后一个问题:如何将代码中的bin值从64更改为8和512?它可以在64个存储箱中正常运行,但其他任何操作都会返回一个超出范围的数组索引。这是一个完美的“stackoverflow”问题,因为这正是这里发生的事情

导入java.io.File;
导入weka.core.Attribute;
导入weka.core.FastVector;
导入weka.core.Instance;
导入weka.core.Instances;
导入weka.core.converters.ArffSaver;
导入weka.filters.Filter;
导入weka.filters.unsupervised.instance.NonSparseToSparse;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入java.io.PrintWriter;
导入javax.imageio.imageio;
导入javax.swing.JPanel;
公开课测验{
公共静态void main(字符串[]args)引发异常
{
int i;
快速向量属性;
实例数据集;
属性=新的FastVector();
对于(i=0;i<64;i++)
addElement(新属性(“bin”+(i+1));
数据集=新实例(“规格化直方图”属性,0);
NonSparseToSparse nonSparseToSparseInstance=新的NonSparseToSparse();
nonSparseToSparseInstance.setInputFormat(数据集);
实例SPARSTASET=Filter.useFilter(数据集,非ParseToParseInstance);
System.out.println(SPARSET);
ArffSaver arffSaverInstance=新的ArffSaver();
arffSaverInstance.setInstances(SPARStatSet);
setFile(新文件(“ESDN.arff”);
arffSaverInstance.writeBatch();
直方图();
}
私有静态void Histogram()引发IOException{
int[]ch=新int[4][4][4];
BuffereImage image=ImageIO.read(新文件(“Airport_training3.jpg”);
对于(int x=0;x>24;
内部红色=(颜色&0x00ff0000)>>16;
绿色=(颜色&0x0000ff00)>>8;
int blue=color&0x000000ff;
ch[red/64][green/64][blue/64]++;
}
for(int i=0;i

}

好的,我想好了。必须参考我的颜色范围表。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。每个箱子的数量值是其数值大小的储备

   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();
}