La pintura en las paredes de mi habitación tiene una textura tridimensional aleatoria, casi de tipo fractal:
En este desafío, escribirás un programa que genera imágenes aleatorias que parecen ser parte de mis paredes.
A continuación, he recopilado 10 imágenes de diferentes puntos en mis paredes. Todos tienen aproximadamente la misma iluminación y todos fueron tomados con la cámara a un pie de distancia de la pared. Los bordes se recortaron uniformemente para hacerlos de 2048 por 2048 píxeles, luego se escalaron a 512 por 512. La imagen de arriba es la imagen A.
¡Estas son solo miniaturas, haga clic en las imágenes para verlas a tamaño completo!
Su tarea es escribir un programa que tome un entero positivo de 1 a 2 16 como una semilla aleatoria, y para cada valor genera una imagen distinta que parece que podría haber sido la "undécima imagen" de mi muro. Si alguien que mira mis 10 imágenes y algunas de las suyas no sabe cuáles fueron generadas por computadora, ¡lo ha hecho muy bien!
Muestre algunas de sus imágenes generadas para que los espectadores puedan verlas sin tener que ejecutar el código.
Me doy cuenta de que la iluminación de mis imágenes no es perfectamente uniforme en intensidad o color. Lo siento, pero es lo mejor que podría hacer sin un mejor equipo de iluminación. Sus imágenes no necesitan tener iluminación variable (aunque podrían). La textura es lo más importante para enfocarse.
Detalles
- Puede usar herramientas y bibliotecas de procesamiento de imágenes.
- Tome la entrada de la manera común que desee (línea de comando, stdin, variable obvia, etc.).
- La imagen de salida puede estar en cualquier formato de archivo de imagen sin pérdida común, o simplemente se puede mostrar en una ventana / bowser.
- Puede analizar mis 10 imágenes mediante programación, pero no asuma que todos los que ejecutan su código tienen acceso a ellas.
- Debe generar las imágenes mediante programación. No puede codificar una variante leve de una de mis imágenes o alguna otra imagen de stock. (La gente lo rechazaría por esto de todos modos).
- Puede usar generadores de números pseudoaleatorios integrados y asumir que el período es 2 16 o más.
Puntuación
Este es un concurso de popularidad, por lo que gana la respuesta más votada.
fuente
Respuestas:
GLSL (+ JavaScript + WebGL)
Demostración en vivo | Repositorio de GitHub
Cómo utilizar
Vuelva a cargar la página para obtener una nueva imagen aleatoria. Si desea alimentar una semilla en particular, abra la consola de su navegador y llame
drawScreen(seed)
. La consola debe mostrar la semilla utilizada en la carga.Realmente no he probado esto en muchas plataformas, así que avíseme si no funciona para usted. Por supuesto, su navegador debe ser compatible con WebGL. Los errores se muestran en la columna de la izquierda o en la consola del navegador (según el tipo de error).
Nuevo: ahora puede dar vida a las paredes un poco, marcando la casilla de verificación "fuente de luz móvil".
¿Qué es esta hechicería?
Tengo este código repetitivo de WebGL flotando alrededor de mi cuenta de GitHub , que uso de vez en cuando para crear rápidamente prototipos de elementos gráficos 2D en WebGL. Con algo de magia de sombreador, también podemos hacer que se vea un poco en 3D, así que pensé que era la forma más rápida de obtener algunos efectos agradables. La mayor parte de la configuración es de ese código repetitivo, y estoy considerando que es una biblioteca para este envío y no la incluiré en esta publicación. Si está interesado, eche un vistazo a main.js en GitHub (y los otros archivos en esa carpeta).
Todo lo que JavaScript hace es configurar un contexto WebGL, almacenar la semilla en un uniforme para el sombreador y luego renderizar un único quad sobre todo el contexto. El sombreador de vértices es un sombreador de paso simple, por lo que toda la magia ocurre en el sombreador de fragmentos. Es por eso que llamé a esto una presentación GLSL.
La mayor parte del código es en realidad generar el ruido Simplex, que encontré en GitHub . Así que también estoy omitiendo eso en la lista de códigos a continuación. La parte importante es que define una función
snoise(vec2 coords)
que devuelve ruido simplex sin usar una búsqueda de textura o matriz. No está sembrado en absoluto, por lo que el truco para obtener un ruido diferente es usar la semilla para determinar dónde hacer la búsqueda.Entonces aquí va:
Eso es. Podría agregar alguna explicación más mañana, pero la idea básica es:
tanh
para nivelar la parte superior.fuente
Mathematica Spackling
La aplicación a continuación aplica moteado a una imagen aleatoria. Al hacer clic en "nuevo parche", se genera una nueva imagen aleatoria para trabajar y luego se aplican los efectos según la configuración actual. Los efectos son pintura al óleo, filtro gaussiano, posterización y estampado. Cada efecto se puede modificar de forma independiente. La semilla para el generador de números aleatorios puede ser cualquier número entero de 1 a 2 ^ 16.
Actualización : El filtro gaussiano, que suaviza los bordes, es ahora el último efecto de imagen aplicado. Con esta modificación, el efecto de posterización ya no era necesario y, por lo tanto, se eliminó.
Explicación
La explicación se basa en una versión ligeramente diferente, en la que se empleó la posterización y
GaussianFilter
se aplicó desde el principio. Pero aún sirve para aclarar cómo cada efecto de imagen altera una imagen. El resultado final es una textura de pintura con bordes más afilados. Cuando el filtro gaussiano solo se aplica al final, el resultado será más suave, como muestra la imagen de arriba.Veamos algunos efectos de imagen, uno a la vez.
Genera una imagen inicial.
Lena nos mostrará cómo cada efecto de imagen transforma una imagen realista.
Un efecto de pintura al óleo aplicado a Lena.
Un efecto de pintura al óleo aplicado a nuestra imagen aleatoria. El efecto se intensificó (16 en lugar de 8).
Un efecto de filtro gaussiano aplicado a Lena (no a la versión del efecto de pintura al óleo de Lena). El radio es de 10 píxeles. (En la versión final, en la parte superior de esta entrada, GaussianFilter se aplica como efecto final).
Un efecto de filtro gaussiano algo más suave aplicado a r1. El radio es de 5 píxeles.
Un intenso efecto de posterización aplicado a Lena. (En la versión final de la aplicación, eliminé la posterización. Pero la dejaremos en el análisis, ya que los ejemplos en el análisis se basaron en una versión anterior con posterización).
Un efecto de posterización aplicado a r2.
Estampado Lena
La grabación en relieve de r3 completa el procesamiento de la imagen. Esto tiene la intención de parecerse al techo del OP.
Para los curiosos, aquí está Lena con los mismos efectos de imagen aplicados.
fuente
RandomInteger
una semilla, garantizando así un rendimiento particular. ¿O quieres decir algo más, como una imagen inicial no aleatoria a la que se aplican los efectos?Lena will show us how each image effect transforms a life-like picture
me hizo LOL. Lo extraño es que la imagen final de Lena parece tener un azteca o inca mirando hacia la izquierda, con un tocado y armando una rama como si fuera un arma.POV-Ray
Mucho potencial de golf, corre con
povray /RENDER wall.pov -h512 -w512 -K234543
Primero crea una textura aleatoria, pero en lugar de detenerse allí, transforma la textura en un campo de altura 3D para hacer que las sombras radiales de la cámara destellen más realistas. Y, por si acaso, agrega otra textura de pequeñas protuberancias en la parte superior.
La única forma, aparte de codificar la semilla aleatoria, es usar la
clock
variable destinada a animaciones, esto se pasa con la-K{number}
banderafuente