2010-09-09 27 views
5

Je me bats pour obtenir des bitmaps floues en utilisant Android.Comment flouter un bitmap (Android)?

J'ai vu beaucoup d'informations sur l'utilisation d'un noyau simple comme

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 

Mon problème est que je ne suis vraiment pas sûr de savoir comment multiplier avec mon Bitmap d'une manière efficace.

Dois-je passer par chaque pixel et

image.getPixel(x, y) 

tout en stockant ces valeurs à un nouveau tableau (donc je n'ai pas d'obtenir ces valeurs, encore et encore), puis passer par le tableau et pour chaque valeur additionne les valeurs environnantes multipliées par le champ correspondant dans le noyau divisé par 1068 (dans le cas du noyau ci-dessus (= toutes les entrées résumées))?

Y a-t-il une meilleure façon de faire cela? Y a-t-il une solution simple pour les frontières?

Ou y at-il même quelque chose d'disponible dans le SDK Android que j'ai raté?

+0

Voir ma réponse pour une copie complète et coller la mise en œuvre de bitmap rapide pour Android: http://stackoverflow.com/a/10028267/578746 – Yahel

Répondre

4

Ce que vous faites est essentiellement convolution 2D entre l'image originale I et le noyau K (noyau est en fait PSF - fonction de point de diffusion). Si votre image I est de taille m x n, et que le noyau est de taille r x s, pour chaque point de l'image floue J il vous faut multiplications r x s, résultant en multiplications totales m x n x r x s pour l'ensemble de l'image.

Une approche plus efficace sur le plan des calculs consisterait à utiliser la transformée de Fourier discrète (DFT). Faites des transformations de l'image et du noyau, et multipliez-les dans le domaine de la transformation, puis revenez en arrière via DFT inverse. En bref:

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

Pour les algorithmes rapides de calcul DFT (FFT - transformée de Fourier rapide) existent. Vous pouvez les trouver en source C sur Internet. Pour utiliser la source C, vous devez utiliser JNI (Java Native Interface), pris en charge par la plate-forme Android. En ce qui concerne les bordures, lors de l'utilisation de DFT, vous n'avez aucun problème, car le flou à la bordure est circulaire (par exemple, les valeurs de bordure gauche sont calculées en utilisant également des valeurs de bordure droites).

Si vous travaillez avec les noyaux qui peuvent être séparés (noyau 2D représenté comme produit externe des noyaux 1-D), alors cela devient plus simple. La convolution 2D peut être représentée par des circonvolutions 1D sur des lignes puis sur des colonnes (ou vice versa). La même chose est vraie pour flouter en utilisant DFT.