Procesamiento de Imágenes con Python y Pillow

Índice

    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 básico.

    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 función "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.

    1. Unknown dice:

      Este comentario ha sido eliminado por el autor.

      1. Unknown dice:

        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.

      2. Unknown dice:

        Este comentario ha sido eliminado por el autor.

    2. Luis Salcedo dice:

      Gracias Orlando, por visitar el blog. A seguir aprendiendo!!!. Saludos 😀

    3. Ramiro A. Pegu dice:

      Gracias

    4. Anónimo dice:

      podrías hacer para poder adelgazar una imagen , por favor?

    5. Anónimo dice:

      Este comentario ha sido eliminado por el autor.

    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.