Escriba un programa que tome un número entero de 0 a 65535 (2 16 -1) y genere una imagen única de 500 × 500 píxeles que se vea lo más similar posible a estas 6 imágenes de la vida real del suelo agrietado:
Estas son miniaturas, haga clic en ellas para ver las imágenes a tamaño completo de 500 × 500.
El objetivo aquí es hacer que sus imágenes generadas por computadora sean lo más fotorrealistas posible . Por lo tanto, idealmente, si alguna de las imágenes emitidas por su programa se mezclara con las 6 imágenes anteriores, alguien que vea las imágenes por primera vez no podrá distinguir las imágenes generadas por computadora aparte de las reales.
Sin embargo, el fotorrealismo perfecto es complicado, así que haz lo mejor que puedas. Este es un concurso de popularidad, por lo que las respuestas que tengan resultados más realistas se votarán más y serán más propensas a ganar.
Reglas
Puede usar funciones de procesamiento de imágenes o bibliotecas.
Puede basar su algoritmo en la información recopilada de las 6 imágenes de muestra, pero sus 65536 (2 16 ) posibles imágenes de salida deben ser visualmente distintas entre sí y las imágenes de muestra, especialmente con respecto a la disposición de las grietas. Realmente debe generar sus imágenes, no solo gire y traduzca una selección de una foto preexistente.
De lo contrario, no debería codificar sus salidas. Debería usarse un algoritmo genérico y los números mayores que 65535 deberían producir teóricamente resultados válidos. (Lo he restringido simplemente para acomodar tipos enteros de pequeño máximo).
El entero de entrada puede considerarse como una semilla que da como resultado una imagen de salida de suelo agrietada al azar. Sin embargo, debe ser determinista, por lo que la misma entrada siempre debe dar como resultado la misma salida.
Las imágenes de salida deben tener exactamente 500 × 500 píxeles.
Las imágenes de salida pueden guardarse en cualquier formato de archivo de imagen común, o simplemente mostrarse.
Asegúrese de incluir algunos ejemplos de imágenes de salida en su respuesta y sus números de entrada correspondientes.
La respuesta con más votos gana. Los votantes, por supuesto, deben votar a favor las respuestas que intentan producir imágenes similares a las 6 muestras, y votar las respuestas que rompen las reglas o dan resultados inconsistentes.
Las 6 imágenes de muestra fueron tomadas de texturelib.com . Se tomaron selecciones de área de 1000 × 1000 píxeles de dos imágenes más grandes de suelo agrietado y luego se redimensionaron a 500 × 500. Puede utilizar el análisis de estas imágenes más grandes en su programa, pero el resultado debe imitar específicamente las 6 imágenes de muestra elegidas.
fuente
Respuestas:
Mathematica
Un diagrama de Voronoi se parece a este dibujo, de Wikipedia, que muestra 19 celdas, cada una de las cuales contiene un único punto de semilla. Una celda consiste en la subregión de puntos a los que el punto generador respectivo está más cerca que cualquiera de los otros puntos semilla.
El siguiente código genera un diagrama a partir de 80 puntos aleatorios (en la región cuadrada unida por (-1, -1) y (1,1)).
Utiliza las primitivas de polígono (en 2D) en el diagrama para construir poliedros (en 3D). Imagine que cada polígono tiene, justo debajo de él, una traducción (-.08 en z) de sí mismo. Piense en los dos polígonos como la cara superior e inferior de un poliedro. Luego se agregan "caras laterales" para completar el poliedro.
Cada poliedro se traslada hacia afuera, desde el centro de la imagen, en el plano xy; se aleja del medio. La magnitud de la traducción varía directamente con la distancia entre el punto aleatorio generador original del poliedro y el centro de la pantalla. Esta "extensión" de los poliedros en el plano xy da como resultado grietas.
Código
fuente
Java
Utilicé un enfoque basado en diagramas recursivos de Voronoi. Los resultados no parecen muy realistas, pero supongo que están bien.
Aquí hay algunas imágenes de ejemplo (redimensionadas a 250x250 para que no llene toda la pantalla):
0:
1:
Más detalles sobre el algoritmo:
Todas las imágenes en esta sección están usando la misma semilla.
El algoritmo comienza generando un diagrama de Voronoi con 5 puntos:
Si miramos las imágenes originales en el desafío, podemos ver que las líneas no son todas rectas así, por lo que sopesamos la distancia por un valor aleatorio, basado en el ángulo del punto, también, ángulos más cercanos dan valores más cercanos :
Ahora, dibujamos recursivamente este tipo de diagramas de Voronoi dentro de cada región, con una línea más delgada y transparente, y eliminamos el fondo, con una profundidad de recursión máxima de 3, y obtenemos:
Ahora, solo agregamos el fondo marrón pálido, ¡y listo!
Código:
El código consta de tres clases
Main.java
,VoronoiPoint.java
yVector.java
:Main.java
:VoronoiPoint.java
:Vector.java
: (Esta clase se copia de uno de mis otros proyectos, por lo que contiene un código innecesario)¡Pero no quiero compilar un montón de clases Java!
Aquí hay un archivo JAR que puede ejecutar para generar estas imágenes usted mismo. Ejecutar como
java -jar Soil.jar number
, dondenumber
está la semilla (puede ser cualquier cosa hasta 2 31 -1), o correr comojava -jar Soil.jar
, y elige una semilla por sí mismo. Habrá alguna salida de depuración.fuente
Python 3 (usando la biblioteca Kivy y GLSL)
Primera imagen generada
Código de Python:
Archivo KV:
Código GLSL:
La función voronoi en el código GLSL es de Íñigo Quílez. Cada cálculo relacionado con voronoi ocurre en el sombreador de fragmentos por completo con algunas funciones de ruido de procedimiento para crear motas y perturbar un poco las líneas del patrón de voronoi.
Al presionar la barra espaciadora, la semilla aumentará en 1 y se generará una nueva imagen y se guardará como un
.png
archivo.Actualización: Se agregó distorsión de lente, viñetas y aberración cromática para que sea más fotorrealista. Se agregó un patrón sub-voronoi.
fuente
seed
. Esto se canalizará al sombreador como una variable flotante uniforme. En la función crack del sombreador, la semilla se usa para traducir el punto por el valor de la semilla.Java
Crea un compuesto de dos diagramas aleatorios que luego se ejecuta a través de una detección de borde simple y finalmente se convierte en el resultado final.
Algunas salidas:
Algunos de los pasos intermedios para ese último:
(El primer diagrama de voronoi)
(El compuesto de los dos diagramas voronoi)
(Después del paso de detección de bordes pero antes del cambio de color final)
fuente