私はメディアンフィルターでプログラムをやっています。私が達成しようとしているのは、1つのピクセル値を取り、その隣接ピクセルを見つけて、それらを配列に格納し、その配列をソートし、中間値を取ることです(サイズ9の配列の場合、中間値はインデックス位置4です)。検討中のピクセルとまったく同じ座標にこの値を代入します。
コンテンツを削除して の値を出力するだけで、ループは正常に機能しますi,j,x,y
。ステートメントを追加するとneighborhoodVal.add(imageRaster.getSample(x, y, 0));
、java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds!
エラーが発生します。
私が観察したことから、 の値が にj
なるとの1
値が にi
なることがわかりました。これ264
は奇妙です。画像内のすべてのピクセルのみをループするため、外側の 2 つのループ (i と j) は、エッジにあるものを除くすべてのピクセルをループします。画像の。内側のループ ( x
& y
) は、番目のピクセルの 8 つの隣接ピクセルすべてをループします[i][j]
。
私が使用している画像には と がwidth = 265
ありheight=269
ます。コードは次のとおりです。
public class MedianFilter {
public static void main(String[] args) throws IOException {
int i, j, x, y;
ArrayList<Integer> neighborhoodVal = new ArrayList<Integer>();
;
String imagePath = "images/assignment10/noisyShapes.jpg";
BufferedImage inputImage = convertToGrayScale(ImageIO.read(new File(
imagePath)));
WritableRaster imageRaster = inputImage.getRaster();
BufferedImage filteredImage = new BufferedImage(inputImage.getWidth(),
inputImage.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
WritableRaster newWRaster = filteredImage.getRaster();
for (i = 1; i < imageRaster.getHeight()-1; i++) {
for (j = 1; j < imageRaster.getWidth()-1; j++) {
for (x = Math.max(0, i - 1); x <= Math.min(i + 1,imageRaster.getWidth()); x++) {
for (y = Math.max(0, j - 1); y <= Math.min(j + 1,imageRaster.getHeight()); y++) {
System.out.println(i+","+j+"------->"+x+","+y);
neighborhoodVal.add(imageRaster.getSample(x, y, 0));
Collections.sort(neighborhoodVal);
}
}
newWRaster.setSample(i, j, 0, (neighborhoodVal
.get((neighborhoodVal.size() / 2) + 1)));
neighborhoodVal.clear();
}
}
File f = new File("images/assignment10/medianFilterOutput.jpg");
ImageIO.write(filteredImage, "JPG", f);
}
public static BufferedImage convertToGrayScale(BufferedImage givenImage)
throws IOException {
// TODO Auto-generated method stub
BufferedImage image = new BufferedImage(givenImage.getWidth(),
givenImage.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
Graphics grp = image.getGraphics();
grp.drawImage(givenImage, 0, 0, null);
return image;
}
}
そして、私はこの画像を使用しています:
どうやっj
て1になるの?これでどこが間違っているのですか?