Wie man chaotische neuronale Netzwerkgrafiken in perfekte Pixelkunst verwandelt
Jeder, der versucht hat, Pixelkunst mit Midjourney, Stable Diffusion oder ChatGPT zu generieren, ist fast sofort auf dasselbe Problem gestoßen. Das neuronale Netz zeichnet ehrlich kleine Quadrate, aber diese Quadrate sind wackelig. Irgendwo ist ein Pixel 11 Bildschirmpunkte breit, irgendwo 13, die Diagonalen werden unscharf und das Raster bricht schamlos. Eine einfache Verkleinerung solch eines Bildes durch Nearest Neighbor oder Bilinear funktioniert nicht – das Bild wird sofort zu einem Chaos von Artefakten.
Der Autor der perfectPixel-Bibliothek hat dieses mathematische Problem ohne aufwendige Diffusionsumwege gelöst, rein mit klassischen Computer-Vision-Werkzeugen.
Warum Standard-Größenänderung nicht funktioniert
Wenn wir ein generiertes Sprite betrachten, scheint es, als gäbe es ein klares Raster. In Wirklichkeit wissen Diffusionsmodelle nichts über diskrete Pixelkoordinaten. Sie zeichnen ein kontinuierliches Bild, das einfach visuell einem Retro-Stil ähnelt.
Als Ergebnis erhalten wir mehrere Probleme auf einmal:
- Die Zellgröße variiert über den gesamten Bildbereich.
- Die Pixelproportionen sind leicht horizontal oder vertikal gestreckt.
- Kanten werden durch Anti-Aliasing unscharf, was es unmöglich macht, genau zu bestimmen, wo ein Block endet und ein anderer beginnt.
- Die ursprüngliche Rasterauflösung ist unklar – war es 32×32 oder 48×48.
Die perfectPixel-Bibliothek nimmt ein solches Pseudo-Pixel-Bild (der Autor empfiehlt, Quellbilder zwischen 512 und 1024 px zu generieren) und konvertiert es automatisch in eine strikte, gleichmäßige Pixelmatrix.
So funktioniert die Pipeline unter der Haube
Statt ein weiteres neuronales Netzwerk auf ein neuronales Netzwerk zu trainieren, verwendet das Projekt klassische Signalverarbeitung und teilt das Problem in drei klare Schritte auf.
Zuerst wendet der Algorithmus die Fast Fourier Transform (FFT) auf das Quellbild an. Da sich Pixel mit einer bestimmten Periodizität wiederholen, erscheinen deutliche Peaks im Frequenzspektrum. Mit diesen Peaks berechnet die Bibliothek den fundamentalen Rasterschritt, selbst wenn man die genaue Anzahl der Blöcke im Sprite nicht kennt.
Als nächstes kommt ein Sobel-Operator zum Einsatz, um physikalische Objektgrenzen zu erkennen. Das im ersten Schritt gefundene Raster wird leicht verschoben und an reale Farbübergangskanten angepasst, um die optischen Verzerrungen des neuronalen Netzwerks zu kompensieren.
In der letzten Phase erfolgt die Farbabtastung innerhalb jeder Zelle. Man kann die zentrale Pixelfarbe, den Median oder die am häufigsten vorkommende Schattierung nehmen (Mehrheitsentscheidung), um parasitäres Farbrauschen zu eliminieren.
Installationsoptionen und Ausführung
Das Projekt ist in Python geschrieben und bietet zwei Backends zur Auswahl. Wenn Geschwindigkeit wichtig ist, installiere die OpenCV-Variante. Wenn du etwas Leichtgewichtiges ohne schwere C-Bibliotheken brauchst, ist eine reine NumPy-Implementierung verfügbar.
Die Installation über pip sieht Standard aus:
# Быстрая версия с OpenCV
pip install perfect-pixel[opencv]
# Легковесная версия только на NumPy
pip install perfect-pixel
Im Code nimmt die gesamte Verarbeitung buchstäblich drei Zeilen ein:
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)
Hier ist ein visuelles Beispiel aus dem Repository. Links ist das Generierungsergebnis aus einem ChatGPT-Prompt, rechts ist das verarbeitete Ergebnis nach dem Durchlauf durch die Bibliothek.
![]()
Das Raster hat sich eingefügt, gebrochene Pixel sind verschwunden und das Bild kann jetzt als 1x PNG für eine Spiel-Engine exportiert werden.
Feintuning und Integration
Wenn die Automatisierung die Frequenz falsch ermittelt hat oder die Kunst zu viele kleine Details enthält, kann die Funktion mit Argumenten angepasst werden:
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 # Показ графиков работы алгоритма
)
Für diejenigen, die Generierungs-Pipelines in ComfyUI aufbauen, hat der Autor einen benutzerdefinierten Node erstellt. Dies ermöglicht die Integration der Raster-Quantisierung direkt am Ende des Diffusionsgraphen und erzeugt saubere Assets ohne manuelle Nachbearbeitung in Grafik-Editoren.
Du kannst den Algorithmus direkt im Browser ausprobieren, bevor du ihn installierst, auf der Web-Demo-Seite.
Wem dies nützlich sein wird
Das Projekt adressiert einen spezifischen Schmerzpunkt für Indie-Entwickler und Künstler, die generative Kunst in 2D-Spielen verwenden möchten. Es zeichnet den Sprite nicht von Grund auf neu – es korrigiert sorgfältig die mathematischen Mängel der Diffusion und spart Stunden manueller Bearbeitung in Aseprite.
Wenn du Texturen, Inventarsymbole oder Charaktersprites generierst und es leid bist, unscharfe Kanten zu bereinigen, verdient perfectPixel definitiv einen Platz in deiner lokalen Build-Pipeline.
Ähnliche Projekte