Tratamiento de imágenes
Introducción
PIL (Python Imaging Library) es un paquete que contiene varias funciones para manipular imágenes en un script Python.
Pero ¿cuál es la relación entre el tratamiento de imágenes y el Hacking o Forensic?
Una parte del Hacking, que también forma parte integrante del Forensic, es la esteganografía.
La esteganografía (del griego steganos, oculto y graphein, escritura) es el arte de ocultar un mensaje dentro de otro mensaje de carácter anodino, de modo que se disimule la propia existencia del secreto. Mientras que con la criptografía habitual la seguridad se basa en el hecho de que el mensaje no será comprendido, con la esteganografía, la seguridad se basa en el hecho de que el mensaje no se detectará.
Tendremos necesidad en algunos casos de estudiar las imágenes en un ordenador durante una búsqueda para tratar de detectar mensajes u otros elementos ocultos en ellas.
El análisis de captcha con PIL, junto con otras herramientas, nos permitirá eludir esta protección durante los accesos a sitios web. Como ejercicio analizaremos un caso de captcha.
El captcha es un medio muy utilizado (en casi todas partes) que permite (en teoría) evitar las acciones de robots, por lo tanto automatizadas en diferentes sitios web.
Utilización
1. La clase Image
PIL está incluido en las distribuciones de Linux en el paquete imaging (python-imaging).
La clase más importante de PIL es la clase Image, definida en el módulo con el mismo nombre. Podemos crear una instancia de esta clase de diferentes maneras: cargando la imagen a partir de un archivo, tratando otras imágenes o creando una imagen a partir de cero.
Para cargar una imagen a partir de un archivo, utilizaremos la función open.
La imagen siguiente se encuentra en la carpeta donde ejecuto el script Python.
>>> import Image
>>> im = Image.open("eni.jpg")
Si funciona de forma correcta, esta función devuelve un objeto imagen. Ahora podemos utilizar esta instrucción para examinar su contenido.
>>> print im.format, im.size, im.mode
JPEG (140, 140) RGB
Si la imagen ne se ha podido cargar, el atributo tendrá el valor None. El atributo size es una tupla que contiene width y height (en píxeles). El atributo mode define el número y los nombres de las clasificaciones de la imagen, y también el tipo de píxeles y la profundidad. Los modos más comunes son "L" (luminancia) para las imágenes en escala de grises, "RGB" para las imágenes en colores reales, y "CMYK" para las impresiones de imágenes.
Si el archivo no se puede abrir, se genera una excepción de tipo IOError.
Ahora tenemos una instancia de la clase Image, podemos utilizar los métodos definidos en esta clase para manipular y procesar la imagen.
Vamos a ver lo que hemos cargado:
>>> im.show()
La imagen aparece en una ventana aparte.
cap6_script1.py
import sys
from PIL import Image
PIL_Version = Image.VERSION
img_filename = "eni.jpeg"
im = Image.open(img_filename)
im.show()
2. Leer y escribir
PIL soporta una gran variedad de tipos de imágenes. Para leer el archivo del disco, utilizaremos la función open del módulo Image. No necesitamos conocer el formato del archivo para abrirlo. La librería determina automáticamente el formato basándose en el contenido del archivo.
Para guardar el archivo utilizaremos el método save. Cuando guardamos el archivo, el nombre cobra importancia....
Ejemplos de uso
1. Creación de un captcha
El objetivo del captcha es crear una imagen legible por el hombre pero no legible o muy difícilmente por un "robot". Es un mecanismo (casi) seguro de verificar que un humano es quien se conecta a un sitio, por ejemplo.
Las explicaciones de cada parte del script están en los comentarios del mismo.
cap6_script5.py
#!/usr/bin/env python
#--*-- coding:UTF-8 --*--
import Image,ImageDraw,ImageFont
# creación del fondo de la imagen
image = Image.new('RGB', (300, 80), (220,210,190))
draw = ImageDraw.Draw(image)
# Creación del texto
textImg = Image.new('RGB',(150,40),(0,0,0))
tmpDraw = ImageDraw.Draw(textImg)
textFont = ImageFont.truetype('/var/lib/defoma/x-ttcidfont-
conf.d/dirs/TrueType/Arial_Black.ttf',30)
tmpDraw.text((0, 0), 'ENI Ed.', font = textFont, fill = (10,200,200))
textImg = textImg.rotate(-10)
# Creación de la máscara (mismo tamaño que la imagen del texto)
mask = Image.new('L',(150, 40),0)
mask.paste(textImg,(0,0))
# pegar en la imagen con el texto
image.paste(textImg,(100,0),mask)
image.save('ENI.jpg')
2. Captura de Imagen y transformación
Vamos a utilizar en este script otra librería llamada python-opencv que nos permitirá tomar una foto con la webcam y luego tratar esta imagen.
cap6_script6.py
#!/usr/bin/env python
#--*-- coding:UTF-8 --*--
import os,time ...