Ist es möglich, Unschärfe über Bilder zu fälschen?

9

Ich benutze libGDX für ein Android-Spiel. Soweit ich das beurteilen kann, gibt es keine API zum Verwischen.

Beim Lesen auf Wikipedia scheint es, als würde Unschärfe entstehen, wenn die RGB-Werte für jedes Pixel auf den Durchschnitt aller benachbarten Werte gesetzt werden. Was in libGDX nicht einfach zu sein scheint - Pixeldaten einstellen.

Meine Frage ist also einfach:

Ist es möglich, (eine anständige) Unschärfe nur mit Bildern zu fälschen?

Ich kann möglicherweise mehrere Bilder (in Anzahl, Transparenz, Typ) überlagern. Aber kann ich so eine überzeugende Unschärfe erzeugen?

Ich bin versucht, "Nein" zu sagen, aber vielleicht hat jemand anderes etwas Ähnliches erreicht. Aus Gründen der Übersichtlichkeit möchte ich eine Reihe von mehr als 1 allgemeinen Bildern, die ich über JEDEM Bild rendern kann, um einen unscharfen Effekt zu erzielen.

Asche999
quelle
gute Frage! Ich habe selbst an dasselbe gedacht!
Daniel sagt Reinstate Monica
@DantheMan auf welcher Plattform?
Asche999
Unity3d oder die CG-Schattierungssprache.
Daniel sagt Reinstate Monica
Sie schlagen vor, transparente Bilder übereinander zu legen. Wenn Sie sie leicht versetzen, werden Sie die Pixel mitteln und Unschärfe erzielen
Jeff
1
@ ashes999, wenn Sie nach einem "magischen Bild" suchen, das den Dingen überlagert werden kann, damit sie verschwommen erscheinen, gibt es das nicht. Alpha-Blending (Overlaying) ist nicht das Gleiche wie Unschärfe, sorry.
Nathan Reed

Antworten:

7

Wenn Sie Bilder additiv mischen und dabei mit einer Konstanten multiplizieren können, können Sie eine Unschärfe ausführen. Anstatt die Pixel in einer Nachbarschaft zu mitteln, würden Sie mehrere Kopien des Bildes mitteln, die um eine kleine Anzahl von Pixeln voneinander versetzt sind. Oder allgemeiner gesagt, Sie können eine Gaußsche Unschärfe oder eine andere Art von Unschärfe ausführen, indem Sie die Gewichte steuern - dh jede verschobene Kopie des Bildes mit einer Konstanten multiplizieren, während sie dem Rest hinzugefügt wird.

Algorithmisch würde es ungefähr so ​​aussehen:

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

Sie würden die gleichen Offsets und Gewichte verwenden wie bei der Standardmethode zum Verwischen. Im Internet gibt es zahlreiche Artikel darüber, wie Sie beispielsweise die Gewichte für eine Gaußsche Unschärfe generieren können.

Nathan Reed
quelle
+1 nette Antwort. In meinem Fall habe ich keine additiven Fähigkeiten.
Asche999
0

Unschärfe kann eine teure Operation sein, vielleicht könnte ein anderer Ansatz funktionieren, z.

  1. Speichern Sie mehrere Kopien des Bildes, die in verschiedene Richtungen verschwommen sind (z. B. Vielfache von 45 Grad), und zeigen Sie dann zur Laufzeit das am besten passende Bild an. Dies bietet die höchste Leistung auf Kosten der Speichernutzung.
  2. Skalieren Sie das Bild mit Anti-Aliasing / Glättung nach unten und dann wieder in voller Größe. Dies kann häufig mit Grafikhardware mit sehr geringen Auswirkungen auf die Leistung durchgeführt werden.
Luke Van In
quelle
Es wird nicht funktionieren, weil es dynamisch sein muss, dh ich kann die genaue Einrichtung des Bildschirms nicht im Voraus wissen.
Asche999