Páginas

jueves, 29 de marzo de 2012

Reconocimiento de imagenes: pHash

Hola, hoy vamos a hablar sobre el reconocimiento de imágenes, y más en concreto del perceptual hashing.
Para ello vamos a hacer uso de una librería de código abierto llamada pHash.

El perceptual hashing funciona de manera diferente a los hash que se usan para funciones criptográficas o para verificación de la integridad de unos datos.
Por ejemplo, si generamos un hash MD5 para verificar la integridad de una imagen y luego a esta imagen le cambiamos un pixel, cuando verifiquemos la integridad comparando los dos hash MD5 veremos que son totalmente distintos.

Este es el hash MD5 de una imagen
640bee54f064dbdea9b960605a81eb50

Y este el el hash MD5 cambiando un pixel
89239f21cd39e020e85fe4b0c57a0f39

Pero si calculamos el hash de las dos usando pHash el resultado es idéntico, las dos imágenes dan el mismo resultado.

El perceptual hashing se basa en la percepción humana para la obtención del hash, esto quiere decir que cuanto mas se parezcan dos imágenes mas se parecerán sus respectivos hash. De esta manera seremos capaces obtener una medida exacta que nos permita comparar la similitud entre dos imágenes.



Con pHash podremos realizar diversas funciones pero las mas importantes serán la obtención del hash de la imagen y la comparación de dos hashes para obtener su similitud. Cuando las imágenes sean idénticas nos devolverá como resultado el número 0, y cuanto mayor sea el numero mayor serán las diferencias existentes entre las imágenes comparadas.

La librería puede ser usada en C#, Java y PHP. Podéis ver una demostración en PHP aquí
Al final del artículo encontraréis los enlaces para descargaros el código fuente y los ejemplos.

Estas son las dependencias que tendréis que tener instaladas para que no os de problemas:

g++, cimg-dev, ffmpeg, libavcodec-dev, libavformat-dev, libswscale-dev, libsamplerate-dev, libmpg123-dev, php5-dev

En cuanto se haya compilado correctamente obtendremos la librería pHash.so que tendremos que incluir en el fichero php.ini en la sección Dinamyc Extension y reiniciar el servidor web.
Si todo salió correctamente debería de aparecernos en la información de php la información de la librería.




 En los ejemplos que os podéis descargar reducimos las imágenes para que las dos sean del mismo tamaño, para ello se hace uso de la librería GD (php5-gd). Así que si queréis probar los ejemplos también es necesario instalar esta librería.

Una vez  este todo listo podremos usar las siguientes funciones para trabajar con las imágenes.

ph_dct_imagehash(imagen1); Esta función nos devuelve el hash de la imagen que le entreguemos como argumento.

ph_image_dist(hash1, hash2); Aquí compara dos hash y nos devuelve la similitud entre las dos imágenes.

Con esto ya tenemos lo basico para poder empezar a crear aplicaciones usando pHash. Podemos hacer comparaciones puntuales como en la demostración que os he enlazado antes, pero lo mejor es crear una base de datos donde almacenar los hashes y su información. Cuantas mas imágenes tengamos catalogadas mayor sera la capacidad de reconocimiento de nuestra aplicación.
Si lo que deseamos es reconocer objetos será necesario tener varias fotografías del mismo, desde distintos ángulos y con varias iluminaciones, y almacenarlas con su hash correspondiente.

Ademas de imágenes pHash también puede trabajar con vídeo y audio, podéis leer mas sobre estas funciones en su web.

Os podéis descargar de aquí el código fuente y los ejemplos de la demostración.

Otra librería para reconocimiento de imágenes es libpuzzle, os incluyo ejemplos para ella también en la descarga. Podéis instalarla de los repositorios de Debian directamente.

Si queréis hacer alguna pregunta podéis dejarla en los comentarios.

Un saludo

1 comentario:

Anónimo dijo...

Hola oye esta chechando tu post pero tus en laces estan roto :(