Напишите программу, которая принимает целое число от 0 до 65535 (2 16 -1) и генерирует уникальное изображение размером 500 × 500 пикселей, которое максимально похоже на эти 6 реальных изображений потрескавшейся почвы:
Это миниатюры, нажмите на них, чтобы увидеть полноразмерные изображения размером 500 × 500.
Цель здесь - сделать ваши компьютерные изображения максимально реалистичными . Поэтому в идеале, если бы любое из изображений, выводимых вашей программой, было смешано с 6 изображениями выше, кто-то, увидевший изображения в первый раз, не сможет отличить сгенерированные компьютером от настоящих.
Однако идеальный фотореализм - это сложно, так что делайте все возможное. Это конкурс популярности, поэтому за ответы, которые имеют более реалистичные результаты, будет больше голосов, и они с большей вероятностью выиграют.
правила
Вы можете использовать функции обработки изображений или библиотеки.
Вы можете основывать свой алгоритм на информации , собранной из 6 образцов изображений, но ваши 65536 (2 16 ) возможные выходных изображения должны быть визуально отличаются друг от друга и примеров изображений, особенно в отношении расположения трещин. Вы должны действительно генерировать свои изображения, а не просто вращать и переводить выборку из уже существующей фотографии.
В противном случае вы не должны жестко кодировать свои выводы. Следует использовать общий алгоритм, и числа, превышающие 65535, должны теоретически давать действительные результаты. (Я ограничил это только для размещения целочисленных типов с небольшим максимальным значением.)
Входное целое число можно рассматривать как начальное число, которое приводит к случайному растрескавшемуся выходному изображению почвы. Он должен быть детерминированным, поэтому один и тот же вход всегда должен приводить к одному и тому же результату.
Выходные изображения должны быть точно 500 × 500 пикселей.
Выходные изображения могут быть сохранены в любом обычном формате файла изображения или просто отображены.
Не забудьте включить несколько примеров выходных изображений в ваш ответ, и их соответствующие номера ввода.
Ответ с наибольшим количеством голосов побеждает. Избирателям следует, конечно, повышать число ответов, которые пытаются создать изображения, подобные 6 образцам, и понижать число ответов, которые нарушают правила или дают противоречивые результаты.
6 образцов изображений были взяты с texturelib.com . Выбор области 1000 × 1000 пикселей был взят из двух больших изображений потрескавшейся почвы, а затем был изменен до 500 × 500. Вы можете использовать анализ этих больших изображений в своей программе, но вывод должен специально имитировать 6 выбранных образцов изображений.
источник
Ответы:
Mathematica
Диаграмма Вороного выглядит как этот рисунок из Википедии, показывая 19 ячеек, каждая из которых содержит одну точку семян. Ячейка состоит из субрегиона точек, в котором соответствующая генерирующая точка находится ближе, чем любая из других начальных точек.
Код ниже генерирует диаграмму из 80 случайных точек (в квадратной области, ограниченной (-1, -1) и (1,1)).
Он использует полигональные примитивы (в 2D) на диаграмме для построения многогранников (в 3D). Представьте, что у каждого многоугольника есть только перевод (-.08 в z). Думайте о двух многоугольниках как о верхней и нижней грани многогранника. Затем добавляются «боковые грани» для завершения многогранника.
Каждый многогранник затем переводится наружу, из центра изображения, на плоскость xy; оно удаляется от середины. Величина трансляции напрямую зависит от расстояния между исходной многогранной генерирующей случайной точкой и центром экрана. Это «растяжение» многогранников в плоскости ху приводит к расщелинам.
Код
источник
Джава
Я использовал подход, основанный на рекурсивных диаграммах Вороного. Выводы выглядят не очень реалистично, но я думаю, что они в порядке.
Вот несколько примеров изображений (размер которых уменьшен до 250x250, чтобы он не занимал весь экран):
0:
1:
Подробнее об алгоритме:
Все изображения в этом разделе используют одно и то же семя.
Алгоритм начинается с генерации диаграммы Вороного с 5 точками:
Если мы посмотрим на исходные изображения в задании, то увидим, что линии не все прямые, поэтому мы взвешиваем расстояние по случайному значению, исходя из угла к точке, также, чем ближе углы, тем ближе значения :
Теперь мы рекурсивно рисуем такие диаграммы Вороного внутри каждой области с более тонкой и прозрачной линией и удаляем фон с максимальной глубиной рекурсии, равной 3, и получаем:
Теперь мы просто добавляем бледно-коричневый фон, и все готово!
Код:
Код состоит из трех классов,
Main.java
,VoronoiPoint.java
иVector.java
:Main.java
:VoronoiPoint.java
:Vector.java
: (Этот класс скопирован из одного из моих других проектов, поэтому он содержит некоторый ненужный код)Но я не хочу компилировать кучу классов Java!
Вот файл JAR, который вы можете запустить, чтобы сгенерировать эти изображения самостоятельно. Запустите как
java -jar Soil.jar number
, гдеnumber
находится семя (может быть что угодно до 2 31 -1), или запустите какjava -jar Soil.jar
, и он сам выбирает семя. Там будет некоторый отладочный вывод.источник
Python 3 (с использованием библиотеки Kivy и GLSL)
Первое сгенерированное изображение
Код Python:
Файл KV:
Код GLSL:
Функция voronoi в коде GLSL взята из ñigo Quílez. Каждый расчет, связанный с вороной, происходит во фрагментном шейдере полностью с некоторыми процедурными шумовыми функциями, чтобы создать спеклы и немного нарушить линии паттерна вороной.
При нажатии пробела семя будет увеличено на 1, и новое изображение будет сгенерировано и сохранено в виде
.png
файла.Обновление: добавлено искажение линзы, виньетирование и хроматическая аберрация, чтобы сделать его более реалистичным. Добавлен суб-вороной шаблон.
источник
seed
. Это будет передано в шейдер как единая переменная с плавающей точкой. В функции трещины шейдера семя используется для перевода точки на значение семени.Джава
Создает композицию из двух случайных диаграмм, которая затем проходит простое обнаружение границ и, наконец, преобразуется в конечный результат.
Некоторые выводы:
Некоторые из промежуточных шагов для этого последнего:
(Первая диаграмма вороной)
(Композит из двух диаграмм вороной)
(После шага определения края, но до окончательного перекрашивания)
источник