2008-12-03 16 views
38

A veces dos archivos de imagen pueden ser diferentes en un nivel de archivo, pero un ser humano los consideraría perceptivamente idénticos. Dado que, ahora supongamos que tiene una gran base de datos de imágenes, y desea saber si un ser humano pensaría que alguna imagen X está presente en la base de datos o no. Si todas las imágenes tuvieran un hash perceptivo/huella dactilar, entonces se podría usar el hash de la imagen X y sería una cuestión simple de ver si está en la base de datos o no.Detectando si dos imágenes son visualmente idénticas

Sé que hay investigaciones sobre este tema, y ​​existen algunos algoritmos, pero ¿hay alguna herramienta, como una herramienta de línea de comandos de UNIX o una biblioteca que pueda usar para calcular un hash sin implementar algún algoritmo desde cero?

edición: código relevante de findimagedupes, usando ImageMagick

try $image->Sample("160x160!"); 
try $image->Modulate(saturation=>-100); 
try $image->Blur(radius=>3,sigma=>99); 
try $image->Normalize(); 
try $image->Equalize(); 
try $image->Sample("16x16"); 
try $image->Threshold(); 
try $image->Set(magick=>'mono'); 
($blob) = $image->ImageToBlob(); 

edición: Advertencia! El objeto imagen ImageMagick $ parece contener información sobre el tiempo de creación de un archivo de imagen que se leyó. Esto significa que el blob que obtenga será diferente incluso para la misma imagen, si se recuperó en un momento diferente. Para asegurarse de que la huella digital permanezca igual, use $ image-> getImageSignature() como último paso.

+1

Este procedimiento suena extremadamente intensivo en el procesador. – endolith

+0

* Esto significa que el blob que obtenga será diferente incluso para la misma imagen, si se recuperó en un momento diferente. * Esto no es cierto para la cadena '" $ blob "' (si está entre comillas dobles), que serán exactamente los mismos 32 bytes si los píxeles de la imagen son iguales. – pts

Respuesta

14

findimagedupes es bastante bueno. Puede ejecutar "findimagedupes -v imágenes de huellas digitales" para permitirle imprimir "hash perceptivo", por ejemplo.

+0

Exactamente el mismo algoritmo implementado en Python (con GraphicsMagick haciendo el trabajo pesado) aquí: https://github.com/pts/pyfindimagedupes – pts

-2

Puede usar diff para ver si son REALMENTE diferentes ... Supongo que eliminará muchas comparaciones inútiles. Luego, para el algoritmo, usaría un enfoque probabilístico ... ¿cuáles son las probabilidades de que se vean iguales? Lo basé en la cantidad de rgb en cada píxel. También podría encontrar otras métricas como la luminosidad y cosas así.

1

No sé el algoritmo detrás de él, pero Microsoft Live Image Search solo added esta capacidad. Picasa también tiene la capacidad de identificar caras en imágenes y caras de grupos que se ven similares. La mayoría de las veces, es la misma persona.

Algunas tecnologías de aprendizaje automático como una máquina de vector de soporte, red neuronal, clasificador Bayes ingenuo o red bayesiana serían las mejores en este tipo de problema. He escrito uno de los primeros tres para clasificar los dígitos manuscritos, que es esencialmente el reconocimiento de patrones de imágenes.

0

cambiar el tamaño de la imagen a un 1x1 píxel ... si son exactos, hay una pequeña probabilidad de que sean la misma imagen ... ahora cambie el tamaño a una imagen de 2x2 píxeles, si los 4 píxeles son exactos, hay es una probabilidad mayor de que sean exactos ... luego 3x3, si los 9 píxeles son exactos ... buena probabilidad, etc. luego 4x4, si los 16 píxeles son exactos, ... mejor posibilidad.

etc ...

hacerlo de esta manera, puede hacer alguna mejora de eficiencia ... si la cuadrícula de 1x1 píxeles está fuera por una gran cantidad, ¿por qué molestarse en comprobar cuadrícula de 2x2? etc.

+0

Esto no funcionará en los casos en que una imagen se haya ajustado ligeramente, por lo que es levemente más oscuro o más saturado, o se ha recortado una pequeña cantidad. También debe tener en cuenta que el remuestreo es una tarea costosa, especialmente cuando se usa la interpolación bicúbica en imágenes grandes. –

+0

Sin duda, el primer paso sería reducir la imagen original a un tamaño mínimo. No es necesario que una imagen de "árbol en una colina" sea de 10 gb para distinguirla de una imagen de "flor en un montículo". – willc2

-2

Hay DPEG, "El" Administrador de medios duplicados, pero su código no está abierto. Es una herramienta muy antigua. Recuerdo que la usé en 2003.

+2

¿Por qué los dos votos a favor? El usuario estaba pidiendo una herramienta de línea de comandos, no una solución de programación. –

+0

@pts: el enlace no se rompió para mí; redirigido al enlace actual. He actualizado la respuesta de todos modos. –

0

Si tiene muchas imágenes, se podría utilizar un histograma de color para obtener una aproximación aproximada de las imágenes antes de hacer una comparación de imagen completa de cada imagen una contra otra (es decir, O (n^2)).

4

El histograma de color es bueno para la misma imagen que ha sido redimensionada, remuestreada, etc.
Si quieres unir las fotos de diferentes personas del mismo punto de referencia, es más complicado: mira los clasificadores de haar. Opencv es una gran biblioteca gratuita para el procesamiento de imágenes.

5

La correlación cruzada o la correlación de fase le dirá si las imágenes son las mismas, incluso con ruido, degradación y desplazamientos horizontales o verticales. Usar los métodos basados ​​en FFT lo hará mucho más rápido que el algoritmo descrito en la pregunta.

Sin embargo, el algoritmo usual no funciona para imágenes que no tienen la misma escala o rotación. Podrías rotarlas o escalarlas previamente, pero eso es realmente intensivo para el procesador. Aparentemente, también puedes hacer la correlación en un espacio log-polar y será invariable para rotación, traducción y escala, pero no conozco los detalles lo suficiente como para explicar eso.

MATLAB ejemplo: Registering an Image Using Normalized Cross-Correlation

Wikipedia llama a esto "phase correlation" y también describe making it scale- and rotation-invariant:

El método puede ser extendido para determinar la rotación y las diferencias de escala entre dos imágenes convirtiendo primero las imágenes para conectarse -coordenadas polares. Debido a las propiedades de la transformada de Fourier, los parámetros de rotación y escalado se pueden determinar de manera invariante para la traducción.

Cuestiones relacionadas