¿Cómo crear una imagen desde cero con Python?

In [68]:
import matplotlib.pyplot as plt
import matplotlib.image as image
import numpy as np

img = np.zeros((120,120,3))

for i in range(img.shape[0]):
    for j in range(img.shape[1]):
        if i < j:
            img[i][j] = np.array([1,1,1])

plt.imshow(img)
plt.show()

La crear una imagen es simplemente trabajar un un array de 3 dimensiones donde la ultima dimension es de tamaño 3.

Para pintar de color entro el valor es (0,0,0) y para pintar de color blanco es (1,1,1)

¿Cómo guardar una imagen en Python?

In [8]:
import matplotlib.pyplot as plt
import matplotlib.image as image
import numpy as np

img = image.imread("img/banana.png")

# porcesando 
img2 = np.zeros(img.shape)
for i in range(img.shape[0]):
    for j in range(img.shape[1]):
        if sum(img[i][j]) > 1.5:
            img2[i][j] = np.array([0,0,1])
        else:
            img2[i][j] = np.array([0,0,0])

fig, axs = plt.subplots(1, 2)
axs[0].imshow(img)
axs[1].imshow(img2)
plt.savefig('imagen.png')

Para guardar una imagen, simplemente usamos savefig de matplotlib.

¿Cómo convertir una imagen de colores a Blanco y Negro?

In [12]:
import matplotlib.pyplot as plt
import matplotlib.image as image
import numpy as np

img = image.imread("img/banana.png")
img2 = np.zeros(img.shape)

for i in range(img.shape[0]):
    for j in range(img.shape[1]):
        if sum(img[i][j]) > 1.5:
            img2[i][j] = np.array([1,1,1])
        else:
            img2[i][j] = np.array([0,0,0])

fig, axs = plt.subplots(1, 2)
axs[0].imshow(img)
axs[1].imshow(img2)
plt.show()

Vamos paso a paso, primero mostrar la imagen

In [4]:
import matplotlib.pyplot as plt
import matplotlib.image as image
import numpy as np

img = image.imread("img/banana.png")

plt.imshow(img)
plt.show()

Tenemo que tener en cuenta que el array que contiene la imagen es de 3 dimensiones.

  • La primera es para las filas
  • La segunta para las columnas
  • La tercera es para guardar el valor del color

El color se guarda en el formato RGB y el valor va de 0.0 a 1.0

Entonces para considerar que se pintará un pixel en color blanco(1,1,1), comprobamos que la suma sea mayor a 1.5 y en caso contrario sera negro(0,0,0)

In [83]:
import matplotlib.pyplot as plt
import matplotlib.image as image
import numpy as np

img = image.imread("img/banana.png")
img2 = np.zeros(img.shape)

for i in range(img.shape[0]):
    for j in range(img.shape[1]):
        if sum(img[i][j]) > 1.5:
            img2[i][j] = np.array([1,1,1])
        else:
            img2[i][j] = np.array([0,0,0])

fig, axs = plt.subplots(1, 2)
axs[0].imshow(img)
axs[1].imshow(img2)
plt.show()

Podemos variar el punto limite(umbral), y ver como se muestra la imagen. Para facilitar esto podemos crear una funcion que nos retorna la imagen procesada.

In [10]:
import matplotlib.pyplot as plt
import matplotlib.image as image
import numpy as np

def getImg(img, umbral):
    img2 = np.zeros(img.shape)
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            if sum(img[i][j]) > umbral:
                img2[i][j] = np.array([1,1,1])
            else:
                img2[i][j] = np.array([0,0,0])
    return img2

img = image.imread("img/banana.png")

fig, axs = plt.subplots(1, 4)
axs[0].imshow(img)
axs[1].imshow(getImg(img,1.0))
axs[2].imshow(getImg(img,1.5))
axs[3].imshow(getImg(img,2.0))
plt.show()