¿Es posible falsificar el desenfoque a través de imágenes?

9

Estoy usando libGDX para un juego de Android; Por lo que puedo decir, no tiene una API para difuminar.

Al leer en Wikipedia, parece que el desenfoque se forma al establecer los valores RGB de cada píxel en el promedio de todos los valores adyacentes. Lo que no parece fácilmente posible en libGDX: configuración de datos de píxeles.

Entonces mi pregunta es simple:

¿Es posible simular un desenfoque (decente) usando solo imágenes?

Potencialmente puedo superponer varias imágenes (en número, transparencia, tipo); pero ¿puedo crear un desenfoque convincente como este?

Estoy tentado a decir "no", pero tal vez alguien más haya logrado algo similar. Para mayor claridad, quiero un conjunto de 1+ imágenes genéricas que pueda renderizar sobre CUALQUIER imagen para generar un efecto borroso.

cenizas999
fuente
¡buena pregunta! ¡Yo mismo he pensado en lo mismo!
Daniel dice reinstalar a Monica el
@DantheMan en qué plataforma?
cenizas999
Unity3d o el lenguaje de sombreado CG.
Daniel dice reinstalar a Monica el
Sugiere superponer imágenes transparentes entre sí. Si los compensa ligeramente, va a promediar los píxeles, logrando desenfoque
Jeff
1
@ ashes999, si está buscando una "imagen mágica" que pueda superponerse en las cosas para que se vean borrosas, eso no existe. La mezcla alfa (superposición) no es remotamente lo mismo que difuminar, lo siento.
Nathan Reed

Respuestas:

7

Si puede mezclar aditivamente imágenes y multiplicarlas por una constante mientras lo hace, puede hacer un desenfoque. En lugar de promediar los píxeles en un vecindario, promediaría varias copias de la imagen desplazadas por una pequeña cantidad de píxeles entre sí. O, en términos más generales, puede hacer un desenfoque gaussiano o cualquier tipo de desenfoque, controlando los pesos, es decir, multiplicando cada copia desplazada de la imagen por una constante a medida que se agrega al resto.

Algorítmicamente, se vería así:

clear output_image to 0
foreach offset, weight in filter_kernel:
    output_image += input_image * weight, shifted by offset

Usaría los mismos desplazamientos y pesos que en la forma estándar de hacer un desenfoque. Hay muchos artículos en la Web sobre cómo generar los pesos para un desenfoque gaussiano, por ejemplo.

Nathan Reed
fuente
+1 buena respuesta. En mi caso, no tengo capacidad aditiva.
cenizas999
0

El desenfoque puede ser una operación costosa, quizás un enfoque diferente podría funcionar, por ejemplo:

  1. Almacene varias copias de la imagen borrosa en varias direcciones diferentes (por ejemplo, múltiplos de 45 grados), luego muestre la imagen coincidente más cercana en tiempo de ejecución. Esto ofrecerá el mayor rendimiento, a costa del uso de memoria.
  2. Reduzca la imagen y luego vuelva a su tamaño completo con suavizado / suavizado. A menudo, esto se puede hacer con hardware de gráficos con muy poco impacto en el rendimiento.
Luke Van In
fuente
No funcionará, porque tiene que ser dinámico, es decir, no puedo conocer la configuración exacta de la pantalla antes de tiempo.
cenizas999