Краска на стенах в моей комнате имеет случайную, почти фрактальную, трехмерную текстуру:
В этом задании вы напишите программу, которая генерирует случайные изображения, которые выглядят так, как будто они могут быть частью моих стен.
Ниже я собрал 10 изображений различных пятен на моих стенах. Все они имеют примерно одинаковое освещение, и все они были сняты камерой на расстоянии одного фута от стены. Границы были равномерно обрезаны, чтобы сделать их 2048 на 2048 пикселей, затем они были масштабированы до 512 на 512. Изображение выше - это изображение А.
Это только миниатюры, кликните по картинке для просмотра в полном размере!
Ваша задача - написать программу, которая в качестве случайного начального числа принимает положительное целое число от 1 до 2 16 и для каждого значения генерирует отдельное изображение, которое выглядит так, как будто это было «одиннадцатое изображение» моей стены. Если кто-то, смотрящий на мои 10 и несколько ваших изображений, не может определить, какие из них были сгенерированы компьютером, значит, вы справились очень хорошо!
Пожалуйста, покажите несколько сгенерированных изображений, чтобы зрители могли увидеть их без необходимости запуска кода.
Я понимаю, что освещение в моих изображениях не идеально равномерно по интенсивности или цвету. Я прошу прощения за это, но это лучшее, что я мог бы сделать без лучшего осветительного оборудования. Ваши изображения не должны иметь переменное освещение (хотя они могут). Текстура является более важной вещью, на которой нужно сосредоточиться.
подробности
- Вы можете использовать инструменты обработки изображений и библиотеки.
- Используйте входные данные любым удобным для вас способом (командная строка, стандартный ввод, очевидная переменная и т. Д.).
- Выходное изображение может быть в любом обычном формате файла изображения без потерь, или оно может быть просто отображено в окне / Bowser.
- Вы можете программно анализировать мои 10 изображений, но не предполагайте, что каждый, кто запускает ваш код, имеет к ним доступ.
- Вы должны генерировать изображения программно. Вы не можете жестко запрограммировать небольшой вариант одного из моих изображений или другого изображения. (Люди все равно проголосуют за тебя.)
- Вы можете использовать встроенные генераторы псевдослучайных чисел и предполагать, что период равен 2 16 или более.
счет
Это конкурс популярности, поэтому победитель получает голос с наибольшим количеством голосов.
источник
Ответы:
GLSL (+ JavaScript + WebGL)
Живая демо | GitHub репозиторий
Как пользоваться
Перезагрузите страницу для нового случайного изображения. Если вы хотите кормить определенное начальное число, откройте консоль браузера и позвоните
drawScreen(seed)
. Консоль должна отображать семена, используемые при загрузке.Я действительно не проверял это на многих платформах, поэтому дайте мне знать, если это не работает для вас. Конечно, ваш браузер должен поддерживать WebGL. Ошибки отображаются либо в столбце слева, либо в консоли браузера (в зависимости от типа ошибки).
Новое: теперь вы можете немного оживить стены, установив флажок «Подвижный источник света».
Что это за колдовство?
У меня есть этот шаблонный код WebGL, плавающий вокруг моей учетной записи GitHub , который я использую время от времени для быстрого прототипирования некоторых 2D-объектов в WebGL. С помощью некоторой магии шейдеров мы также можем сделать ее немного трехмерной, поэтому я подумал, что это был самый быстрый способ получить хорошие эффекты. Большая часть настроек взята из этого стандартного кода, и я считаю, что это библиотека для этого представления и не будет включать ее в этот пост. Если вам интересно, посмотрите main.js на GitHub (и другие файлы в этой папке).
Все, что делает JavaScript, - это устанавливает контекст WebGL, сохраняет начальное число в униформе для шейдера, а затем отображает один квад по всему контексту. Вершинный шейдер - это простой сквозной шейдер, поэтому вся магия происходит во фрагментном шейдере. Вот почему я назвал это представлением GLSL.
Большая часть кода на самом деле генерирует шумы Simplex, которые я нашел на GitHub . Так что я опускаю это и в листинге кода ниже. Важной частью является то, что она определяет функцию,
snoise(vec2 coords)
которая возвращает симплексный шум без использования поиска текстуры или массива. Он вообще не засеян, поэтому хитрость в получении другого шума заключается в том, чтобы использовать начальное значение при определении того, где искать.Так что здесь идет:
Вот и все. Я мог бы добавить еще несколько объяснений завтра, но основная идея такова:
tanh
чтобы выровнять верх.источник
Mathematica Spackling
Приложение ниже применяет крапинку к случайному изображению. Нажатие на «новый патч» создает новое случайное изображение для работы, а затем применяет эффекты в соответствии с текущими настройками. Эффекты - масляная живопись, фильтр Гаусса, постеризация и тиснение. Каждый эффект может быть независимо настроен. Начальное число для генератора случайных чисел может быть любым целым числом от 1 до 2 ^ 16.
Обновление : фильтр Гаусса, который смягчает края, теперь является последним примененным эффектом изображения. С этой модификацией эффект постеризации больше не был необходим и таким образом удален.
объяснение
Объяснение основано на несколько иной версии, в которой постеризация использовалась и
GaussianFilter
применялась на ранней стадии. Но это все еще служит для выяснения того, как каждый эффект изображения изменяет изображение. Конечным результатом является текстура краски с более острыми краями. Когда фильтр Гаусса применяется только в конце, результат будет более плавным, как показано на рисунке выше.Давайте посмотрим на некоторые эффекты изображения, по одному за раз.
Создайте начальное изображение.
Лена покажет нам, как каждый эффект изображения преобразует реалистичную картину.
Эффект масляной живописи применительно к Лене.
Эффект масляной живописи применяется к нашему случайному изображению. Эффект усилился (16 вместо 8).
Эффект фильтра Гаусса применяется к Лене (не к версии с эффектом масляной живописи Лены). Радиус 10 пикселей. (В окончательной версии в верхней части этой записи GaussianFilter применяется как конечный эффект.)
Несколько более мягкий эффект фильтра Гаусса применяется к r1. Радиус 5 пикселей.
Интенсивный эффект постеризации применительно к Лене. (В окончательной версии приложения я удалил постеризацию. Но мы оставим это в анализе, поскольку примеры в анализе были основаны на более ранней версии с постеризацией.)
Эффект постеризации, примененный к r2.
Тиснение Лены
Тиснение r3 завершает обработку изображения. Это должно выглядеть как потолок ОП.
Для любопытных вот Лена с такими же эффектами изображения.
источник
RandomInteger
семена, тем самым гарантируя конкретный выход. Или вы имеете в виду что-то еще, например, исходное неслучайное изображение, к которому применяются эффекты?Lena will show us how each image effect transforms a life-like picture
сделал меня лол. Странно то, что на последнем изображении Лены видны ацтеки или инки, обращенные влево, в головном уборе и с веточкой, как будто это пистолет.POV-Ray
Большой потенциал для игры в гольф
povray /RENDER wall.pov -h512 -w512 -K234543
Сначала он создает случайную текстуру, но вместо того, чтобы останавливаться там, он преобразует текстуру в 3D-поле высоты, чтобы радиальные тени от вспышки камеры стали более реалистичными. И для хорошей меры это добавляет другую структуру маленьких ударов сверху.
Единственный способ кроме жесткого кодирования случайного начального числа - использовать
clock
переменную, предназначенную для анимации, это передается с-K{number}
флагомисточник