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