2016-04-13 7 views
1

私はヒストグラム均等化メソッドをビジネスにしています。私はthis questionを基礎として構築しました。しかし、私はこのコードを実行することはできませんし、Googleは私が問題を見つける手助けにあまり役に立たない。私はJPG BufferedImageオブジェクトを渡します。私は最初に画像を表示して、私が作業しているものを見てから処理します。しかし、それは常に行int valueBefore=img.getRaster().getPixel(x, y,iarray)[0];で失敗し、私はなぜわからない。私が得るエラーはException in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1ですが、私はが表示されませんなぜこのエラーが出て、画像があり、ピクセルで満たされています!Javaヒストグラム均等化 - イメージラスタからピクセルを取得できません

public BufferedImage hisrogramNormatlisation(BufferedImage img) { 
     // To view image we're working on 
     JFrame frame = new JFrame(); 
     frame.getContentPane().setLayout(new FlowLayout()); 
     frame.getContentPane().add(new JLabel(new ImageIcon(img))); 
     frame.pack(); 
     frame.setVisible(true); 

     int width =img.getWidth(); 
     int height =img.getHeight(); 
     int anzpixel= width*height; 
     int[] histogram = new int[255]; 
     int[] iarray = new int[1]; 
     int i =0; 

     // Create histogram 
     for (int x = 50; x < width; x++) { 
      for (int y = 50; y < height; y++) { 
       int valueBefore=img.getRaster().getPixel(x, y,iarray)[0]; 
       histogram[valueBefore]++; 
       System.out.println("here"); 
      } 
     } 

     int sum = 0; 

     float[] lut = new float[anzpixel]; 
     for (i=0; i < 255; ++i) 
     { 
      sum += histogram[i]; 
      lut[i] = sum * 255/anzpixel; 
     } 

     i=0; 
     for (int x = 1; x < width; x++) { 
      for (int y = 1; y < height; y++) { 
       int valueBefore=img.getRaster().getPixel(x, y,iarray)[0]; 
       int valueAfter= (int) lut[valueBefore]; 
       iarray[0]=valueAfter; 
        img.getRaster().setPixel(x, y, iarray); 
        i=i+1; 
      } 
     } 
     return img; 
    } 

エラーの説明:あなたが投稿

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 
    at java.awt.image.ComponentSampleModel.getPixel(ComponentSampleModel.java:n) 
    at java.awt.image.Raster.getPixel(Raster.java:n) 
    at MainApp.hisrogramNormatlisation(MainApp.java: * line described *) 
    at MainApp.picture(MainApp.java:n) 
    at MainApp.<init>(Main.java:n) 
    at MainApp.main(Main.java:n) 

答えて

2

スタックトレースは、範囲索引のあなたのうちは、あなたがそれだと思うところ例外がスローされていない1 であると言います。 getPixel(int x、int y、int [] iarray)は、ピクセルの輝度値でiarrayを塗りつぶします。 rgbイメージを使用している場合、各チャネルに少なくとも3つの強度値があります。アルファ付きrgbを使用する場合、4つの強度値があります。あなたのiarrayのサイズはちょうど1です。したがって、追加の値を格納するために要素にアクセスするには、IndexOutOfBoundsExceptionがスローされます。 iarrayのサイズを大きくすると、例外がなくなります。

1

getPixel()ではなくgetSample()を使用します。

だからあなたのコードは次のようになります。final int valueBefore = img.getRaster().getSample(x, y, 0) ;あるいはhistogram[img.getRaster().getSample(x, y, 0)]++ ;

ところで、あなたはチャンネル/バンド数を決定し、各チャンネルごとにこのプロセスを実行するために、最初の画像の種類を確認することをお勧めします。

関連する問題