android - samsung - fondo desenfocado con celular
Cómo desenfocar un mapa de bits(Android)? (2)
Estoy luchando para hacer borrosos los mapas de bits usando Android.
He visto mucha información sobre el uso de un kernel 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 pasar por cada píxel y
image.getPixel(x, y)
mientras guardo esos valores en una nueva matriz (para no tener que obtener esos valores una y otra vez) y luego recorrer la matriz y para cada valor sumar los valores circundantes multiplicados por el campo correspondiente en el kernel dividido por 1068 (en el caso del núcleo anterior (= todas las entradas resumidas))?
¿Hay alguna forma mejor de hacer esto? ¿Hay una solución simple para las fronteras?
¿O hay algo disponible en el SDK de Android que eché de menos?
Intente hacer uso de BlurMaskFilter.
ejemplo de uso:
http://www.anddev.org/decorated_and_animated_seekbar_tutorial-t10937.html
Lo que estás haciendo es básicamente una convolución 2D entre la imagen original I y el núcleo K (el núcleo es en realidad PSF - función de dispersión de puntos). Si su imagen I es de tamaño mxn
y kernel es de tamaño rxs
, para cada punto de imagen borrosa J necesita multiplicaciones de mxnxrxs
, lo que da como mxnxrxs
multiplicaciones de mxnxrxs
totales para toda la imagen.
Un 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 breve:
J = IDFT(DFT(I)*DFT(K))
Para el cálculo DFT, existen algoritmos rápidos (FFT - Fast Fourier Transform). 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 las fronteras, al usar DFT no tiene problemas, ya que el borrado 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.