Интересные GitHub-проекты: рендеринг изображений ASCII-символами

ASCII

ASCII Art представляет собой однофайловую библиотеку C/C++, которая позволяет преобразовывать изображение или видеокадр в печатные символы ASCII в режиме реального времени. При этом используется одно дерево решений. Производительность в реальном времени достигается за счет использования сравнения интенсивности пикселей внутри внутренних узлов дерева.

Как работает алгоритм

При использовании изображения или видеокадра выполняются следующие действия:

  1. Входное изображение разбивается на прямоугольные ячейки одинакового размера. Размер сетки соответствует высоте и ширине одной ячейки (т.е. символу шрифта), полученным из кодовой книги на этапе обучения.
  2. Для каждой ячейки из кодовой книги выбирается символ, который заменит в ней «сырые» пиксели. Этим занимается дерево решений, в которое подаются эти пиксели.
  3. Большой набор изображений переводится в ASCII с учётом индекса структурного сходства и используется в качестве обучающего набора данных.

Руководство по началу работы

Встроить библиотеку в ваше приложение не составит труда. Для этого нужно лишь добавить ascii_art.c и его заголовочный файл в ваше дерево исходного кода и скачать шестнадцатеричную модель, а также выполнить следующие вызовы API:

  1. Сначала вызовите AsciiArtInit, чтобы инициализировать структуру ascii_render, определенную в заголовочном файле ascii_art.h.
  2. Подготовьте изображение, которое нужно обработать, переведя его в оттенки серого. Для этого можно использовать внешнюю библиотеку вроде cvtColor из OpenCV или встроенный интерфейс AsciiArtLoadImage.
  3. Выделите буфер, достаточно большой для хранения всех выходных данных. Количество необходимых байтов можно получить через интерфейс AsciiArtTextBufSize. Этот шаг является необязательным, если вы хотите не выводить текст, а получить двоичное изображение из ASCII-символов.
  4. Наконец, преобразуйте входное изображение в символы ASCII с помощью AsciiArtRender.

Ниже представлена простая программа на С, которая которая демонстрирует типичное использование этих интерфейсов.

#include "ascii_art.h"

ascii_render sRender; /* Stack allocated */
	
/* Инициализируйте структуру для рендеринга */
AsciiArtInit(&sRender);
	
/* Загрузите изображение с диска */
int width, height;
unsigned char *zBlob = AsciiArtLoadImage(argv[1],&width,&height);
if( zBlob == 0 ){
	puts("Cannot load image");
	return;
}
	
/* Выделите буфер, достаточно большой для полного вывода текста */
size_t nBytes = AsciiArtTextBufSize(&sRender, width, height);
unsigned char *zText = malloc(nBytes);
	
/* Наконец, сам процесс */ 
AsciiArtRender(&sRender, zBlob, &width, &height, zText,1);
/* zBlob [] теперь хранит двоичные символы ASCII*/
	
/* Вывод результата */
fwrite(zText, sizeof(char), nBytes, stdout);
	
/* Освобождение памяти */
free(zText);
free(zBlob);

Также доступна демо-версия программы.

Максим Леонов