martes, 16 de diciembre de 2014

Fundamentos para procesar imágenes con Pillow (II)




Después de ver en el capítulo anterior algunas funciones de edición de imágenes del módulo Image, vamos a mostrar qué hacer para convertir nuestras imágenes de formato y de tipo. Para ello, es importante comprender que no siempre es posible cambiar una imagen de formato. En ocasiones para poderlo hacer tendremos que cambiar antes su tipo.

Para concluir mostraremos algunos ejemplos en los que se utilizan funciones que aplican filtros a las imágenes, que pertenecen al módulo ImageFilter.

 

Tipos de imágenes y formatos



Los formatos de las imágenes que se pueden procesar con Pillow son los de uso más extendido (BMP, EPS, GIF, IM, JPEG, MSP, PCX, PNG, TIFF, PPM, WebP, ICO, PSD, PDF, etc). Los tipos de imágenes dependen sobre todo del número de bits que se utilizan para representar la unidad de información de una imagen o píxel.

ClaveTipo de imagen
11-bit por pixel, blanco y negro, almacena 1 pixel/byte
L8-bit por píxel, blanco y negro
P8-bit por píxel, asignada a cualquier otro modo usando una paleta de colores
RGB3x8-bit por píxel, color verdadero
RGBA4x8-bit por píxel, color verdadero con true color con máscara de transparencia
CMYK4x8-bit por píxel, separación de colores
YCbCr3x8-bit por píxel, formato de vídeo en color
LAB3x8-bit por píxel, the L*a*b color space
HSV3x8-bit por píxel, Hue, Saturation, Value color space)
I32-bit signed integer pixels
F32-bit floating point pixels


Convertir imágenes

 

Convertir el tipo de imagen y su formato:



No todos los tipos de imagen son compatibles con cualquier formato. En el ejemplo siguiente la imagen de tipo "P" y con formato PNG no puede convertirse a JPEG:

amapolas.png

imagen = Image.open("amapolas.png")  # Se abre la imagen PNG
imagen.mode  # Comprobamos el modo de la imagen: P
imagen.save("amapolas-8bit.jpg") # Se intenta cambiar formato, a JPEG


Se intenta cambiar de formato, a JPEG pero se produce la siguiente excepción porque no es posible convertir la imagen:

OSError: cannot write mode P as JPEG

Si embargo, si antes la convertimos a "RGB" podremos convertirla a JPEG.

imagenrgb = imagen.convert("RGB")
imagenrgb.mode   # RGB
imagenrgb.save("amapolasrgb.jpg")


amapolasrgb.jpg

 

Cambiar el formato de una imagen directamente:


Para convertir de formato una imagen también puede hacerse así:

try:
    Image.open("amapolas-in.png").save("amapolas-out.jpg")

except IOError:
    print("No se puede convertir la imagen")


Cambiar una imagen de color RGB a Blanco/Negro



imagen = Image.open("amapolasrgb.jpg")
imagen.mode -> RGB
imagenbn = imagen.convert("L")
imagenbn.show()
imagenbn.save("amapolasbn.jpg")




Filtros


Para aplicar con Pillow un filtro a una imagen se utiliza el módulo ImageFilter

Debemos tener en cuenta que, a veces, cuando se aplica un filtro los cambios a observar serán más o menos sutiles en función al tipo de imagen que procesemos.

Para los ejemplos utilizaremos la siguiente imagen:



BLUR: Desenfocar una imagen:



from PIL import Image, ImageFilter
imagen = Image.open("pintando.jpg")
desenfocada = imagen.filter(ImageFilter.BLUR)
desenfocada.show()
desenfocada.save("desenfocada.jpg")



CONTOUR: Marcar contornos:



contorneada = imagen.filter(ImageFilter.CONTOUR)
contorneada.show()
contorneada.save("contorneada.jpg")



DETAIL: Resaltar detalle:



detallar = imagen.filter(ImageFilter.DETAIL)
detallar.show()
detallar.save("detallada.jpg")



EDGE_ENHANCE y EDGE_ENHANCE_MORE: Realzar bordes:



realzarbordes = imagen.filter(ImageFilter.EDGE_ENHANCE_MORE)
realzarbordes.show()
realzarbordes.save("realzarbordes.jpg")



EMBOSS: Obtener relieve:



relieve = imagen.filter(ImageFilter.EMBOSS)
relieve.show()
relieve.save("relieve.jpg")




FIND_EDGES: Buscar límites:



limites = imagen.filter(ImageFilter.FIND_EDGES)
limites.show()
limites.save("limites.jpg")




SMOOTH y SMOOTH_MORE: Suavizar la imagen:



suavizar = imagen.filter(ImageFilter.SMOOTH_MORE)
suavizar.show()
suavizar.save("suavizar.jpg")





SHARPEN: Afinar:


afinar = imagen.filter(ImageFilter.SHARPEN)
afinar.show()
afinar.save("afinar.jpg")





Continuar en: Fundamentos para procesar imágenes con Pillow (y III)

Ir al índice del tutorial de Python

5 comentarios:

Francisco de Soto dijo...

Recomiendo a todos, pero muy especialmente a quienes no tienen experiencia en trabajar con imágenes desde un programa, o que han sufrido las numerosas y desalentadoras complejidades que requieren otros entornos de programación, que conozcan lo increíblemente fácil que es el tratamiento de imágenes utilizando las funcionalidades de la biblioteca Pillow para Python, tanto para las tareas más sencillas de manejo de imágenes como para crear "efectos especiales".
Al respecto agradezco muy especialmente a Antonio Suárez Jiménez por la claridad y detalle de las explicaciones que permiten una rápida comprensión y utilización de estas valiosas herramientas.
Y para quienes; como yo; han tenido problemas para instalar Pillow mediante pip en versiones desde la 3.4 para atrás, por el problema de las comillas, les comento que en la la versión 3.5.1 de Python todos esos problemas están solucionados y la instalación se resuelve con la facilidad que esperamos de uno de los mejores lenguajes de programación de la actualidad.

Pherkad dijo...

Francisco, desde luego Python es una buena opción, por Pillow y por la infinidad de módulos que hay para todo tipo de proyectos.

Muchas gracias ;-))

J. Mendoza dijo...

Muchas gracias por el gran detalle de tus enseñanzas , quisiera saber mas sobde el tema pero adentrandome mas en las funciones , quisiera saber manejar el procesamiento de imagenes a nivel de matriz, y jugar con los pixeles en lugar de hacer llamadas al modulo pil, sabes donde puedo consultar ese tipo de informacion?

Pherkad dijo...

Con PIL puedes trabajar a nivel de pixel (1); contando con la ayuda del módulo Numpy (2). También, hay otras opciones como Numpy con Scipy (3), o con OpenCV (4) y más

1.- https://en.wikibooks.org/wiki/Python_Imaging_Library/Editing_Pixels

2.- http://code.activestate.com/recipes/577591-conversion-of-pil-image-and-numpy-array/

3.- http://pybonacci.github.io/scipy-lecture-notes-ES/advanced/image_processing/index.html

4.- http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_core/py_basic_ops/py_basic_ops.html

J. Mendoza, muchas gracias.

Franco Pardo dijo...

Hola Amigo, me gustaría saber si me puedes ayudar, resulta que estoy trabajando con imágenes en python a las cuales les debo aplicar efectos, pero sin utilizar librerías como PIL. a lo que me refiero es que busco el "código" tras la función de la biblioteca PIL. por ejemplo tu a una imagen le aplicas este comando ImageFilter.EMBOSS y te realiza inmediatamente un efecto , lo que yo quiero saber es como se llega a eso que utiliza.
De verdad que me seria de bastante ayuda, me has ayudado a resolver bastantes dudas con tus explicaciones pero me falta esa parte para estar completo. Muchas Gracias Saludos