5

Android を使用してビットマップをぼかすのに苦労しています。

次のような単純なカーネルの使用に関する多くの情報を見てきました

0    0    0    5    0    0    0
0    5   18   32   18    5    0
0   18   64  100   64   18    0
5   32  100  100  100   32    5
0   18   64  100   64   18    0
0    5   18   32   18    5    0
0    0    0    5    0    0    0

私の問題は、これをビットマップで効率的に乗算する方法が本当にわからないことです。

すべてのピクセルを調べて、

image.getPixel(x, y)

これらの値を新しい配列に保存している間(そのため、それらの値を何度も取得する必要はありません)、配列を調べて、各値について、カーネル内の対応するフィールドを掛けた周囲の値を1068で割った値を合計します(上記のカーネルの場合 (= すべてのエントリの合計))?

これを行うより良い方法はありますか?国境の簡単な解決策はありますか?

または、私が見逃した Android SDK で利用できるものさえありますか?

4

2 に答える 2

4

あなたがしていることは、基本的に元の画像 I とカーネル K の間の 2D 畳み込みです (カーネルは実際には PSF - 点広がり関数です)。画像 I のサイズm x nが で、カーネルのサイズが である場合r x s、ぼやけた画像 J の各ポイントに対して rxs の乗算が必要になり、m x n x r x s画像全体の合計乗算が必要になります。

計算上より効率的なアプローチは、DFT (離散フーリエ変換) を使用することです。画像とカーネルの変換を行い、それらを変換のドメインで乗算してから、逆 DFT を介して元に戻します。要するに:

J = IDFT(DFT(I)*DFT(K))

DFT 計算用の高速アルゴリズム (FFT - 高速フーリエ変換) が存在します。それらは、インターネット上の C ソースで見つけることができます。C ソースを使用するには、Android プラットフォームでサポートされている JNI (Java Native Interface) を使用する必要があります。

境界に関しては、DFT を使用する場合、境界でのぼかしは循環的に行われるため、問題はありません (たとえば、左の境界値は、いくつかの右の境界値を使用して計算されます)。

分離されている可能性のあるカーネル (1 次元カーネルの外積として表される 2 次元カーネル) を使用している場合は、より単純になります。2D 畳み込みは、行と列の 1 次元畳み込み (またはその逆) として表すことができます。同じことが DFT を使用したぼかしにも当てはまります。

于 2010-09-14T14:57:23.073 に答える
1

BlurMaskFilter を利用してみてください。

使用例:

http://www.anddev.org/decorated_and_animated_seekbar_tutorial-t10937.html

于 2010-09-09T07:20:34.417 に答える