Рендеринг изображений ASCII-символами
В этой статье мы рассмотрим один из интересных проектов, который называется ASCII Art. Он представляет собой однофайловую библиотеку C/C++, позволяющую выполнять преобразование изображения в печатные ASCII-символы. Все происходит в режиме реального времени с использованием одного дерево решений.
Как функционирует этот алгоритм?
Работает все следующим образом: 1. Входная картинка разбивается на прямоугольные ячейки, имеющие одинаковый размер. Размер сетки отвечает высоте и ширине одной ячейки (символу шрифта), которые получены из кодовой книги на этапе обучения. 2. Символ подбирается для каждой ячейки из кодовой книги — он заменяет «сырые» пиксели. Для этого используется дерево решений — в него подаются пиксели. 3. Если речь идет о большом наборе изображений, то он переводится в ASCII в соответствии с индексом структурного сходства с последующим применением в роли обучающего набора данных.
Как начать работу с библиотекой?
Встроить ее в ваше приложение несложно. Для этого следует добавить ascii_art.c и заголовочный файл в ваше дерево исходного кода, а также загрузить шестнадцатеричную модель. Далее выполняются следующие API-вызовы: 1. Для инициализации структуры ascii_render, определенной в заголовочном файле ascii_art.h, сначала вызывается AsciiArtInit. 2. Подготавливается изображение, которое следует обработать. Это делается путем перевода этого изображения в оттенки серого. Тут подойдет библиотека типа cvtColor из OpenCV либо встроенный интерфейс AsciiArtLoadImage. 3. Выделяется буфер, который должен быть достаточно большим для хранения всех выходных данных. Число нужных байтов можно получить посредством интерфейса AsciiArtTextBufSize. Данный шаг не обязателен, если вы не хотите выводить текст, а желаете вместо этого получить двоичное изображение из символов ASCII. 4. Входное изображение преобразуется в ASCII-символы посредством AsciiArtRender.
Типичное применение интерфейсов можно посмотреть на простейшей программе, код которой размещен ниже:
Ознакомиться с этим проектом подробнее можно здесь.