Утиліта для конвертації зображення у ASCII анімацію

Утиліта для конвертації зображення у ASCII анімацію

У звичайному ASCII art втрачається багато деталей. Але в анімації кожен наступний кадр коригує помилку попередніх — і зображення виходить набагато детальнішим.

Порівняння звичайного ASCII art і ASCII анімації

Просто погляньте на різницю між статичним зображенням і анімацією. На зображенні зліва направо: оригінал, один кадр ASCII art (оптимізація за PSNR яскравості), один кадр з анімації і вся анімація. Вражає, наскільки анімоване зображення близьке до оригіналу і точно передає усі деталі. Цього неможливо досягти статичним ASCII art.

Що цікаво, під час роботи над проектом я додав безліч можливостей. Була оптимізація за градієнтом, за яскравістю; розрахунок похибки за PSNR, SSIM та ін. Намагався додати адаптивний підбір параметрів, тому що були великі стрибки яскравості, причому різні залежно від способу обчислення похибки. Були різні шрифти, зі згладжуванням і без. Була і українська абетка, і японська. В японській символи мають більше заповнення, і взагалі вона з матриці, пасує до зеленого кольору.

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

Залишив дві опції: відстань між символами та зміщення символів.

Відстань між символами

ASCII art з відстанями між символами і без

Зліва без відстані між символами, справа в один піксель. Перший рядок без анімації. Другий рядок з тайлінгом. Третій без тайлінгу.

Відстань між символами я залишив конфігурованою, тому що не всім сподобається ASCII art без відстаней між символами. Але без відстані між ними значно краще виходить — тому що символи мають дуже "рідке" заповнення, і важко досягти нормальної яскравості, коли більшість пікселів майже весь час чорні.

Зсув кадрів чи тайлінг

Якщо зсувати кожен наступний кадр відносно попереднього, то в анімації можна досягти більш рівномірної похибки для кожного пікселя. Тому що пікселі в символах, звісно, не рівномірно розподілені. Гляньте на останній рядок анімації вище. Без тайлінгу результат все ж гірший. Але якщо комусь хочеться - welcome.

Метрика оптимізації і алгоритм підбору

Якщо комусь цікаво, то я використовую brute force: просто перебираю кожен символ і оцінюю за метрикою, який підійде краще. Метрика - попіксельний PSNR від яскравості. Помилки усіх попередніх кадрів додаються до поточного, тому, наприклад, сірий буде намагатися 50/50 випадків бути засвіченим або ні.

Великим недоліком є те, що не враховується градієнт, і взагалі генератор не розрізняє кольори. Два різних кольори однакової яскравості будуть зображені однаково. Для отримання гарної анімації потрібне оригінальне зображення з контрастними градієнтами, як в мене на прикладах - все обведено чорною розділовою лінією. Хоча загалом не обовʼязково.

Фотографія Lenna.jpg

Ось приклад з фотографією. Волосся взагалі все злилося, тому що воно темне і з низькою контрастністю, але пірʼя чудово деталізовано, тому що контрастність достатня.

Спробуйте самі →

Коментарі