- Développement d’une technique de rendu ASCII qui préserve les contours et les formes des images, afin de résoudre le problème des bords flous des méthodes existantes
- Au lieu d’un simple mappage luminosité-caractère au niveau du pixel, utilisation d’une approche fondée sur des vecteurs de haute dimension qui quantifie et associe la forme visuelle (shape) de chaque caractère
- Mesure de la densité de chaque caractère dans les zones supérieure, inférieure, gauche et droite pour générer un shape vector étendu de 2 à 6 dimensions, permettant une sélection de caractères plus précise
- Application d’algorithmes de renforcement global et directionnel du contraste (contrast enhancement) pour améliorer la netteté des contours
- Grâce à l’accélération GPU, au caching et à la recherche par arbre k-d, les performances nécessaires à un rendu ASCII en temps réel sont assurées, avec un résultat visuel de haute qualité
Conversion d’une image en ASCII
- L’ASCII comporte 95 caractères imprimables, et l’image est divisée en grille à l’aide d’une police monospace
- La luminosité de chaque cellule est calculée puis mappée selon la densité du caractère
- Une simple interpolation par plus proche voisin (nearest-neighbor interpolation) provoque des jaggies, c’est-à-dire des bords irréguliers
- Avec le supersampling, on prélève plusieurs échantillons dans une cellule pour calculer la luminosité moyenne, ce qui adoucit le rendu, mais laisse encore des contours flous
- Le cœur du problème est de traiter les caractères comme des pixels, sans tenir compte de leur forme propre
Utilisation de la forme des caractères
- Chaque caractère présente une distribution visuelle de densité différente à l’intérieur de sa cellule
- Par exemple,
T est plus dense en haut, tandis que L est plus dense en bas
- Pour quantifier cela, on place des cercles d’échantillonnage dans la cellule et on calcule la proportion d’occupation du caractère dans chaque zone
- Les taux d’occupation des zones haute et basse sont exprimés sous forme vectorielle pour créer un shape vector en 2 dimensions
- Les shape vectors de chaque caractère sont précalculés, puis le caractère le plus proche du vecteur échantillonné de l’image est choisi à l’aide de la distance euclidienne (Euclidean distance)
Extension vers un vecteur de forme en 6 dimensions
- Les seules 2 dimensions haut/bas ne suffisent pas à représenter correctement des caractères comme
-, p ou q, centrés au milieu ou marqués à gauche/droite
- La cellule est étendue à 6 cercles d’échantillonnage afin de capturer à la fois haut, milieu, bas et les différences gauche/droite
- Le shape vector en 6 dimensions reflète la forme des caractères avec bien plus de précision et représente aussi bien les caractères circulaires ou diagonaux
- Lors du rendu de scènes 3D, les silhouettes extérieures restent nettes, mais les frontières entre surfaces deviennent floues
Renforcement du contraste
- Chaque composante du vecteur d’échantillonnage est ajustée à l’aide d’un exposant (exponent) pour assombrir davantage les valeurs faibles tout en conservant les valeurs élevées
- Le vecteur est normalisé, l’exposant appliqué, puis l’échelle d’origine est restaurée
- Ce processus renforce la distinction visuelle des contours, rendant le choix des caractères plus net
- Dans les zones de luminosité uniforme, le changement reste minime, ce qui préserve les dégradés doux
- En revanche, un effet d’escalier (staircasing) peut apparaître sur certaines frontières
Renforcement directionnel du contraste
- Des cercles d’échantillonnage externes sont également placés à l’extérieur de chaque cellule pour recueillir des informations de luminosité environnante
- Les valeurs lumineuses du vecteur d’échantillonnage externe assombrissent les composantes correspondantes du vecteur interne, ce qui renforce le contraste dans la direction des contours
- En élargissant l’échantillonnage externe pour étendre l’influence entre haut, milieu et bas, il devient possible d’obtenir des contours à la fois doux et nets
- Combiné au renforcement global du contraste, cela permet un rendu ASCII de scènes 3D aux contours marqués et très lisible
Optimisation des performances
- Comme répéter naïvement la recherche du plus proche voisin pour choisir un caractère est lent, un arbre k-d est utilisé pour accélérer la recherche dans un espace multidimensionnel
- Le caching permet de réutiliser les résultats obtenus pour un même vecteur d’échantillonnage
- Chaque vecteur est quantifié par unités de 5 bits afin de générer une clé de cache économe en mémoire
- Une plage fixée à 8 permet de maintenir un équilibre entre qualité et consommation mémoire
- Les recherches servies depuis le cache sont très rapides, et des milliers de caractères peuvent être traités en temps réel
- Le calcul des vecteurs d’échantillonnage est déplacé vers le GPU, où l’échantillonnage interne/externe et les opérations de renforcement du contraste sont traités dans le pipeline de shaders
- Des performances plusieurs fois supérieures à celles du CPU
Conclusion
- Cette approche qui quantifie la forme des caractères sous forme vectorielle améliore fortement la résolution et la netteté du rendu ASCII
- La méthode repose sur un concept proche des word embeddings, avec un potentiel d’application à d’autres problèmes visuels
- L’implémentation initiale était lente, mais l’accélération GPU, le caching et la recherche par arbre k-d permettent désormais d’obtenir un FPS fluide, même sur mobile
- Le rendu ASCII fondé sur la couleur n’a pas été abordé, mais l’auteur évoque la possibilité d’expérimenter à l’avenir d’autres combinaisons de formes et de contraste
- Le rendu ASCII ne se limite pas à un simple effet visuel : il montre aussi le potentiel extensible de la reconnaissance de formes et de la représentation vectorielle
Aucun commentaire pour le moment.