Google+ Seguidores

sábado, 11 de noviembre de 2017

Procesamiento de Imágenes con Python y Pillow

Introducción:

Python Imaging Library (abreviado como PIL ) (en versiones más recientes conocidas como Pillow) es una biblioteca gratuita para el lenguaje de programación Python que agrega soporte para abrir, manipular y guardar muchos formatos de archivos de imágenes diferentes. Está disponible para Windows, Mac OS X y Linux. La última versión de PIL es 1.1.7, fue lanzada en septiembre de 2009 y es compatible con Python 1.5.2-2.7, con soporte de Python 3 para ser lanzado "más tarde".

Pillow ofrece varios procedimientos estándar para la manipulación de imágenes. Éstas incluyen:
  • manipulaciones por pixel,
  • enmascaramiento y manejo de la transparencia
  • filtrado de imágenes, como borrosidad, contornos, suavizado o búsqueda de bordes,
  • mejora de la imagen, como nitidez, ajuste de brillo, contraste o color,
  • agregar texto a las imágenes y mucho más.
Puedes Descargar PILLOW para Python ingresando al siguiente enlace: PILLOW 4.3.0


Resultado de imagen para pillow python


En el día de hoy, te enseñare a usar el modulo Pillow para el procesamiento de imágenes, te mostrare lo básico para que te familiarices con el modulo, luego queda de tu parte experimentar y leer la documentación de Pillow.

Yo usare una imagen para realizar los ejemplos, puedes usar la imagen de tu preferencia, la cual puede tener formato: PNG, JPEG, PPM, GIF, TIFF y BMP.

Esta es la imagen que usare:


Si se preguntan ¿Porque una medusa?, pues es uno de mis animales favoritos, y uno de los más letales del mundo.

Mi objetivo, sera experimentar sobre esta imagen de esta medusa, la estaré modificando con ayuda de Pillow.

¿Listos? pues comencemos.

Mi Editor Pillow:

Muy bien, comencemos por el principio, por lo más basico.

Piensa en una imagen como un archivo de texto (txt), cuando quieres abrir, escribir o leer un archivo de texto con ayuda de python, ¿Que es lo primero que debes hacer? Lo primero primero que hacemos, es abrir el archivo con la función open() ¿Verdad?, luego ya podríamos leer o escribir en el archivo de texto.

Lo mismo debemos hacer para manipular las imágenes, el modulo "Image" de Pillow nos proporciona la función open() la cual recibe como argumento la ruta de la imagen, ¿Les recuerda a algo esa función open?. Sabiendo que el procedimiento del procesamiento de imágenes es similar al del procesamiento de archivos, seros sera más fácil comprender como funciona Pillow.

Ahora, un ejemplo sencillo, abriremos una imagen escribiendo unas 3 lineas de código:


Esa seria la sintaxis básica, para abrir y mostrar una imagen con Pillow.
En el código, lo primero que hago es importar el modulo "Image", luego con la función open(), abro la imagen, como pueden ver, en la ruta de la imagen, solo coloco el nombre de la imagen que es "medusa.jpg", esto es porque todo lo tengo en una misma carpeta. Por ultimo, para que la imagen se abra en el visor de imagen por defecto de tu sistema operativo, utilizamos la función show(). Al ejecutar el código, mi resultado fue el siguiente:


Como pueden observar, la imagen se a abierto  con el "Visualizador de fotos de Windows", esto variara dependiendo de tu sistema operativo. 

Increíble, ¿Verdad?. Pero ¿Pillow, solo hace esto? No señor, ya abrimos la imagen, llego la hora de manipularla.

Ahora, que te parece si rotamos esta imagen, tal vez se vea mejor si la rotamos un poco a la izquierda, para ello el modulo Image nos proporciona la función rotate(), veamos un ejemplo:


Al ejecutar, mi resultado es:


Muy fácil, ¿Verdad?. Pero, ¿Como haríamos para rotarla 90 grados hacia la derecha? Simplemente, en vez de colocar 90 grados, escribimos "-90" grados, así:



Muy bien, hay una cosa que quisiera aclarar. Como pueden ver en el código de arriba, a "img.rotate", lo e guardado en una variable (imgrotate), y se preguntaran ¿Porque? ¿Porque uso la función show() en "imgrotate" en vez de "img"? La respuesta es: SON IMÁGENES DIFERENTES. Sí, en cada modificación, se genera una imagen temporal por separado (eso se puede comprobar viendo el nombre del archivo en el encabezado del visualizador, siempre salen nombres como "tmp1tc2y3rx"), por esa razón, si vas a tu código, y en ves de usar a show() en "imgrotate" y la usas en "img", el script mostrara la imagen original. Es muy importante saber esto.

Como explique anteriormente, cada vez que modificamos la imagen, se genera un archivo temporal, pero ¿Como haría para guardar la imagen modificado?. Esto es muy facil, solo usamos la función save(fp) en donde el argumento "fp" es la ruta en donde quieres que se guarde la imagen modifica. Veamos un ejemplo:



Como pueden ver, en save(), e colocado "medusa 90.jpg", ese es el nombre con el que se guardo la imagen modificada, y a la derecha del código, les muestro la imagen guardada, si se fijan en el encabezado del programa visualizador, en vez de un nombre como "tmp928...", se muestra el nombre de mi archivo. Ahora si vamos a nuestro directorio podremos ver nuestra imagen:


Perfecto!!!.

Filtros:

Hora de trabajar con filtros, para ello, haremos uso del modulo ImageFilter, veamos un ejemplo sencillo.



Como pueden ver, se hace uso de la funcion "filter", a la cual le pasamos como argumento un filtro, el modulo "mageFilter" nos proporciona los siguientes filtros:
  • BLUR
  • CONTOUR
  • DETAIL
  • EDGE_ENHANCE
  • EDGE_ENHANCE_MORE
  • EMBOSS
  • FIND_EDGES
  • SMOOTH
  • SMOOTH_MORE
  • SHARPE
Ahora, usemos uno de los filtros mencionados anteriormente. Voy a usar el "EMBOSS", veamos como queda:



Como pueden ver, en ves de usar el filtro "MinFilter", coloco "EMBOSS", que seria el filtro de resaltar.

Ahora te invito a probar todos los filtros disponibles.


Muy bien, ahora hagamos algo más interesante, que les parece si dibujamos sobre nuestra imagen, eso seria divertido ¿Verdad? Para ello, usaremos el modulo "ImageDraw". Comencemos dibujando algo sencillo, que les parece una X en medio de nuestra imagen. Veamos como queda:



Puedes ver el código más legible ingresando al siguiente enlace: PILLOW DRAW.py.

Para lograr esa X perfecta, importamos el modulo "ImageDraw", para crear cada linea se usa la función "line" la cual toma como argumento 3 argumentos, los 2 primero son las coordenadas en su eje X e Y, el segundo (fill) seria la intensidad del color de cada linea, y el argumento width, seria la anchura de la linea.

Usemos otra función para dibujar, en vez de una linea, dibujemos escribamos un poco de texto. Así:




Puedes ver el codigo desde GitHub, ingresando al siguiente enlace: PILLOW-Draw-Text.py.

Analicemos un poco el código de arriba: Lo primero que hacemos es importar los módulos Image, ImageDraw, ImageFont. Abrimos nuestra imagen, y empezamos a escribir sobre ella. Antes se especifica el tipo de fuente, en este caso "Arial", luego especificamos su tamaño (80 pixeles). Luego en a la función text le pasamos sus argumentos (Las posiciones X e Y, el texto que deseas escribir sobre la imagen, el color del texto y la fuente). Por ultimo, mostramos la imagen modificada.




Fascinante, ¿Verdad? Pillow es una de las mejores opciones al momento de procesar y manipular imágenes, Pillow cuenta con muchos otros métodos a parte de los que te e mostrada, solo te mostré lo básica, para que vallas entendiendo la estructura básica de los módulos, no te limites, entra en la Documentación de PILLOW y sigue aprendiendo más sobre esta librería.

Comparte tu experiencia con nosotros dejando un buen comentario. Mi nombre es Luis, es fue un placer compartir mis conocimientos con todos ustedes.

4 comentarios :
Write comentarios
  1. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
    Respuestas
    1. Excelente, siempre emocionado de encontrar nuevas posibilidades con Python. Gracias por compartir tanto material útil sobre mi lenguaje de programación favorito. Te ganaste un fiel lector, saludos.

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
  2. Gracias Orlando, por visitar el blog. A seguir aprendiendo!!!. Saludos :D

    ResponderEliminar

Tu comentario es importante y nos motiva a seguir escribiendo...

Entradas más recientes

Powered by Blogger .