Jak zamienić chaotyczną grafikę sieci neuronowych w idealny pixel art
Każdy, kto próbował generować pixel art za pomocą Midjourney, Stable Diffusion czy ChatGPT, niemal od razu napotykał ten sam problem. Sieć neuronowa szczerze rysuje małe kwadraty, ale te kwadraty są niestabilne. Gdzieś piksel ma 11 kropek ekranu szerokości, gdzieś 13, przekątne robią się rozmyte, a siatka bezwstydnie się łamie. Po prostu zmniejszenie takiego obrazu metodą Nearest Neighbor czy Bilinear nie zadziała—obraz natychmiast zamienia się w chaos artefaktów.
Autor biblioteki perfectPixel rozwiązał ten matematyczny problem bez ciężkich rozwiązań opartych na dyfuzji, czysto za pomocą klasycznych narzędzi wizji komputerowej.
Dlaczego standardowe skalowanie nie działa
Kiedy patrzymy na wygenerowanego sprite'a, wydaje się, że jest tam wyraźna siatka. W rzeczywistości modele dyfuzyjne nic nie wiedzą o dyskretnych współrzędnych pikseli. Rysują ciągły obraz, który po prostu wizualnie przypomina styl retro.
W rezultacie otrzymujemy jednocześnie kilka problemów:
- Rozmiar komórki różni się w całym obszarze obrazu.
- Proporcje pikseli są lekko rozciągnięte w poziomie lub pionie.
- Krawędzie są rozmyte przez anty-aliasing, co uniemożliwia precyzyjne określenie, gdzie kończy się jeden blok, a zaczyna następny.
- Oryginalna rozdzielczość siatki jest niejasna—czy to było 32×32, czy 48×48.
Biblioteka perfectPixel pobiera taki pseudopikselowy obraz (autor zaleca generowanie obrazów źródłowych o rozmiarze od 512 do 1024 px) i automatycznie konwertuje go na ścisłą, równą macierz pikseli.
Jak działa potok przetwarzania pod maską
Zamiast trenować kolejną sieć neuronową na szczycie sieci neuronowej, projekt wykorzystuje klasyczne przetwarzanie sygnałów i dzieli problem na trzy wyraźne kroki.
Najpierw algorytm stosuje szybką transformatę Fouriera (FFT) do obrazu źródłowego. Ponieważ piksele powtarzają się z pewną okresowością, w widmie częstotliwości pojawiają się wyraźne szczyty. Wykorzystując te szczyty, biblioteka oblicza podstawowy krok siatki, nawet gdy nie znasz dokładnej liczby bloków w sprite'cie.
Następnie w grę wchodzi operator Sobela do wykrywania fizycznych granic obiektów. Siatka znaleziona w pierwszym kroku jest lekko przesunięta i wyrównana do rzeczywistych krawędzi przejść kolorów, aby skompensować optyczne zniekształcenia sieci neuronowej.
Na końcowym etapie następuje próbkowanie kolorów w każdej komórce. Możesz wziąć kolor centralnego piksela, medianę lub najczęściej występujący odcień (głosowanie większościowe), eliminując pasożytniczy szum kolorów.
Opcje instalacji i uruchamiania
Projekt jest napisany w Pythonie i oferuje dwa backendy do wyboru. Jeśli ważna jest szybkość, zainstaluj wariant z OpenCV. Jeśli potrzebujesz czegoś lekkiego bez ciężkich bibliotek C, dostępna jest implementacja czysto w NumPy.
Instalacja przez pip wygląda standardowo:
# Быстрая версия с OpenCV
pip install perfect-pixel[opencv]
# Легковесная версия только на NumPy
pip install perfect-pixel
W kodzie całe przetwarzanie zajmuje dosłownie trzy linie:
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)
Oto wizualny przykład z repozytorium. Po lewej stronie wynik generacji z promptu ChatGPT, po prawej przetworzony wynik po przepuszczeniu przez bibliotekę.
![]()
Siatka wskoczyła na miejsce, zniknęły ułamkowe piksele, a obraz można teraz wyeksportować jako 1x PNG do silnika gry lub kafelków.
Drobna konfiguracja i integracja
Jeśli automatyzacja źle wykryła częstotliwość lub grafika ma zbyt wiele drobnych detali, funkcję można dostosować za pomocą argumentów:
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 # Показ графиков работы алгоритма
)
Dla tych, którzy budują potoki generacji w ComfyUI, autor stworzył niestandardowy węzeł. Umożliwia to integrację kwantyzacji siatki bezpośrednio na końcu grafu dyfuzji, produkując czyste assety bez ręcznego post-processingu w edytorach graficznych.
Możesz wypróbować algorytm bezpośrednio w przeglądarce przed instalacją na stronie demo.
Dla kogo to będzie przydatne
Projekt dotyczy konkretnego problemu dla niezależnych deweloperów i artystów próbujących wykorzystać generatywną grafikę w grach 2D. Nie przerysowuje sprite'a od nowa—starannie naprawia matematyczne wady dyfuzji, oszczędzając godziny ręcznej edycji w Aseprite.
Jeśli generujesz tekstury, ikony ekwipunku lub sprite'y postaci i masz dość czyszczenia rozmytych krawędzi, perfectPixel zdecydowanie zasługuje na miejsce w Twoim lokalnym potoku budowania.
Powiązane projekty