Визуализация портретов
Я остановился на этой визуализации, и она называется Word Portrait:
У меня вопрос: как это сделать? Есть учебник или статья, которая описывает это?
2 ответа
Я новее видел это, но в прошлом я делал конвертер растрового изображения в ASCII, что похоже. так что с моей точки зрения я вижу это так:
возьмите серое изображение и сегментируйте его (прямоугольными областями с фиксированным соотношением сторон)
Соотношение сторон задается вводимой текстовой фразой и используемым шрифтом. Это даст вам список прямоугольников с похожими цветами, поэтому рассчитайте средний цвет для них. Также хорошей идеей является ограничение минимального и максимального размера сегментов.
- слишком маленькие прямоугольники не читаются
- слишком большие прямоугольники некрасивы (см. самый большой гений)
заменить прямоугольные сегменты текстом
Размер шрифта ограничен заполненной областью (размер прямоугольника), поэтому текст будет вмещаться в него. Средний цвет текста должен совпадать со средним цветом прямоугольника
text_color=rectangle_avg_color*(ink_pixels+paper_pixels)/ink_pixels
ink_pixels
а такжеpaper_pixels
количество пикселей в отображаемой текстовой фразе Если вы хотите реализовать цветные изображения, просто рассчитайте значения R,G,B по отдельности и смешайте их вместе или сегментируйте по цветам и интенсивности сразу
Посмотрите, как преобразование изображений в ASCII Art поможет вам получить новые идеи...
Проверьте мой репозиторий Github: ArtWork.
Мы реализовали этот алгоритм для университетского проекта.
Как работает этот алгоритм.
- Вычислите Bounding Box шрифта, который вы используете.
- Возьмите этот BBox и переместите его на свое изображение.
- (будет объяснено в шаге 7. Проверьте используемое изображение с текущим BBox. Есть ли свободное место внутри BBox для печати (все пиксели должны быть белыми)? Если да, перейдите к шагу 4. иначе переместите BBox дальше.)
- Вычислить среднее значение этого BBox
- Вычислить дисперсию этого BBox
- Используйте порог, который определяет, будем ли мы печатать или нет (дисперсия низкая -> мы печатаем в противном случае мы перемещаем BBox)
- Если мы распечатаем текст, напечатайте его цветом (итоговое значение) на вашем итоговом изображении и на втором полностью белом изображении, называемом использованным изображением, которое поможет нам проверить, печатались ли мы уже в этой области. На этом использованном изображении мы печатаем черным цветом.
- Обновите ваши параметры, это означает, что шаг за шагом уменьшайте размер шрифта, пока не достигнете конечного конечного условия (например, currentFontSize > minFontSize).
- Повторите (перейдите к шагу 1.), пока ваше конечное состояние не будет достигнуто.