MS Paint всегда была отличной тратой времени, но большинство графических дизайнеров ее избегали. Возможно, люди потеряли интерес из-за раскачивающейся цветовой палитры или из-за ограниченных уровней отмены. Независимо от этого, все еще возможно генерировать красивые изображения только с помощью стандартной кисти и цветовой палитры по умолчанию.
Вызов
Используя только кисть по умолчанию (квадрат 4х4 без углов) и цветовую палитру по умолчанию (28 цветов ниже), попытайтесь воспроизвести исходное изображение, используя технику, основанную на стохастическом восхождении на холм .
Алгоритм
Каждый ответ должен следовать одному и тому же базовому алгоритму (стохастическому склону холма). Детали могут быть изменены в каждом шаге. Движение считается росчерком кисти (т.е.. Щелкающей краской).
- Угадай следующее движение (я). Сделайте предположение (о координатах и цветах) для следующего движения (движений), как вам нравится. Однако предположение не должно ссылаться на исходное изображение.
- Примените предположение. Примените кисть к картине, чтобы сделать движение.
- Измерьте выгоду движения (ей). Обращаясь к исходному изображению, определите, принесло ли движение (а) пользу картине (то есть картина больше напоминает исходное изображение). Если это полезно, сохраните движение (я), иначе откажитесь от движения (движений).
- Повторяйте до схождения. Перейдите к шагу 1 и попробуйте следующее предположение, пока алгоритм не сойдет достаточно. Картина должна сильно походить на исходное изображение в этой точке.
Если ваша программа не соответствует этим четырем шагам, то это, вероятно, не стохастический холм. Я отметил это как конкурс популярности, потому что цель состоит в том, чтобы создать интересные алгоритмы рисования на основе ограниченной цветовой палитры и кисти.
контрсилами
- Алгоритм должен быть в некотором смысле стохастическим .
Следующее предположение не должно зависеть от исходного изображения. Вы угадываете каждое новое движение, а затем проверяете, помогло оно или нет. Например, вам не разрешено определять, где разместить кисть, на основе цветов исходного изображения (что аналогично сглаживанию исходного изображения, которое не является целью).
Вы можете влиять на размещение, настраивая шаги алгоритма, как вам нравится. Например, вы можете начать свои догадки с краев и двигаться внутрь, перетащить кисть, чтобы создать линии для каждого предположения, или решить сначала нарисовать темные цвета. Вы можете ссылаться на изображения предыдущих итераций (но не на исходное изображение), чтобы рассчитать следующее желаемое движение. Они могут быть ограничивающими, как вы хотите (т. Е. Делать предположения только в верхнем левом квадранте для текущей итерации).
Мера «разницы» между исходным изображением и текущей итерацией может быть измерена, как вам угодно, если только она не рассчитывает другие потенциальные движения, чтобы определить, считается ли это движение «лучшим». Он не должен знать, является ли текущее движение «лучшим», только соответствует ли оно допустимым критериям приемлемости. Например, это может быть так же просто, как
abs(src.R - current.R) + abs(src.G - current.G) + abs(src.B - current.B)
для каждого затронутого пикселя, или любой из известных методик цветоразностных сигналов .
палитра
Вы можете скачать палитру как изображение размером 28x1 или создать ее прямо в коде.
Щетка
Кисть размером 4х4 без углов. Это уменьшенная версия этого:
(Ваш код должен использовать версию 4x4)
пример
Входные данные:
Выход:
Вы можете увидеть, как продвигается основной алгоритм в коротком видео, которое я сделал (каждый кадр - 500 итераций): Звездная ночь . На начальных этапах интересно посмотреть:
источник
Ответы:
JavaScript
Это решение использует элемент холста HTML5 для извлечения данных изображения, но без необходимости использовать HTML, это означает, что он может быть запущен в вашей консоли. Доступ к цветовой палитре изображения в виде массива; Я сохранил все цвета из изображения палитры в массиве). Он выводит на консоль (после завершения), а также сохраняет результат в переменной.
Самая последняя версия кода находится в скрипке . Скрипка также использует лучший алгоритм для уменьшения шума на изображениях. Улучшение в алгоритме в основном исправляет функцию (от максимальной до минимальной), которая привела к выбору обратного цвета.
Код в форме иконки MS Paint! (отформатированный код в скрипте или фрагменте стека)
Использование:
Скрипки .
Скрипт использует crossorigin.me, поэтому вам не нужно беспокоиться о совместном использовании ресурсов.
Я также обновил скрипку, чтобы вы могли отрегулировать некоторые значения для создания наилучшей картины. Цвет некоторых изображений может быть отключен, чтобы избежать этого, настройте accept_rate для настройки алгоритма. Меньшее число означает лучшие градиенты, большее число приведет к более резким цветам.
Вот скрипка в виде фрагмента стека (НЕ обновляется, если скрипка не работает):
Показать фрагмент кода
Чтобы отметить полет Плутона в New Horizon, я ввел изображение Плутона:
Для следующего я установил их так, чтобы они максимально напоминали оригинал:
Я запустил это со стандартными обоями OS X Yosemite. После того, как он немного побежал, результаты просто потрясающие. Исходный файл был огромным (26 МБ), поэтому я изменил его размер и сжал:
Звездная ночь (я использовал более высокое разрешение изображения для лучшего результата)
Картинку, которую я нашел в Google:
источник
JavaScript + HTML
Случайная:
Случайная точка
Случайное выравнивание:
Подразделяет холст на квадраты 4х4 и выбирает точку случайным образом внутри одного из квадратов. Смещения будут перемещать сетку, поэтому вы можете заполнить небольшие пробелы.
Loop:
Создает сетку и перебирает все точки. Смещение перемещает сетку. Интервалы определяют размер каждой ячейки. (Они начнут перекрываться)
Разница в цвета:
RGB:
HSL:
HSV:
источник
document.cookie
(после 1000 итераций), потому что документ помещен в «песочницу». Нужен ли файл cookie?doThing
вместоloop
. Вы можете найти увеличение скорости стоит дополнительных линий ...C # (эталонная реализация)
Это код, используемый для создания изображений в вопросе. Я подумал, что было бы полезно дать некоторым людям ссылку на организацию их алгоритма. Совершенно случайная координата и цвет выбираются при каждом движении. Он работает на удивление хорошо, учитывая ограничения, налагаемые размером кисти / критериями приемлемости.
Я использую алгоритм CIEDE2000 для измерения цветовых различий из библиотеки с открытым исходным кодом ColorMine . Это должно дать более близкие цветовые соответствия (с человеческой точки зрения), но при использовании с этой палитрой не должно быть заметного различия.
Затем вы можете сгенерировать серию изображений (например, мое видео), вызвав экземпляр аналогично приведенному ниже коду (настройка зависит от количества итераций / кадров / желаемого имени). Первый аргумент - это путь к файлу с исходным изображением, второй аргумент - это путь к файлу с палитрой (ссылка в вопросе), а третий аргумент - это путь к файлу для выходных изображений.
Я искал некоторые красочные картины на холсте онлайн и наткнулся на изображения ниже, которые кажутся отличными (сложными) тестовыми изображениями. Все авторские права принадлежат их владельцам.
Источник
Источник
Источник
источник
JavaScript Canvas
Обновить
Отличные предложения в комментариях. Это теперь быстрее и не замедляет пользовательский интерфейс!
источник
Mathematica
Хотя на самом деле это не так быстро, но, по крайней мере, создает смутно узнаваемые изображения, так что я счастлив.
Выход:
Вывод, возможно, мог бы быть немного лучше с большим количеством итераций, и есть еще много, что я могу попытаться ускорить / улучшить конвергенцию, но сейчас это кажется достаточно хорошим.
источник
SmileBASIC
MSPAINT image% [] , ширина% , высота% , шаги% OUT output% []
источник