2 Punkte von GN⁺ 2026-01-18 | Noch keine Kommentare. | Auf WhatsApp teilen
  • Entwicklung einer ASCII-Rendering-Technik, die Konturen und Formen von Bildern bewahrt und damit das Problem unscharfer Kanten bisheriger Verfahren löst
  • Statt einfacher Helligkeitszuordnung auf Pixelebene wird ein hochmodimensionaler vektorbasierter Ansatz verwendet, der die visuelle Form (shape) jedes Zeichens numerisch erfasst und abgleicht
  • Für jedes Zeichen wird die Dichte in oberen, unteren, linken und rechten Bereichen gemessen, um einen von 2D auf 6D erweiterten Shape-Vektor zu erzeugen und so eine präzisere Zeichenauswahl zu ermöglichen
  • Um die Schärfe von Kanten zu erhöhen, werden Algorithmen zur globalen und gerichteten Kontrastverstärkung (contrast enhancement) angewendet
  • Durch GPU-Beschleunigung, Caching und k-d-Baum-Suche wird Echtzeit-Performance für ASCII-Rendering erreicht und ein hochwertiger visueller Effekt umgesetzt

Umwandlung von Bildern in ASCII

  • ASCII umfasst 95 druckbare Zeichen, und mit einer Monospace-Schriftart wird das Bild in ein Raster unterteilt
    • Die Helligkeit jeder Zelle wird berechnet und entsprechend der Zeichendichte zugeordnet
  • Einfache Nearest-Neighbor-Interpolation verursacht den Jaggies-Effekt mit unruhigen Kanten
  • Durch Supersampling werden mehrere Samples innerhalb einer Zelle genommen und ihre mittlere Helligkeit berechnet, was das Ergebnis glättet, aber weiterhin unscharfe Kanten erzeugt
  • Das Kernproblem besteht darin, Zeichen wie Pixel zu behandeln und ihre eigentliche Form nicht zu berücksichtigen

Nutzung der Zeichenform (Shape)

  • Jedes Zeichen hat innerhalb einer Zelle eine andere Verteilung der visuellen Dichte
    • Beispiel: T ist oben schwerer, L unten schwerer
  • Um dies zu quantifizieren, werden Sampling-Kreise innerhalb der Zelle platziert und der Anteil der vom Zeichen belegten Fläche in jedem Bereich berechnet
  • Die Belegungsraten der oberen und unteren Bereiche werden als Vektor dargestellt und ergeben einen zweidimensionalen Shape-Vektor
  • Die Shape-Vektoren aller Zeichen werden vorab berechnet, und für den Sampling-Vektor des Bildes wird über die euklidische Distanz (Euclidean distance) das nächstliegende Zeichen gewählt

Erweiterung auf einen 6D-Formvektor

  • Nur mit einer oberen und unteren 2D-Aufteilung lassen sich Zeichen wie -, p, q und andere mit mittigem oder seitlichem Schwerpunkt nur schwer darstellen
  • Die Zelle wird auf sechs Sampling-Kreise erweitert, um oben, Mitte, unten sowie links-rechts-Unterschiede vollständig zu erfassen
  • Der 6D-Shape-Vektor bildet Zeichenformen deutlich präziser ab und stellt auch runde und diagonale Zeichen gut dar
  • Beim Rendern von 3D-Szenen bleiben zwar Außenkonturen scharf, doch die Grenzen zwischen Flächen wirken weiterhin unscharf

Kontrastverstärkung (Contrast Enhancement)

  • Jedes Element des Sampling-Vektors wird mit einem Exponenten angepasst, sodass dunkle Werte dunkler werden, während helle Werte erhalten bleiben
    • Der Vektor wird normalisiert, der Exponent angewendet und anschließend auf den ursprünglichen Bereich zurückgeführt
  • Dadurch wird die visuelle Trennung von Kanten verstärkt, und die Zeichenauswahl wird klarer
  • In Bereichen mit gleichmäßiger Helligkeit gibt es kaum Änderungen, sodass weiche Verläufe erhalten bleiben
  • An manchen Kanten entsteht jedoch ein Treppeneffekt (staircasing)

Gerichtete Kontrastverstärkung (Directional Contrast Enhancement)

  • Auch außerhalb jeder Zelle werden äußere Sampling-Kreise platziert, um Helligkeitsinformationen aus der Umgebung zu sammeln
  • Helle Werte des äußeren Sampling-Vektors dunkeln die entsprechenden Elemente des inneren Vektors ab und verstärken so den Kontrast in Kantenrichtung
  • Wird das äußere Sampling so erweitert, dass Einflüsse zwischen oberem, mittlerem und unterem Bereich breiter wirken, lassen sich weiche und zugleich scharfe Kanten darstellen
  • In Kombination mit globaler Kontrastverstärkung entsteht ein ASCII-Rendering mit klaren Konturen und hoher Lesbarkeit in 3D-Szenen

Performance-Optimierung

  • Da eine einfache wiederholte Nächste-Nachbarn-Suche bei der Zeichenauswahl langsam ist, wird ein k-d-Baum für schnelle Suche im mehrdimensionalen Raum eingesetzt
  • Durch Caching werden Ergebnisse identischer Sampling-Vektoren wiederverwendet
    • Jeder Vektor wird in 5-Bit-Schritten quantisiert, um einen speichereffizienten Cache-Schlüssel zu erzeugen
    • Mit einem auf 8 gesetzten Bereich wird ein Gleichgewicht zwischen Qualität und Speicherverbrauch erreicht
  • Die gecachte Suche ist sehr schnell, sodass auch Tausende Zeichen in Echtzeit verarbeitet werden können
  • Die Berechnung der Sampling-Vektoren wird auf die GPU verlagert, sodass interne und externe Sampling-, Kontrastverstärkungs- und weitere Operationen in der Shader-Pipeline ausgeführt werden
    • Mehrfache Performance-Steigerung gegenüber der CPU

Fazit

  • Der Ansatz, Zeichenformen als Vektoren numerisch zu erfassen und zu nutzen, verbessert Auflösung und Schärfe des ASCII-Renderings deutlich
  • Das Verfahren ähnelt konzeptionell Word Embeddings und könnte auch auf andere visuelle Probleme angewendet werden
  • Die erste Implementierung war langsam, doch mit GPU-Beschleunigung, Caching und k-d-Baum-Suche werden selbst auf Mobilgeräten flüssige FPS erreicht
  • Farbasiertes ASCII wurde nicht behandelt; stattdessen wird auf die Möglichkeit künftiger Experimente mit vielfältigeren Form- und Kontrastkombinationen verwiesen
  • ASCII-Rendering ist mehr als nur ein visueller Effekt und zeigt die Erweiterbarkeit von Formerkennung und Vektorrepräsentation

Noch keine Kommentare.

Noch keine Kommentare.