1

したがって、私のコードでは、画像を 1 と 0 の double int[][] 配列として表しています。画像をより小さな int[][] 配列に縮小できるようにしたいと考えています。これは私がやろうとしていることの例です:

0000000000
0000000000       00000 
0000110000       00100   
0000110000   =>  00100
0000110000       01110
0000110000       00000
0011111100       00000
0000000000
0000000000
0000000000

私のためにこのようなことを行うことができるライブラリはありますか? または、これを行うためのコードを作成する方法についてのアイデア。これは、私が探しているメソッド プロトタイプです。

int[][] reduceImage(int[][] image, double scaleOfReduction) {
  // somehow make image reduced
  // how to implement this efficiently???
  return reducedImage;
}
4

1 に答える 1

0

これは、意図したとおりに動作する簡単なコード スニペットです。

int[][] reduceImage(int[][] image, int scale) {

    int[][] reducedImage = new int[image.length/scale][image[0].length/scale];

    for (int i=0;i<reducedImage.length;i++) {
        for (int j=0;j<reducedImage[0].length;j++) {
            int total = 0;
            for (int x=0;x<scale;x++) {
                for (int y=0;y<scale;y++) {
                    total += image[i*scale+x][j*scale+y];
                }
            }
            reducedImage[i][j] = total>(scale*scale/2) ? 1 : 0;
        }
    }

    return reducedImage;
}

まず、新しい画像配列を作成します。

int[][] reducedImage = new int[image.length/scale][image[0].length/scale];

次に、この新しい画像の各ピクセルを反復処理します。

for (int i=0;i<reducedImage.length;i++) {
    for (int j=0;j<reducedImage[0].length;j++) {

次に、新しいピクセルごとに、古い画像のピクセル数をカウントします。

int total = 0;
for (int x=0;x<scale;x++) {
    for (int y=0;y<scale;y++) {
        total += image[i*scale+x][j*scale+y];
    }
}

そして、古いピクセルの少なくとも半分がオンになっているかどうかを確認し、新しいピクセルをオンにします。それ以外の場合、このピクセルをオフのままにします。

reducedImage[i][j] = total>(scale*scale/2) ? 1 : 0;

最後に、新しい画像を返します。

return reducedImage;

これはおそらく画像を縮小する最良の方法ではありませんが、非常にシンプルで理解しやすい方法です。

于 2014-04-28T03:23:34.147 に答える