Generador de imágenes aleatorias

14

Estoy generando datos aleatorios e intento convertirlos en una imagen PNG usando:

head -c 1MB < /dev/urandom | hexdump -e '16/1 "_x%02X"' | sed 's/_/\\/g; s/\\x  //g; s/.*/    "&"/' | tr -d "\"" | display -depth 8 -size 1000x1000+0 rgb:-

Este comando siempre muestra una imagen grisácea con algunos píxeles RGB. Qué estoy haciendo mal ?

Mi objetivo final es generar al menos una imagen con datos aleatorios.

pxoto
fuente
Definir "al azar". El promedio visual de un grupo de valores RGB aleatorios tenderá hacia el gris, después de todo.
Comodín
Eso es lo que pensé, pero no pude confirmar esta teoría ya que cada imagen se ve casi igual.
pxoto
Hace 15 años hice algo similar en Basic (Chipmunk Basic, para ser específicos). Tenía una pequeña ventana gráfica y seguía enviando un píxel de color aleatorio a una ubicación aleatoria. El resultado fue una imagen en constante cambio que todavía se veía esencialmente igual todo el tiempo, como el color estático en un televisor antiguo. No es realmente gris, sino de color estático .
Comodín el
Me las he arreglado para generar algo de estática, pero las imágenes en su mayoría siguen siendo grises.
pxoto

Respuestas:

17

En primer lugar, debe alimentar display RGB:-bytes sin procesar, no una cadena hexadecimal codificada como la que está construyendo con esa hexdump | sed | trtubería.

En segundo lugar, no le está dando suficientes bytes: necesita 3 bytes por píxel, uno para cada canal de color.

Esto hace lo que quieres:

mx=320;my=256;head -c "$((3*mx*my))" /dev/urandom | display -depth 8 -size "${mx}x${my}" RGB:-

Para guardar directamente en PNG, puede hacer esto:

mx=320;my=256;head -c "$((3*mx*my))" /dev/urandom | convert -depth 8 -size "${mx}x${my}" RGB:- random.png

Aquí hay una imagen de salida típica:

Imagen RGB generada a partir de / dev / urandom


Si desea hacer una animación, no es necesario crear y guardar cuadros individuales. Puede alimentar una secuencia de bytes sin procesar directamente a ffmpeg / avconv, p. Ej.

mx=320; my=256; nframes=100; dd if=/dev/urandom bs="$((mx*my*3))" count="$nframes" | avconv -r 25 -s "${mx}x${my}" -f rawvideo -pix_fmt rgb24 -i - random.mp4
PM 2Ring
fuente
No puedo creer que realmente lo hayas resuelto, estaré estudiando el comando para descubrir cómo funciona.
pxoto