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.
Clave | Tipo de imagen |
1 | 1-bit por pixel, blanco y negro, almacena 1 pixel/byte |
L | 8-bit por píxel, blanco y negro |
P | 8-bit por píxel, asignada a cualquier otro modo usando una paleta de colores |
RGB | 3x8-bit por píxel, color verdadero |
RGBA | 4x8-bit por píxel, color verdadero con true color con máscara de transparencia |
CMYK | 4x8-bit por píxel, separación de colores |
YCbCr | 3x8-bit por píxel, formato de vídeo en color |
LAB | 3x8-bit por píxel, the L*a*b color space |
HSV | 3x8-bit por píxel, Hue, Saturation, Value color space) |
I | 32-bit signed integer pixels |
F | 32-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)