画像のぼかし処理

Pocket
LINEで送る

ジオラマカメラを作成するにあたり、ぼかし処理は必要不可欠です。(たぶん)
なので、今回はぼかしの勉強です。

平均化フィルタ

対象のピクセルに対して、周囲のピクセルとの平均値を取ります。
何の事か分かりにくいので・・・絵に描いてみます。
3×3の範囲でぼかす場合
平均化フィルタ(3x3)

5×5の範囲でぼかす場合
平均フィルタ(5x5)

実際コードを書いてみました。

コード

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic);
int strength = 3; // ぼかしの範囲
int width  = bmp.getWidth();
int height = bmp.getHeight();
int pix[] = new int[width*height];
bmp.getPixels(pix, 0, width, 0, 0, width, height);

int startSt = (strength / 2) * -1;
int endSt   = (strength / 2);
int gpix[] = new int[width * height];

for (int iy = 0; iy < height; iy++) {
    for (int ix = 0; ix < width; ix++) {
        int cnt = 0;
        int a = Color.alpha(pixel[ix + (iy * width)]);
        int r = 0;
        int g = 0;
        int b = 0;
        for (int sy = startSt; sy <= endSt; sy++) {
            for (int sx = startSt; sx <= endSt; sx++) {
                int px = ix + sx;
                int py = iy + sy;
                if (px < 0 || px >= width)  continue;
                if (py < 0 || py >= height) continue;
                int pix = pixel[px + (py * width)];
                r += Color.red(pix);
                g += Color.green(pix);
                b += Color.blue(pix);
                cnt++;
            }
        }
        int color = Color.argb(a, r/cnt, g/cnt, b/cnt);
        gpix[ix + (iy * width)] = color;
    }
}
    	
Bitmap bmp = Bitmap.createBitmap(
    gpix, width, height, Bitmap.Config.ARGB_8888);
    	
ImageView img = (ImageView) findViewById(R.id.pic);
img.setImageBitmap(newBmp);

書きながら絶対遅いよな~と思いながら作って見ました。
結果は激遅です。

出力結果

元画像

元画像


平均化フィルタ(5×5)

平均化フィルタ(5×5) / 処理速度:1.5s


平均化フィルタ(21×21)

平均化フィルタ(21×21) / 処理速度:24s


平均化フィルタ(41×41)

平均化フィルタ(41×41) / 処理時間:90s

ぼかしが効いているのは21pix以上の範囲を指定したとき。
これでこの遅さはちょっと・・・
単純にループしているだけでその辺を効率化すれば早くなるのは期待出きるのですが、
そこは頑張らずにOpenCVを試してみることにします。

続きは次回

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

この記事のトラックバック用URL