Manipulación y procesamiento de imágenes con Python y Scipy

Introducción:

Hola amigos de Internet, les doy la bienvenida a Mi Diario Python, el mejor log para Aprender Python.
En este articulo, veremos como manipular y procesar imágenes utilizando la librería scipy. Veremos cuales son los métodos que nos permitirán manipular nuestras imágenes con una serie de ejemplos.
Sera muy fácil y sencillo, ya veras.

Manipulación de imágenes con scipy:

Lo primero que necesitamos, es disponer de scipy. Podemos instalar esta librería a través de PiPy ejecutando el siguiente comando en nuestra terminal:
pip install scipy

Muy bien, una vez que dispongamos de scipy, podremos utilizar todos sus métodos.

Abriendo imágenes:

Lo más sencillo que podemos hacer, y se puede decir que es lo más importante, es abrir la imagen.
Como sabemos, las computadoras no pueden "ver" las imágenes para procesarlas. Todo funciona mediante números. Por lo que siempre que abrimos una imagen lo que sucede es que pasa por una serie de procedimientos lo cual convierte a la misma en un tipo de dato que la computadora pueda comprender.
 ¿Con que quiero llegar a todo esto? Al abrir una imagen, lo que scipy hará sera procesarla, y convertirla en un array numpy. Veamos como se hace:
# Convertir una imagen a un array

# Importamos a misc
from scipy import misc

# Leemos la imagen
img = misc.imread('dog.jpg')

# Tipo de dato de la variable "img"
type(img)
numpy.ndarray
Muy bien, de esta manera, pasamos una imagen, a una serie de datos.
Pero ahora que converitmos una imagen a una serie de numeros, quien dice que no podemos hacer lo contrario.
Para ello utilizaremos un método llamada face el cual nos proporciona el mismo scipy. Face es una serie de datos que utilizaremos como ejemplo para convertirlo en una imagen:
# Convertir un array a una imagen
from scipy import misc

img_s = misc.face()
misc.imsave("image_s.png", img_s)
Lo que hacemos es guardar los datos, que face nos devuelve, es una variable. Luego utlizamos el método imsave, al cual recibe como argumento dos valores. El nombre del archivo y el array numpy de la imagen.
¿Y la imagen? La imagen se guardara en el directorio en que estés ejecutando estos códigos. El resultado es el siguiente:
Un perro muy bonito... Jajaja no, es obvio que no es un perro (es una iguana). 

Mostrando la imagen:

Ya que tenemos los datos de la imagen (array) podemos utilizar librerías que representen estos datos.
Que mejor que matplotlib.
#Importamos matplotlib
import matplotlib.pyplot as plt

# Imagen en escala de grises
gray = misc.face(gray=True)

# Mostramos la imagen
plt.imshow(gray,cmap=plt.cm.gray)
plt.show()

Manipulación:

Ahora que tenemos la imagen en un formato que la computadora puede entender, es moemento de manipular estos datos.
# Importamos numpy
import numpy as np

face = misc.face(gray=True)

lx, ly = face.shape
X, Y = np.ogrid[0:lx, 0:ly]
mask = (X - lx / 2) ** 2 + (Y - ly / 2) ** 2 > lx * ly / 4

face[mask] = 0

# Cambiamos los bits de la imagen
# Para hacer el efecto del circulo
face[range(400), range(400)] = 255

# Mostramos la iamgen modificada
plt.imshow(face)
plt.show()
Este es un ejemplo sencillo, como podemos ver, lo que hacemos es sustituir algunos pixeles de la imagen. 
Para terminar, hagamos algunas transformaciones geométricas:
from scipy import ndimage

# Rotación de la imagen
img = misc.face(gray=True)

rotate_img_90 = ndimage.rotate(img, 90)
rotate_img_45 = ndimage.rotate(img, 45)

plt.imshow(rotate_img_90)
plt.show()
Con el método rotate de ndimage podemos rotar una imagen como nosotros queramos.
En el ejemplo anterior la rotación es de 90°.
Veamos uno de 45°:
from scipy import ndimage

# Rotación de la imagen
img = misc.face(gray=True)

rotate_img_90 = ndimage.rotate(img, 90)
rotate_img_45 = ndimage.rotate(img, 45)

plt.imshow(rotate_img_45)
plt.show()
Muy bien, excelente.
¿Que opinas? Muy fácil ¿No crees?
¿Alguna duda? No dudes en dejar tu comentario.
Mi nombre es Luis, y fue un placer compartir mis conocimientos con todos ustedes :D.
Referencias: http://www.scipy-lectures.org/advanced/image_processing/.
  1. Ander dice:

    Gracias por compartir vuestro conocimiento con nosotros. Es una filosofia muy buena para poder avanzar juntos, y aprender todos.
    Lo dicho muchas gracias.

  2. Ander dice:

    Hola Tengo una duda razonable, he estado utilizando el metodo face, y he cogido una foto de un camino de un monte y me ha modificado la foto y dentro está la iguana. la miniatura cuando está cerrado el fichero sige siendo la misma foto del camino. ¿Por que?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir

Te has suscrito correctamente al boletín

Se produjo un error al intentar enviar tu solicitud. Inténtalo de nuevo.

Mi Diario Python will use the information you provide on this form to be in touch with you and to provide updates and marketing.