>_ DevTrendsnl

Taal

Home

Talen

Secties

Frontend Backend Mobiel DevOps AI / ML GameDev Blockchain Embedded Beveiliging
Python

Hoe je rommelige neurale netwerkgraphics omzet in perfecte pixelkunst

Iedereen die heeft geprobeerd pixelkunst te genereren via Midjourney, Stable Diffusion of ChatGPT komt vrijwel onmiddellijk hetzelfde probleem tegen. Het neurale netwerk tekent eerlijk kleine vierkanten, maar deze vierkanten zijn wiebelig. Soms is een pixel 11 schermpunten breed, soms 13, de diagonalen worden wazig en het rooster breekt schaamteloos. Simpelweg verkleinen via Nearest Neighbor of Bilinear werkt niet—de afbeelding verandert onmiddellijk in een rommelige verzameling artefacten.

De auteur van de perfectPixel-bibliotheek heeft dit wiskundige probleem opgelost zonder zware diffusie-hulpmiddelen, puur met klassieke computer vision-tools.

Waarom standaard formaat wijzigen niet werkt

Wanneer we naar een gegenereerde sprite kijken, lijkt er een duidelijk rooster te zijn. In werkelijkheid weten diffusiemodellen niets over discrete pixelcoördinaten. Ze tekenen een doorlopende afbeelding die visueel simpelweg lijkt op een retro-stijl.

Als gevolg krijgen we tegelijkertijd verschillende problemen:

  • De celgrootte varieert over het hele afbeeldingsgebied.
  • Pixelproporties zijn licht uitgerekt horizontaal of verticaal.
  • Randen zijn wazig door anti-aliasing, waardoor het onmogelijk is om precies te bepalen waar het ene blok eindigt en het andere begint.
  • De oorspronkelijke roosterresolutie is onduidelijk—was het 32×32 of 48×48.

De perfectPixel-bibliotheek neemt zo'n pseudo-pixelafbeelding (de auteur raadt aan om bronafbeeldingen tussen 512 en 1024 px te genereren) en zet deze automatisch om in een strikte, gelijkmatige pixelmatrix.

Hoe de pipeline onder de motorkap werkt

In plaats van nog een neuraal netwerk bovenop een neuraal netwerk te trainen, gebruikt het project klassieke signaalverwerking en breekt het probleem op in drie duidelijke stappen.

Ten eerste past de algoritme Fast Fourier Transform (FFT) toe op de bronafbeelding. Omdat pixels met een bepaalde periodiciteit herhalen, verschijnen er duidelijke pieken in het frequentiespectrum. Met behulp van deze pieken berekent de bibliotheek de fundamentele roosterstap, zelfs wanneer je het exacte aantal blokken in de sprite niet kent.

Vervolgens komt een Sobel-operator in het spel voor het detecteren van fysieke objectranden. Het rooster dat in de eerste stap is gevonden, wordt licht verschoven en uitgelijnd met echte kleurovergangen om de optische vervormingen van het neurale netwerk te compenseren.

In de laatste fase vindt kleurmonster name plaats binnen elke cel. Je kunt de centrale pixelkleur, mediaan of meest voorkomende tint (meerderheidsstemming) nemen, waardoor parasitaire kleurruis wordt geëlimineerd.

Installatieopties en uitvoering

Het project is geschreven in Python en biedt twee backends om uit te kiezen. Als snelheid belangrijk is, installeer dan de OpenCV-variant. Als je iets lichts nodig hebt zonder zware C-bibliotheken, is er een pure NumPy-implementatie beschikbaar.

Installatie via pip ziet er standaard uit:

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

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

In code neemt de hele verwerking letterlijk drie regels in beslag:

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 is een visueel voorbeeld uit de repository. Links is het generatieresultaat van een ChatGPT-prompt, rechts is het verwerkte resultaat na het doorlopen van de bibliotheek.

Het rooster viel op zijn plaats, fractionele pixels verdwenen en de afbeelding kan nu worden geëxporteerd als 1x PNG voor een game-engine of thermomozaiëk-patronen.

Fijnafstemming en integratie

Als de automatisering de frequentie verkeerd heeft of de kunst te veel kleine details heeft, kan de functie worden aangepast met argumenten:

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                # Показ графиков работы алгоритма
)

Voor degenen die generatie-pipelines bouwen in ComfyUI, heeft de auteur een aangepaste node gemaakt. Dit maakt het mogelijk om rooster-kwantisatie direct aan het einde van de diffusiegrafiek te integreren, wat schone assets produceert zonder handmatige nabewerking in grafische editors.

Je kunt de algoritme rechtstreeks in de browser uitproberen voordat je installeert op de webdemo-pagina.

Voor wie is dit nuttig

Het project pakt een specifiek pijnpunt aan voor indie-ontwikkelaars en artiesten die proberen generatieve kunst te gebruiken in 2D-games. Het tekent de sprite niet opnieuw vanaf nul—het repareert zorgvuldig de wiskundige gebreken van diffusie, wat uren handmatig bewerken in Aseprite bespaart.

Als je texturen, inventarisiconen of charactersprites genereert en het beu bent om wazige randen op te ruimen, verdient perfectPixel zeker een plek in je lokale build-pipeline.

Gerelateerde projecten