>_ DevTrendsfr

Langue

Accueil

Langages

Sections

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embarqué Sécurité
Python

Comment transformer des graphiques de réseaux neuronaux désordonnés en pixel art parfait

Quiconque a essayé de générer du pixel art via Midjourney, Stable Diffusion ou ChatGPT s'est presque immédiatement heurté au même problème. Le réseau neuronal dessine honnêtement de petits carrés, mais ces carrés sont instables. Quelque part un pixel fait 11 points d'écran de large, quelque part 13, les diagonales deviennent floues et la grille se brise sans vergogne. Réduire simplement une telle image par Nearest Neighbor ou Bilinear ne fonctionne pas—l'image se transforme instantanément en un désordre d'artefacts.

L'auteur de la bibliothèque perfectPixel a résolu ce problème mathématique sans béquilles de diffusion lourdes, purement avec des outils classiques de vision par ordinateur.

Pourquoi le redimensionnement standard ne fonctionne pas

Quand nous regardons un sprite généré, il semble qu'il y ait une grille claire. En réalité, les modèles de diffusion ne connaissent rien aux coordonnées de pixels discrètes. Ils dessinent une image continue qui ressemble visuellement à un style rétro.

En résultat, nous obtenons plusieurs problèmes à la fois :

  • La taille des cellules varie dans toute la zone de l'image.
  • Les proportions des pixels sont légèrement étirées horizontalement ou verticalement.
  • Les bords sont floutés par l'anticrénelage, rendant impossible la détermination précise de où un bloc se termine et un autre commence.
  • La résolution originale de la grille n'est pas claire—était-ce 32×32 ou 48×48.

La bibliothèque perfectPixel prend une telle image pseudo-pixel (l'auteur recommande de générer des images sources entre 512 et 1024 px) et la convertit automatiquement en une matrice de pixels stricte et uniforme.

Comment le pipeline fonctionne en coulisses

Au lieu d'entraîner un autre réseau neuronal sur un réseau neuronal, le projet utilise le traitement classique du signal et décompose le problème en trois étapes claires.

Premièrement, l'algorithme applique la Transformée de Fourier Rapide (FFT) à l'image source. Comme les pixels se répètent avec une certaine périodicité, des pics distincts apparaissent dans le spectre de fréquence. En utilisant ces pics, la bibliothèque calcule le pas fondamental de la grille, même quand vous ne connaissez pas le nombre exact de blocs dans le sprite.

Ensuite, un opérateur de Sobel entre en jeu pour détecter les limites physiques des objets. La grille trouvée à la première étape est légèrement décalée et alignée sur les réels bords de transition de couleur pour compenser les distorsions optiques du réseau neuronal.

À l'étape finale, l'échantillonnage des couleurs se produit dans chaque cellule. Vous pouvez prendre la couleur du pixel central, la médiane, ou la nuance la plus fréquente (vote majoritaire), éliminant ainsi le bruit coloré parasite.

Options d'installation et exécution

Le projet est écrit en Python et propose deux backends au choix. Si la vitesse est importante, installez la variante OpenCV. Si vous avez besoin de quelque chose de léger sans lourdes bibliothèques C, une implémentation pure NumPy est disponible.

L'installation via pip est standard :

# Быстрая версия с OpenCV
pip install perfect-pixel[opencv]

# Легковесная версия только на NumPy
pip install perfect-pixel

En code, l'ensemble du traitement prend littéralement trois lignes :

import cv2
from perfect_pixel import get_perfect_pixel

# Читаем исходный сгенерированный арт
bgr = cv2.imread("images/avatar.png", cv2.IMREAD_COLOR)
rgb = cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)

# На выходе получаем ширину, высоту и готовую чистую матрицу
w, h, out = get_perfect_pixel(rgb)

Voici un exemple visuel du dépôt. À gauche se trouve le résultat de génération d'une invite ChatGPT, à droite le résultat traité après passage dans la bibliothèque.

La grille s'est mise en place, les pixels fractionnaires ont disparu et l'image peut maintenant être exportée en PNG 1x pour un moteur de jeu ou des motifs thermomosaïques.

Ajustement fin et intégration

Si l'automatisation a mal détecté la fréquence ou que l'art contient trop de petits détails, la fonction peut être ajustée avec des arguments :

w, h, out = get_perfect_pixel(
    rgb,
    sample_method="majority",  # Способ выборки цвета: center, median или majority
    grid_size=(32, 32),        # Принудительный размер сетки, если автодетект не нужен
    refine_intensity=0.2,      # Диапазон сдвига линий сетки к краям Собеля
    fix_square=True,           # Принудительно делать пиксели квадратными
    debug=False                # Показ графиков работы алгоритма
)

Pour ceux qui construisent des pipelines de génération dans ComfyUI, l'auteur a créé un nœud personnalisé. Cela permet d'intégrer la quantification de grille directement à la fin du graphe de diffusion, produisant des assets propres sans post-traitement manuel dans les éditeurs graphiques.

Vous pouvez essayer l'algorithme directement dans le navigateur avant l'installation sur la page de démo web.

À qui cela sera utile

Le projet répond à un problème spécifique pour les développeurs indépendants et les artistes qui tentent d'utiliser l'art génératif dans les jeux 2D. Il ne redessine pas le sprite de zéro—il corrige soigneusement les défauts mathématiques de la diffusion, économisant des heures d'édition manuelle dans Aseprite.

Si vous générez des textures, des icônes d'inventaire ou des sprites de personnages et que vous en avez assez de nettoyer les bords flous, perfectPixel mérite définitivement une place dans votre pipeline de build local.

Projets similaires