ГоловнаСтаттіГенеративне мистецтво

Обчислювальне фотомистецтво: ASCII, Крапування та Джиттер Пояснено

Від наборів символів, відсортованих за люмінансом, до зваженого Voronoi крапування та Floyd-Steinberg диффузійного джиттера — як фотографія стає алгоритмічним мистецтвом.

mysimulator teamОновлено — червень 2026≈ 8 хв читання▶ Відкрити симуляцію

Кожна техніка починається з однієї й тієї ж кількості: яскравість

Під ASCII-мистецтвом, фотомозаїками, стіплінгом та дітрюінгом є один перший крок: зменшити колірний піксель до одного значення яскравості. Око значно чутливіше до зеленого кольору, ніж до червоного або синього, тому наївне середнє з трьох каналів виглядає неправильно — стандартна формула нерівномірно їх вагує, приблизно як L = 0.299R + 0.587G + 0.114B (коефіцієнти яскравності ITU-R BT.601, що використовуються у телевізійному вещанні). Кожен алгоритм нижче працює з цим одним отриманим каналом і окремо вирішує, як відображати кожне значення яскравості як чорнило, точки або символи.

жива демонстрація · пов'язана симуляція● LIVE

ASCII-графіка: ранжування символів за площю пофарбування

Конвертер ASCII не намагається відповідати формам літер до ознак зображення — він порівнює площу пофарбування. Кожен кандидатський символ рендериться у невеликий бітмап, підраховується частка темних пікселів і набір символів сортується за цим показником: пробіл має нульове покриття, крапка — трохи, а @ або # майже повне покриття. Потім середній рівень яскравості кожного пікселя відображається на цей ранжований список. Оскільки шрифти фіксованого кроку приблизно вдвічі вищі за ширину, комірки зазвичай зражуються як прямокутники замість квадратів, щоб вихід не виглядав вертикально стиснутим.

Фотомозаїки: найближчий сусід у просторі кольорів

Фотомозаїка замінює кожен елемент вихідного зображення невеликим мініатюрним зображенням, обраним з бібліотеки та підібраним відповідно до середнього RGB кольору цього елемента. Обчислення середнього RGB для кожної мініатюрної бібліотечної картинки виконуються один раз, а потім для кожного елемента цільової мозаїки проводиться пошук найближчого сусіда у цьому просторі кольорів. Часто використовується поліпшення, яке змішує прозорий шар кольору оригінального елемента поверх обраного мініатюрного зображення – це наближає мініатюрне зображення до точного цільового кольору та приховує видимі шви між елементами, які є лише приблизними відповідностями.

Точкове тиснення: Алгоритм Ллойда робить точки схожими на намальовані вручну

Зважене Voronoi тиснення (Secord, 2002) розкидує точки з щільністю, пропорційною яскравості зображення, а потім повторно їх пом’якшує: будується діаграма Voronoi поточних точок, кожна точка переміщується до центроїда темряви-зваженої її власної комірки, і це повторюється.

Повторити N разів: cells = voronoi(points) для кожної комірки c, точки p в cells: p.x, p.y = weighted_centroid(c, darkness_field) // Алгоритм Ллойда Це алгоритм Ллойда, ітеративне пом’якшення, яке використовується для побудови центроїдальних Voronoi укладень для генерації сіток та кластеризації k-means. Після кількох ітерацій точки розсіюються в патерн, схожий на шумову сітку блакитного кольору — рівномірно розташовані без видимих грудочок або вирівнювання по сітці, одночасно концентруючись там, де зображення темне, що точно робить художник-гравюрник, дивлячись на очі, своїм зором.

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

Дітування: Дисперсія Флойд-Штейнера

Зменшення зображення до двох тонів (чистий чорний та білий) шляхом простого округлення кожного пікселя руйнує середні тони. Дисперсія Флойд-Штейнера (1976) вирішує цю проблему, розглядаючи округлення як втрату та переносячи її вперед: після квантизації пікселя різниця між його справжньою вартістю та використаною вартістю розподіляється серед не оброблених сусідніх пікселів з фіксованими ваговими коефіцієнтами.

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 Сканування зліва направо, зверху вниз, переносить кожний піксель 16 шістнадцятих частин помилки округлення, таким чином не створюючи та не знищуючи жодної помилки – лише перерозподіляючи її, і локальна середня яскравість збігається зі справжньою. Замовлене дітування (фіксованої матриці Bayer-ового порогу, що укладена на зображенні) є альтернативою: швидше та без залежності від послідовності, але воно дає видиму періодичну структуру замість органічного вигляду шуму, який забезпечує дисперсія Флойд-Штейнера.

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

Чому джитлінг Флойда-Стейнберга виглядає краще, ніж просто округлення кожного пікселя?

Округлення кожного пікселя незалежно призводить до втрати інформації — піксель, який повинен бути 40% сірим, стає або повністю чорним, або повністю білим, не маючи жодного запам’ятовування про 40%. Розповсюдження помилок передає цю зайву 40% (або -60%) в сусідні пікселі, таким чином зберігаючи середню яскравість будь-якої області, незважаючи на те, що кожен окремий піксель є чимось чорним або білим.

Як стиплінг відрізняється від простого розкидання випадкових крапок за яскравістю?

Наївне випадкове розміщення кластеризує крапки через випадковість, що читається як шум, а не тональність. Зважене стиплінг за алгоритмом Вороного розслабляє положення крапок таким чином, щоб кожна крапка знаходилася в центріоїді власної зваженої комірки — це вирівнює розподіл (якщо це стосується блакитного шуму), а щільність крапок все ще відстежує темряву зображення, що робить його схожим на малюнок від руки, а не випадковим.

Чому перетворювачі ASCII-арту використовують щільність символів замість фактичних форм літер?

Оскільки при відстані та розмірі шрифта ASCII-арт зазвичай сприймається, око читає покриття — скільки чорнила виділяє символ у своїй комірці — а не окремі форми літер. Рейтинговування набору символів за середнім піксельним покриттям (пробіл, потім розділові знаки, потім літери, потім символи, як @ і #) та відображення яскравості на цьому рейтингу відтворює тональні градієнти вірно, що само по собі не змогло б зробити формальне збігання.

Спробуйте наживо

Усе, що вище, працює прямо у вашому браузері — відкрийте Computational Photo Art і змінюйте параметри під час роботи. Нічого не встановлюється, нічого не завантажується на сервер, уся модель живе в одній вкладці.

▶ Відкрити симуляцію Computational Photo Art

Що ви знайшли?

Додати кроки відтворення (опційно)