Воспроизведение изображений с геометрическими примитивами.
Целевое изображение предоставляется как вход. Алгоритм пытается найти самую наиболее оптимальную форму, которую можно нарисовать, чтобы минимизировать ошибку между целевым изображением и нарисованным изображением. Он повторяет этот процесс, добавляя одну форму за раз . Около 50-200 форм необходимы для достижения результата, который является узнаваемым, но художественным и абстрактным.
Теперь доступно как нативное приложение Mac!
https://primity.lol/
Следите за @primitypic в Твиттере, чтобы увидеть новую примитивную картину каждые 30 минут!
Бот Twitter ищет интересные фотографии, используя API Flickr, запускает алгоритм, используя рандомизированные параметры и публикует изображение, используя API Twitter.
Вы можете написать картинку для бота, и она обработает ее для вас.
Запустите его на своих собственных изображениях! Сначала установите Go.
go get -u github.com/fogleman/primitive
primitive -i input.png -o output.png -n 100
Следует использовать небольшие входные изображения (например, 256x256px). В любом случае вам не нужны детали, и код будет работать быстрее.
Флаг | По умолчанию | Описание |
---|---|---|
i | n/a | входной файл |
o | n/a | выходной файл |
n | n/a | Количество форм |
m | 1 | Режим: 0 = комбо, 1 = треугольник, 2 = прямо, 3 = эллипс, 4 = круг, 5 = вращающийся |
rep | 0 | Добавить n дополнительных форм каждой итерации с уменьшенным поиском (в основном хорошо для берье) |
nth | 1 | Сохраните каждый n -й кадр (только когда %d находится в выходном пути) |
r | 256 | Изменить размер больших входных изображений до этого размера перед обработкой |
s | 1024 | Выходной размер изображения |
a | 128 | Цвет альфа (используйте 0 , чтобы позволить алгоритму выбирать альфа для каждой формы) |
bg | ав | стартовый цвет цвет (шестнадцатеричный) |
j | 0 | Количество параллельных работников (по умолчанию использует все ядра) |
v | выключенный | Пловесная выход |
vv | выключенный | очень многословный выход |
В зависимости от предоставленного расширения имени выходного файла вы можете создать различные типы вывода.
PNG
: растровый выходJPG
: растровый выходSVG
: векторный выходGIF
: анимированный вывод, показывающий добавленные формы - требует ImageMagick (в частности, команда convert
) Для выходов PNG и SVG вы также можете включить %d
, %03d
и т. Д. В имя файла. В этом случае каждый кадр будет сохранен отдельно.
Вы можете использовать флаг -o
несколько раз. Таким образом, вы можете сохранить, например, PNG и SVG.
Этот GIF демонстрирует итеративный характер алгоритма, пытаясь минимизировать среднюю квадратную ошибку, добавив одну форму за раз. (Используйте выходной файл «.gif», чтобы создать его самостоятельно!)
Поскольку алгоритм имеет случайный компонент, вы можете запустить его против одного и того же входного изображения несколько раз, чтобы довести жизнь к статическому изображению.
Если вы готовы баловаться в коде, вы можете обеспечить соблюдение ограничений на фигуры, чтобы дать еще более интересные результаты. Здесь прямоугольники ограничены, чтобы указывать на солнце на этой картине пирамидного заката.
Матрица ниже показывает треугольники, эллипсы и прямоугольники по 50, 100 и 200 итерациям каждый.
Скажем, у нас есть Target Image
. Это то, что мы работаем над воссозданием. Мы начинаем с пустого холста, но мы заполняем его одним сплошным цветом. В настоящее время это средний цвет Target Image
. Мы называем это новым пустым холстом Current Image
. Теперь мы начинаем оценивать формы. Чтобы оценить форму, мы нарисуем ее поверх Current Image
, создавая New Image
. Это New Image
сравнивается с Target Image
для вычисления оценки. Мы используем ошибку квадратной квадратной квадраты для оценки.
Current Image + Shape => New Image
RMSE(New Image, Target Image) => Score
Формы генерируются случайным образом. Мы можем генерировать случайную форму и оценить ее. Затем мы можем мутировать форму (настройка вершины треугольника, настраивая радиус или центр эллипса и т. Д.) И забить ее снова. Если мутация улучшила счет, мы сохраняем его. В противном случае мы отказываемся от предыдущего штата. Повторение этого процесса известен как скалолазание. Подъем на холме подвергается застенчивому застлую в местных минимумах, поэтому мы на самом деле делаем так много времени с несколькими различными стартовыми формами. Мы также можем генерировать n случайных форм и выбрать лучшие, прежде чем начать лазание на холме. Смоделированный отжиг - еще один хороший вариант, но в моих тестах я нашел технику лазания на холме такую же хорошую и быстрее, по крайней мере, для этой конкретной проблемы.
Как только мы нашли хорошую форму, мы добавим ее к Current Image
, где оно останется неизменной. Затем мы снова запустим процесс, чтобы найти следующую форму, чтобы нарисовать. Этот процесс повторяется столько раз, сколько желательно.
Поддерживаются следующие примитивы:
Можно добавить больше форм, внедрив следующий интерфейс:
type Shape interface {
Rasterize () [] Scanline
Copy () Shape
Mutate ()
Draw ( dc * gg. Context )
SVG ( attrs string ) string
}
Этот проект был изначально вдохновлен популярной и превосходной работой Роджера Йоханссона - Генетическое программирование: эволюция Моны Лизы. С тех пор, как я увидел эту статью, когда она была довольно новой, я возился с этой проблемой здесь и там за эти годы. Но только сейчас я доволен своими результатами.
Следует отметить, что в моей реализации существуют значительные различия по сравнению с первоначальной работой Роджера. Мой не генетический алгоритм. Мой работает только на одной форме за раз. Мой намного быстрее (AFAIK) и поддерживает многие типы форм.
Вот больше примеров из интересных фотографий, найденных на Flickr.