ジオラマカメラを作成するにあたり、ぼかし処理は必要不可欠です。(たぶん)
なので、今回はぼかしの勉強です。
平均化フィルタ
対象のピクセルに対して、周囲のピクセルとの平均値を取ります。
何の事か分かりにくいので・・・絵に描いてみます。
3×3の範囲でぼかす場合
実際コードを書いてみました。
コード
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);
書きながら絶対遅いよな~と思いながら作って見ました。
結果は激遅です。
出力結果
ぼかしが効いているのは21pix以上の範囲を指定したとき。
これでこの遅さはちょっと・・・
単純にループしているだけでその辺を効率化すれば早くなるのは期待出きるのですが、
そこは頑張らずにOpenCVを試してみることにします。
続きは次回
この記事のトラックバック用URL