He pensado que puede ser una buena idea crear arte generativo a partir de una fotografía para el segundo tutorial de la nueva categoría de arte generativo con Python.
Convertiremos una imagen PIL en un array Numpy.
Si nunca has oído hablar de estas librerías de Python no te preocupes, el ejemplo que vamos a crear es muy sencillo.
Modificar fotografía con Python
Antes de nada debemos entender la fotografía digital que vamos a utilizar como una serie de píxeles representados en pantalla, y cada uno de ellos relleno de un determinado color que se forma con 3 valores (RGB). Para rellenar estos valores RGB emplearemos la misma forma que hemos utilizado en el tutorial de arte generativo anterior.
Si abrimos una fotografía con algún editor de fotografías como por ejemplo Gymp (OpenSource y maravilloso) y haces mucho MUCHO zoom, podrás observar que cualquier fotografía digital «está formada por píxeles de diferentes colores repartidos».
En la mitad derecha de esta imagen se aprecia perfectamente esto que te digo.

¿Y si cambiamos el color de algunos de estos píxeles?
Para poder modificar el color de estos píxeles lo primero que debemos tener es acceso a ellos, la mejor forma es guardarlos en un array, que será lo siguiente que hagamos.
Imagen PIL en Array Numpy
Para transformar nuestra imagen en un array trabajaremos con las librerías PIL y Numpy.
import numpy as np
from PIL import Image
Ahora guardaremos la información correspondiente de cada píxel dentro de nuestro array.
image = Image.open('EneaRadio.png')
arr = np.array(image)
La fotografía base sin modificar con la que voy a trabajar es esta, un simple .png de 400 x 400 px.

Si accedemos a los valores del array y le modificamos su valor, podremos cambiar de color cada uno de los píxeles de nuestra imagen, dejando el resto sin modificar. No podemos olvidar que el valor de cada píxel está compuesto por un array de 3 valores (RGB).
Con la siguiente línea de código accederemos a las posiciones de nuestro array avanzando de 10 en 10 y cada píxel lo rellenaremos con un color RGB (100, 200, 100). Quedando la imagen como veremos a continuación.
arr[::10, ::10] = [100, 200, 100]

Recorremos nuestra imagen de izquierda a derecha y de arriba hasta abajo, para dar el salto de 10 en 10 píxeles y modificar el color recorremos el array utilizando [::10, ::10], haciendo referencia a los 2 ejes (x,y).
Vamos a configurar nuestros saltos de dos formas diferentes:
- [::1, ::10]
- [::10, ::1]


Ahora añadiremos un par de estructuras for para recorrer los 400 píxeles de nuestra imagen (ancho y alto).
for i in range(400):
for j in range(400):
arr[random.randint(i, 400), random.randint(j, 400)] = [100, 200, 100]

A nuestro diseño anterior le agregamos una línea más de código para dibujar píxeles con un color azul.
for i in tqdm(range(imagen_size)):
for j in range(imagen_size):
arr[random.randint(i, 400), random.randint(j, 400)] = [100, 200, 100]
arr[random.randint(1, 400), random.randint(1, 400)] = [50, 50, 200]

Podríamos decir que ya va tomando un aspecto bastante divertido. Los colores verde y azul de nuestra obra de arte generativo con Python están definidos de la siguiente forma.
- Para el verde [100, 200, 100]
- Para el azul [50, 50, 200]
Ahora vamos a indicarle que el relleno de colores sea completamente aleatorio y que cubra todo el rango de 0 a 255 para cada uno de estos dos colores. Quedando nuestro código de la siguiente forma.
Generative Art Python
Así ha quedado nuestro ejemplo, espero que disfrutes creando tus propias obras.
import numpy as np
from numpy import random
from PIL import Image
from tqdm import tqdm
image = Image.open('EneaRadio.png')
arr = np.array(image)
for i in tqdm(range(400)):
for j in range(400):
arr[random.randint(i, 400), random.randint(j, 400)] = [random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)]
arr[random.randint(1, 400), random.randint(1, 400)] = [random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)]
pil_image=Image.fromarray(arr)
pil_image.save('Untitled-generative.png')
pil_image.show()
