2010-09-09 26 views
5

Estoy luchando para hacer borrosos los mapas de bits con Android.Cómo desenfocar un mapa de bits (Android)?

he visto una gran cantidad de información sobre el uso de un núcleo simple como

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 

Mi problema es que realmente no estoy seguro de cómo multiplicar esto con mi mapa de bits de una manera eficiente.

¿Debo ir a través de cada píxel y

image.getPixel(x, y) 

mientras que el almacenamiento de esos valores a una nueva matriz (por lo que no tengo que conseguir esos valores una y otra vez) y luego ir a través de la matriz y de cada valor suma los valores circundantes multiplicados por el campo correspondiente en el kernel dividido por 1068 (en el caso del kernel anterior (= todas las entradas resumidas))?

¿Hay alguna forma mejor de hacerlo? ¿Hay una solución simple para las fronteras?

¿O hay algo disponible en el SDK de Android que eché de menos?

+0

Véase mi respuesta para una copia completa y pegar aplicación de mapa de bits desenfoque rápida para Android: http://stackoverflow.com/a/10028267/578746 – Yahel

Respuesta

4

Lo que está haciendo es básicamente convolución 2D entre la imagen original, I y K kernel (núcleo es realmente PSF - función de dispersión de punto). Si su imagen I es del tamaño m x n, y el núcleo es del tamaño r x s, para cada punto de la imagen borrosa J necesita r x s multiplicaciones, lo que da como resultado multiplicaciones totales de m x n x r x s para toda la imagen.

El enfoque computacionalmente más eficiente sería usar DFT (Discrete Fourier Transform). Haz transformaciones de la imagen y del núcleo, y multiplícalos en el dominio de transformación, y luego regresa a través de DFT inverso. En resumen:

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

Para el algoritmo rápido de computación DFT (FFT - Fast Fourier Transform) existe. Puede encontrarlos en la fuente C en Internet. Para usar la fuente C, necesita usar JNI (Java Native Interface), compatible con la plataforma Android.

En cuanto a los bordes, al usar DFT no tiene problemas, ya que el borrón en el borde se realiza de forma circular (por ejemplo, los valores del borde izquierdo se calculan utilizando también algunos valores de borde derecho).

Si está trabajando con los granos que pueden separarse (kernel 2D representado como producto externo de los granos 1-D), entonces se vuelve más simple. La convolución 2D se puede representar como convoluciones 1-D sobre filas y luego sobre columnas (o viceversa). Lo mismo es cierto para difuminar usando DFT.

Cuestiones relacionadas