Każda technika zaczyna się od tej samej liczby: jasność
Pod ASCII artem, photomosaikami, stipplingiem i ditheringiem jest to zawsze pierwszy krok: redukcja piksela koloru do pojedynczej wartości jasności. Oko jest znacznie bardziej wrażliwe na zielony niż na czerwony lub niebieski, dlatego naiwne uśrednianie trzech kanałów wygląda nieprawidłowo – standardowa formuła niemiłosiernie je odchyla, zbliżając się do L = 0.299R + 0.587G + 0.114B (współczynniki jasności ITU-R BT.601 używane w transmisji telewizyjnej). Każdy poniżej algorytm operuje na tym pojedynczym wyznaczonym kanale, a następnie oddzielnie decyduje, jak reprezentować każdą wartość jasności jako atrament, kropek lub znaków.
Sztuka ASCII: ranking znaków według pokrycia tuszem
Konwerter ASCII nie próbuje dopasowywać kształt liter do cech obrazu — dopasowuje pokrycie tuszem. Każdy kandydat na znak jest renderowany jako mały bitmap, liczy się ułamek pikseli ciemnych i zestaw znaków jest sortowany według tego ułamka: spacja ma zerowe pokrycie, kropka trochę, a @ lub # prawie pełne pokrycie. Następnie średnie luminancje każdej komórki obrazu są mapowane na tę posortowaną listę. Ponieważ czcionki monospace są w przybliżeniu dwa razy wyższe niż szerokie, komórki są zazwyczaj próbkowane jako prostokąty zamiast kwadratów, aby wynik nie wyglądał wklęsło pionowo.
Fotomosaiki: najbliższy sąsiad w przestrzeni kolorów
Fotomosaika zastępuje każdy tile (element) obrazu źródłowego małym miniaturką wybraną z biblioteki, dobraną tak, aby pasowała do średniego koloru tego tile'a. Obliczanie średnich RGB dla wszystkich elementów bibliotecznych należy wykonać raz, a następnie dla każdego tile'a w obrazie docelowym należy przeprowadzić wyszukiwanie najbliższego sąsiada w tej przestrzeni kolorów. Często stosowaną metodą poprawy jest mieszanie przezroczystej warstwy koloru oryginalnego tile'a z wybraną miniaturką – to zbliża miniaturkę do dokładnego koloru celu i ukrywa widoczne szczeliny między elementami, które są tylko przybliżonym dopasowaniem.
Stippling: Algorytm Lloyda sprawia, że kropki wyglądają jak narysowane ręką
Ważone stippling Voronoi (Secord, 2002) rozrzuca punkty z gęstością proporcjonalną do jasności obrazu, a następnie wielokrotnie je relaksuje: buduje diagram Voronoi dla aktualnych punktów, przesuwa każdy punkt do ciemnosciowo ważonego centroida swojej komórki i powtarza.
Powtórz N razy: komórki = voronoi(punkty) dla każdej komórki c, punktu p w komórkach: p.x, p.y = weighted_centroid(c, pole_ciemnosci) // Relaksacja Lloyda Jest to algorytm Lloyda, ta sama iteracyjna relakswacja używana do budowy centroidalnych tesselațiilor Voronoi dla generowania siatki i k-means clustering. Po kilku iteracjach punkty rozkładają się w wzorzec przypominający szum niebieski – równomiernie rozmieszczone bez widocznego zlepiania lub wyrównania siatki, a jednocześnie koncentrują się tam, gdzie obraz jest ciemny, co dokładnie robi artysta stippling z piórkiem i tuszem, patrząc na oko.
repeat N times:
cells = voronoi(points)
for each cell c, point p in cells:
p.x, p.y = weighted_centroid(c, darkness_field) // Lloyd relaxation
Rozmycie: Dystytucja Floyd-Steinberga
Redukcja obrazu do dwóch tonów (czysty czarny i biały) poprzez proste zaokrąglenie każdego piksela niszczy odcienie pośrednie. Dystytucja Floyd-Steinberga (1976) rozwiązuje ten problem, traktując zaokrąglenie jako stratę i przekazując tę stratę dalej: po kwantyzacji piksela, różnica między jego rzeczywistą wartością a używaną wartością jest rozkładana na sąsiadujące, nieprzetworzone piksele z ustalonymi wagami.
old = pixel[x][y] new = round_to_palette(old) pixel[x][y] = new err = old - new pixel[x+1][y ] += err * 7/16 pixel[x-1][y+1] += err * 3/16 pixel[x ][y+1] += err * 5/16 pixel[x+1][y+1] += err * 1/16 Przeskanowane od lewej do prawej, od góry do dołu, to rozprasza 16 szmigrzelek błędu za każdy piksel, więc żaden błąd nie jest tworzony ani niszczony – tylko przekształcany – a średnia jasność lokalna zbliża się do oryginalnej. Alternatywą jest uporządkowana dystytucja (stała macierz progowa Bayer ułożona w regularny wzór na całym obrazie), która jest szybsza i nie wymaga zależności sekwencyjnej, ale generuje widoczny okresowy wzorzec zamiast organicznie wyglądającego szumu dystytucji rozpraszania błędów.
old = pixel[x][y] new = round_to_palette(old) pixel[x][y] = new err = old - new pixel[x+1][y ] += err * 7/16 pixel[x-1][y+1] += err * 3/16 pixel[x ][y+1] += err * 5/16 pixel[x+1][y+1] += err * 1/16
Frequently asked questions
Dlaczego dithering Floyd-Steinberga wygląda lepiej niż po prostu zaokrąglanie każdego piksela?
Samodzielne zaokrąglanie każdego piksela do najbliższego dostępnego odcienia powoduje utratę informacji – piksel, który powinien być na 40% szary, staje się albo czarny, albo biały bez żadnej pamięci o tym 40%. Rozpraszanie błędów przenosi ten nadmiarowy 40% (lub -60%) do sąsiednich pikseli, dzięki czemu średni jasność w dowolnym obszarze jest zachowany, mimo że każdy indywidualny piksel jest czarny lub biały.
Jakie jest różnicowe stippling w porównaniu z po prostu losowym rozrzutem kropek według jasności?
Prymitywne losowe rozmieszczanie kropki powoduje ich zagęszczenie przypadkiem, co postrzegane jest jako szum zamiast tonalność. Stippling z wykorzystaniem ważonych Voronoi relaksuje pozycje kropek przy użyciu algorytmu Lloyda, tak aby każda kropka znajdowała się w centroidzie własnej ważonej komórki – to wyrównuje rozmieszczenie (jak przypominające szum niebieski) a gęstość kropel nadal śledzi ciemność obrazu, co sprawia, że wygląda jak narysowany ręcznie zamiast losowo.
Dlaczego konwertery ASCII art wykorzystują gęstość znaków zamiast rzeczywistych kształtów liter?
Ponieważ przy danej odległości i rozmiarze czcionki, oko czyta pokrycie – ile tuszu umieszcza znak w swojej komórce – a nie indywidualne formy liter. Klasyfikowanie zestawu znaków według średniej gęstości pikselowej (przestrzeń, następnie znaki interpunkcyjne, następnie litery, a na końcu symbole takie jak @ i #) oraz mapowanie jasności na tę listę pozwala wiernie odtworzyć gradienty tonalne, co samo dopasowywanie kształtów nie byłoby w stanie.
Wypróbuj na żywo
Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Computational Photo Art i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.
▶ Otwórz symulację Computational Photo Art