Как сделать пиксельный аватар: разбираем простой алгоритм на Python

Исходная фотография by Yang on Unsplash + Пример работы алгоритма (64x64)
Исходная фотография by Yang on Unsplash + Пример работы алгоритма (64x64)

= Введение =

Популярность пиксель-арта и ретро-эстетики среди современных пользователей и разработчиков обусловлена многими факторами. Это и перегрузка «высокими» технологиями, и ностальгия по времени без огромного количества гаджетов, и стремление к лаконичности в эпоху избыточного визуального контента. Стандартные качественные фотографии в профилях соцсетей кажутся скучными и часто уступают место стилизованным графическим аватарам. Стилистика lo-fi, визуальные решения классических восьмибитных игр и мир Minecraft формируют желание кастомизации своего цифрового пространства. И это не просто упрощение, а, наоборот, интересная персонализация. Такой подход может превратить обычный юзерпик в уникальный код цифровой идентичности, выделяя пользователя в бесконечной ленте медиафайлов.

В этой статье рассмотрим минималистичный Python-скрипт, который превращает любое селфи или картинку в 16-цветный пиксель-арт. Данный подход демонстрирует практическое применение базовых алгоритмов двумерной графики и матричных преобразований, интегрированных в программный код на языке Python и решает задачу стилизации без графических редакторов. Инструмент автоматизирует обрезку, масштабирование и редукцию цветовой палитры входного файла.

= Основная часть =

Процесс трансформации растрового изображения высокого разрешения в пикселизированную графику состоит из последовательности математических и алгоритмических операций. Для реализации этого алгоритма используется специализированная библиотека для работы с графикой — Pillow (PIL). Для запуска скрипта понадобится предустановленный интерпретатор Python и эта библиотека Pillow. Установить ее в систему можно одной командой:

pip install Pillow
pip install Pillow

Шаг №1 Импорт необходимых модулей из библиотеки Pillow (имя в Python - PIL)

Первым шагом импортируем из библиотеки Pillow необходимые модули:

Импорт необходимых модулей: Image нужен для загрузки, обрезки, изменения размера и сохранения картинок. ImageEnhance отвечает за регулировку параметров цвета и контраста.
Импорт необходимых модулей: Image нужен для загрузки, обрезки, изменения размера и сохранения картинок. ImageEnhance отвечает за регулировку параметров цвета и контраста.

Шаг №2 Загрузка исходного файла в память программы

Затем загружаем в программу файл (исходное изображение), которое будет обрабатываться:

Файл с именем photo.jpg должен лежать в той же папке, что и этот скрипт. Имя и расширение картинки должно в точности совпадать с именем и расширением картинки в папке (здесь название photo.jpg).
Файл с именем photo.jpg должен лежать в той же папке, что и этот скрипт. Имя и расширение картинки должно в точности совпадать с именем и расширением картинки в папке (здесь название photo.jpg).

Шаг №3 Кадрирование фотографии (обрезка до квадрата)

Третьим шагом является центрирование и приведение исходного кадра к квадратному формату. Такое форматирование важно для корректного отображения аватаров в круглых или квадратных контейнерах большинства пользовательских интерфейсов. Алгоритм вычисляет минимальную сторону изображения, определяет координаты центральной области и производит операцию кадрирования, исключая лишние пиксели по краям. Безусловно, важным условием при этом методе является предположение, что главный объект съемки находится строго по центру кадра. Если лицо на исходной фотографии смещено к краю, стандартный геометрический алгоритм срежет его. Эту задачу можно решить подключением нейросетевых моделей компьютерного зрения для динамического поиска координат лица, однако в рамках этой статьи предполагается ручной выбор центрированных снимков.

Сначала считываем ширину и высоту исходного изображения в пикселях.
Сначала считываем ширину и высоту исходного изображения в пикселях.
Находим длину самой короткой стороны, чтобы сделать квадрат по ней.
Находим длину самой короткой стороны, чтобы сделать квадрат по ней.
Вычисляем координаты для обрезки, чтобы квадрат оказался ровно по центру кадра (предполагается выбор исходника с главным объектом в центре).
Вычисляем координаты для обрезки, чтобы квадрат оказался ровно по центру кадра (предполагается выбор исходника с главным объектом в центре).
Применяем метод crop для вырезания центрального квадратного фрагмента.
Применяем метод crop для вырезания центрального квадратного фрагмента.

Шаг №4 Усиление параметров цвета

Четвертым этапом является цветовая коррекция. Перед уменьшением разрешения необходимо искусственно завысить показатели контрастности и насыщенности. Так как при сильном сжатии промежуточные оттенки блекнут и превращаются в серые и бурые пятна, повышение контраста разделяет светлые и темные участки, а увеличение насыщенности делает цвета более выразительными, подготавливая изображение к уменьшению количества цветов палитры.

Создаем инструмент для изменения контрастности и увеличиваем её в 1.15 раза.
Создаем инструмент для изменения контрастности и увеличиваем её в 1.15 раза.
Создаем инструмент для изменения насыщенности и увеличиваем её в 1.3 раза.
Создаем инструмент для изменения насыщенности и увеличиваем её в 1.3 раза.

Шаг №5 Пространственное сжатие изображения (downsampling)

Пятый шаг — это непосредственное уменьшение геометрического разрешения матрицы. Изображение сжимается до указанной фиксированной сетки пикселей, например, 64 на 64. Применяется билинейная интерполяция (Image.Resampling.BILINEAR), которая усредняет значения соседних пикселей, преобразуя детализированные текстуры в однородные цветовые блоки. Значения параметра pixel_grid (размер сетки пикселей) можно менять, получая разные результаты (См. Примеры).

Задаем размер будущей пиксельной сетки (например, 64 на 64 пикселей, этот параметр можно менять См.примеры)
Задаем размер будущей пиксельной сетки (например, 64 на 64 пикселей, этот параметр можно менять См.примеры)
Уменьшаем картинку до микро-размера. Билинейная интерполяция плавно смешивает соседние мелкие детали.
Уменьшаем картинку до микро-размера. Билинейная интерполяция плавно смешивает соседние мелкие детали.

Шаг №6 Ограничение палитры (квантование цвета)

На шестом этапе происходит квантование цвета (color quantization). Это перевод изображения в режим P (палитра) с ограничением до 16 адаптивных цветов. Программа анализирует частоту распределения оттенков на конкретном изображении и строит оптимальную карту из 16 цветов, минимизируя потери восприятия формы.

Переводим изображение в режим индексированных цветов "P" (палитра). Оставляем ровно 16 цветов. Алгоритм сам выберет 16 самых частых оттенков.
Переводим изображение в режим индексированных цветов "P" (палитра). Оставляем ровно 16 цветов. Алгоритм сам выберет 16 самых частых оттенков.

Шаг №7 Обратное увеличение до исходного крупного формата (upsampling)

И седьмой шаг — это обратное масштабирование до исходного или целевого высокого разрешения. Важнейшим условием является использование алгоритма интерполяции по ближайшему соседу (Image.Resampling.NEAREST). В отличие от сглаживающих фильтров, данный метод дублирует существующие пиксели, сохраняя жесткие и четкие границы "квадратиков", что и формирует аутентичный эффект ретро-графики.

Сначала возвращаем режим RGB, чтобы картинка корректно отображалась везде.
Сначала возвращаем режим RGB, чтобы картинка корректно отображалась везде.
Увеличиваем изображение до 800 на 800 пикселей для публикации. Метод NEAREST (ближайший сосед) не сглаживает углы, сохраняя четкие «квадратики»
Увеличиваем изображение до 800 на 800 пикселей для публикации. Метод NEAREST (ближайший сосед) не сглаживает углы, сохраняя четкие «квадратики»

Шаг №8 Сохранение готового результата на диск

Сохранение готового пиксельного изображения из программы на диск. Формат PNG является стандартом для сохранения пиксель-арта из-за алгоритма сжатия без потерь. При сохранении в PNG цвета не смешиваются и границы между пиксельными «квадратиками» остаются четкими. Файл весит мало, так как на картинке много однотонных блоков.

Картинка запишется в ту же папку под именем pixel.png (можно назвать иначе).
Картинка запишется в ту же папку под именем pixel.png (можно назвать иначе).

= Примеры =

Описание влияния изменений параметра pixel_grid (Шаг №5) на финальную стилизацию на основе следующей фотографии:

Photo by Ayo Ogunseinde on Unsplash
Photo by Ayo Ogunseinde on Unsplash

Пресет «Pixel_128» (pixel_grid = 128):

Самый легкий уровень пикселизации. Это даже не совсем пиксельное изображение, скорее графический фильтр. Сохраняет высокую степень детализации.

Как сделать пиксельный аватар: разбираем простой алгоритм на Python

Пресет «Pixel_64» (pixel_grid = 64):

Легкий уровень пикселизации. Сохраняет достаточную степень детализации черт лица и объектов. Оптимально подходит для стандартных аватарок в мессенджерах, где важна узнаваемость.

Как сделать пиксельный аватар: разбираем простой алгоритм на Python

Пресет «Pixel_32» (pixel_grid = 32):

Средний уровень пикселизации. Формирует выраженные геометрические блоки, превращая изображение в абстрактный графический элемент.

Как сделать пиксельный аватар: разбираем простой алгоритм на Python

Пресет «Pixel_16» (pixel_grid = 16):

Высокий уровень пикселизации. Текстуры полностью нивелируются, оставляя только базовые цветовые пятна и крупные тени.

Как сделать пиксельный аватар: разбираем простой алгоритм на Python

= Заключение =

Разработанный скрипт представляет собой функциональный инструмент, который позволяет за секунды превращать стандартные графические изображения в стилизованные элементы цифровой айдентики. Разбор данного алгоритма подтверждает, что программирование выступает эффективным прикладным инструментом в сфере компьютерной графики и дизайна. Оно дает возможность создавать стильный графический контент, автоматизируя процесс обработки изображений с помощью простых математических правил.

3