2 points par GN⁺ 2026-01-18 | Aucun commentaire pour le moment. | Partager sur WhatsApp
  • 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.

Aucun commentaire pour le moment.