- 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.