8

estoy tratando de calcular la similitud (léase: distancia Levenshtein) de dos imágenes, utilizando Python 2.6 y PIL.la comparación de imágenes (similares) con Python/PIL

Planeo nosotros e la biblioteca python-levenshtein para una comparación rápida.

pregunta principal:

¿Qué es una buena estrategia para la comparación de imágenes? Mi idea es algo así como:

  • Convertir a RGB (transparente -> blanco) (o tal vez convertir a blanco y negro?)
  • Escala hasta el más pequeño al tamaño de la mayor
  • Convertir cada canal (= el único canal, si se convierte a monocromo) a una secuencia de (valor del artículo = valor de color del píxel)
  • calcular la distancia Levenshtein entre las dos secuencias

Por supuesto, esto no va a manejar los casos como Reflejé magos, imágenes recortadas, etc. Pero para una comparación básica, esto debería ser útil.

¿Existe alguna estrategia mejor documentada en alguna parte?

EDIT: Aaron H tiene razón sobre el problema de la velocidad. El cálculo de Levelshtein toma casi una eternidad para imágenes más grandes que unos cientos por algunos cientos de píxeles. Sin embargo, la diferencia entre los resultados después de la reducción de escala de 100x100 y 200x200 es inferior a 1% en mi ejemplo, por lo que podría ser conveniente establecer un tamaño de imagen máximo de ~ 100 px o así ...

EDIT: Gracias PreludeAndFugue, esa pregunta es lo que estaba buscando.

Por cierto, la distancia de Levenshtein puede optimizarse, parece, pero me está dando resultados realmente malos, tal vez porque hay muchos elementos redundantes en los fondos. Tengo que mirar algunos otros algoritmos.

EIDT: La desviación cuadrática media de la raíz y la relación pico señal/ruido parecen ser otras dos opciones que no son muy difíciles de implementar y aparentemente no son muy costosas para la CPU. Sin embargo, parece que voy a necesitar algún tipo de análisis de contexto para reconocer formas, etc.

De todos modos, gracias por todos los enlaces, y también por señalar la dirección hacia NumPy/SciPy.

+1

No puedo responder directamente, pero sospecho que debido a la pérdida de precisión de los datos en la ampliación, tendrá mucha "distancia" entre los dos, donde reducir la escala más grande puede dar como resultado relación más cercana entre los dos. - En cuanto a la distancia de Levenshtein, no tengo idea, pero esta cita de Wikipedia me hace escéptico en cuanto a su utilidad en esta aplicación: "La distancia de Levenshtein también se puede calcular entre dos cadenas más largas, pero el costo de calcularla, que es aproximadamente proporcional al producto de las dos longitudes de cuerda, lo hace poco práctico ". –

+0

Esta pregunta puede ayudar: http://stackoverflow.com/questions/613146/computing-the-difference-between-images –

+0

Además, convierta la imagen PIL a numpy array para realizar la manipulación matemática. Numpy está diseñado para manipular grandes matrices de datos numéricos. Esta pregunta muestra el procedimiento: http://stackoverflow.com/questions/384759/pil-and-numpy –

Respuesta

2

Puede echar un vistazo a la biblioteca stsci, está hecho para comparar y analizar imágenes. Debería darte lo que quieres, pero podría ser un poco exagerado.

Si desea mantenerlo simple, primero puede reducir la cantidad de colores y la resolución y luego calcular la distancia.

+0

Bueno, como se vio después, el problema con el cálculo de distancia es que no es realmente bueno encontrar contenido similar en el imágenes, ya que muchos antecedentes son idénticos; Creo que necesito un algoritmo más robusto aquí. –

+1

En ese caso, probablemente necesite un análisis fourier para detectar las líneas en la imagen y comparar las formas. Pero eso es un poco más complicado de hacer. Aunque scipy probablemente podría ayudarte mucho en esa área. – Wolph

5

Salida imgSeek:

imgSeek es una colección de código abierto libre de similitud visual proyectos.La consulta (imagen que está buscando) se puede expresar ya sea como un boceto preliminar pintado por el usuario o como otra imagen que suministro (o una imagen en su colección). El algoritmo de búsqueda hace el uso de la descomposición wavelet multirresolución de las imágenes de consulta y base de datos .

Cuestiones relacionadas