È possibile simulare la sfocatura tramite immagini?


9

Sto usando libGDX per un gioco Android; per quanto ne so, non ha un'API per la sfocatura.

Leggendo su Wikipedia, sembra che la sfocatura si formi impostando i valori RGB di ciascun pixel sulla media di tutti i valori adiacenti. Il che non sembra facilmente possibile in libGDX - impostazione dei dati pixel.

Quindi la mia domanda è semplice:

È possibile simulare una sfocatura (decente) usando solo immagini?

Posso potenzialmente sovrapporre più immagini (in numero, trasparenza, tipo); ma posso creare una sfocatura convincente come questa?

Sono tentato di dire "no", ma forse qualcun altro ha realizzato qualcosa di simile. Per chiarezza, voglio un set di 1+ immagini generiche che posso visualizzare sopra QUALSIASI immagine per generare un effetto simile a sfocatura.


buona domanda! Ho pensato alla stessa cosa, me stesso!
Daniel dice di ripristinare Monica il

@DantheMan su quale piattaforma?
cenere 1999,

Unity3d o il linguaggio di ombreggiatura CG.
Daniel dice di reintegrare Monica il

Suggerisci di sovrapporre immagini trasparenti l'una sull'altra. Se li compensi leggermente, farai la media dei pixel, ottenendo la sfocatura
Jeff

1
@ ashes999, se stai cercando una "immagine magica" che può essere sovrapposta alle cose per farle apparire sfocate, che non esiste. La fusione alfa (sovrapposizione) non è la stessa cosa della sfocatura, mi dispiace.
Nathan Reed,

Risposte:


7

Se riesci a fondere in modo additivo le immagini e moltiplicarle per una costante mentre lo fai, puoi fare una sfocatura. Invece di calcolare la media dei pixel in un quartiere, dovresti fare la media di diverse copie dell'immagine spostate di un piccolo numero di pixel l'una dall'altra. O più in generale, è possibile eseguire una sfocatura gaussiana o qualsiasi tipo di sfocatura, controllando i pesi, ovvero moltiplicando ogni copia spostata dell'immagine per una costante mentre viene aggiunta al resto.

Algoritmicamente, sarebbe simile a questo:

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

Utilizzeresti gli stessi offset e pesi come nel modo standard di fare una sfocatura. Ci sono molti articoli sul Web su come generare i pesi per una sfocatura gaussiana, per esempio.


+1 bella risposta. Nel mio caso, non ho l'abilità additiva.
ashes999,

0

La sfocatura può essere un'operazione costosa, forse potrebbe funzionare un approccio diverso, ad esempio:

  1. Memorizza più copie dell'immagine sfocata in diverse direzioni (ad esempio multipli di 45 gradi), quindi visualizza l'immagine corrispondente più vicina in fase di esecuzione. Ciò offrirà le massime prestazioni, a scapito dell'utilizzo della memoria.
  2. Ridimensiona l'immagine verso il basso e poi torna alla dimensione originale con antialiasing / smoothing. Spesso questo può essere fatto con hardware grafico con un impatto molto limitato sulle prestazioni.

Non funzionerà perché deve essere dinamico, ovvero non riesco a conoscere in anticipo l'esatta configurazione dello schermo.
ashes999,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.